#include <LiquidCrystal.h>
#define Set1(R,b) R|=(1<<b)
#define Set0(R,b) R&=~(1<<b)
#define Get(R,b) (R&(1<<b))
volatile int vysledok;
volatile int hodnota;
LiquidCrystal lcd(2,3,4,5,6,7);
void setup() {
pin(0);
adc(10,0);
}
void loop() {
Set1(ADCSRA,ADSC); //spustenie konvezrie
while( Get(ADCSRA,ADIF)==0 ); //ADIF sa da do 1, ked sa dokonci konverzia
delay(1); // len vo wokwi
vysledok = ADCL; // načítanie dolného registra
vysledok = vysledok | (ADCH<<8); // pripočítanie horného
hodnota = map(vysledok, 0, 1023, 0, 100);
lcd.setCursor(0,0);
lcd.print(vysledok);
lcd.setCursor(0,1);
lcd.print(hodnota);
}
void pin(byte pin){
if(pin == 0){
Set0(ADMUX,MUX0);
Set0(ADMUX,MUX1);
Set0(ADMUX,MUX2);
Set0(ADMUX,MUX3);
}else if(pin == 1){
Set1(ADMUX,MUX0);
Set0(ADMUX,MUX1);
Set0(ADMUX,MUX2);
Set0(ADMUX,MUX3);
}else if(pin == 2){
Set0(ADMUX,MUX0);
Set1(ADMUX,MUX1);
Set0(ADMUX,MUX2);
Set0(ADMUX,MUX3);
}else if(pin == 3){
Set1(ADMUX,MUX0);
Set1(ADMUX,MUX1);
Set0(ADMUX,MUX2);
Set0(ADMUX,MUX3);
}else if(pin == 4){
Set0(ADMUX,MUX0);
Set0(ADMUX,MUX1);
Set1(ADMUX,MUX2);
Set0(ADMUX,MUX3);
}else if(pin == 5){
Set1(ADMUX,MUX0);
Set0(ADMUX,MUX1);
Set1(ADMUX,MUX2);
Set0(ADMUX,MUX3);
}
}
void adc(byte zarovnanie, byte mod){
Set1(ADCSRA,ADEN); // zapnutie ADC
Set0(ADMUX,REFS1); // voľba Aref - vypnuty - treba pripojit Vcc na Aref
Set0(ADMUX,REFS0);
Set1(ADCSRA,ADPS2); // voľba preddeličky 128, spomalenie
Set1(ADCSRA,ADPS1);
Set1(ADCSRA,ADPS0);
Set1(ADCSRA,ADSC); //spustenie konvezrie
if(mod == 1){
Set1(ADCSRA,ADATE); // automaticky
Set1(ADCSRA,ADIE); // generovanie prerusenia
Set1(SREG,7);
if(zarovnanie = 10){
Set0(ADMUX,ADLAR); // zarovnanie nadol 10bit
vysledok = ADCL; // načítanie dolného registra
vysledok = vysledok | (ADCH<<8); // pripočítanie horného
}else if(zarovnanie = 8){
Set1(ADMUX,ADLAR); // zarovnanie nahor 8bit
vysledok = ADCH; // načítanie len horného
}
// ISR(ADC_vect){}
}else{
Set0(ADCSRA,ADATE); // prikazom
Set0(ADCSRA,ADIE); // negenerovanie prerusenia
if(zarovnanie = 10){
Set0(ADMUX,ADLAR); // zarovnanie nadol 10bit
}else if(zarovnanie = 8){
Set1(ADMUX,ADLAR); // zarovnanie nahor 8bit
while( Get(ADCSRA,ADIF)==0 );
delay(1); // len vo wokwi
vysledok = ADCH; // načítanie len horného
}
}
}