#include <LiquidCrystal.h> // kniznica pre LCD
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); // zapojenie LCD
volatile bool boloPD2 = false; //zaciatok tlacidla v pd2 je false, nestlacene
volatile bool boloPD3 = false; //zaciatok tlacidla v pd3 je false, nestlacene
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // inicializovanie dipleja
// Nastavenie ADC
ADMUX |= (1 << REFS0); // referencna hodnota (5V)
ADCSRA |= (1 << ADEN); // povolenie ADC
ADCSRA |= (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2); // prescaler 128
// Nastavenie PD2 a PD3 ako vstupy s pull-up
DDRD &= ~(1 << 2);
DDRD &= ~(1 << 3);
PORTD |= (1 << 2);
PORTD |= (1 << 3);
PCICR |= (1 << PCIE2); // povolenie preruseni pre PCINT2
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); // povolenie prerusenia pre piny PCINT18 a PCINT19
SREG |= 1<<7;//globalne sa povolia prerusenia na pinoch 1 az 7
}
void loop() {
// hlavny program nerobi nic, len prerusenia
}
ISR(PCINT2_vect) {
bool terazPD2 = PIND & (1 << 2); //zistenie stavu tlacidla a zapise sa to do premennej terazPD2
bool terazPD3 = PIND & (1 << 3);//zistenie stavu tlacidla a zapise sa to do premennej terazPD3
if (terazPD3 && !boloPD3) { // stlacenie tlacidla PD3
ADCSRA |= (1 << ADSC); // start konverzie
while (ADCSRA & (1 << ADSC)); // cakanie na dokoncenie konverzie
int a = ADCL;
a |= (ADCH<<8); // nacitanie hodnoty ked je register zarovnany zlava
lcd.clear();
lcd.print("PD3 ADC: ");
lcd.print(a); // zobrazenie hodnoty na displeji
}
if (terazPD2 && !boloPD2) { // stlacenie tlacidla PD2
lcd.clear(); // vymaza co je na displeji predtym ako zobrazi PD2
lcd.print("PD2ADC: nemeriam");
}
// Aktualizacia stavov
boloPD2 = terazPD2;
boloPD3 = terazPD3;
}