#include #include #include #include "lcd_h.h" #include #include #include "DA_prevodnik.h" #include "i2cmaster.h" #define ADC_PROUD 0x09 //Výběr referenčního vstupu pro A/D převodník #define ADC_NAPETI 0x02 char buffer_napeti_mer[20]; int napeti_poz=0,proud_poz=0; unsigned int napeti_mer,proud_mer,napeti_display; int main( void ) { float napeti_uprava; int jednotky,desitky; DDRE=0b00000000; lcd_init(); lcd_clrscr(); i2c_init(); sei(); ADMUX = ADC_NAPETI; ADCSRA = 0xef; EICRB=0b11001100; EIMSK=0b10100000; DA_prevod(napeti_poz); while (1) { /*------------------------------------- ZOBRAZENI NAPETI -------------------------------*/ DA_prevod(napeti_poz); napeti_uprava = 4.95/ 1024; //Konstanta pro převod A/D převodníku napeti_uprava = napeti_uprava * napeti_mer; //Vynasobená konstanta se změřenou hodnoutou z registru ADCW napeti_display= napeti_uprava*610; jednotky = napeti_display/100; //Převod na celé číslo pro zobrazení napětí na LCD desitky = napeti_display%100; //Převod na desetinné číslo pro zobrazení na LCD desitky = desitky/10; //Převod na desetinné číslo pro zobrazení na LCD lcd_gotoxy(0,0); sprintf(buffer_napeti_mer,"Vyst. napeti:%02d.%01dV",jednotky,desitky); lcd_puts(buffer_napeti_mer); } } /*------------- Meřeni napětí a proudu pomocí vnitřního AD převodníku ------------------*/ ISR (ADC_vect) //přerušení od vnitřního A/D převodníku { ADCSRA=0x6f; if (ADMUX==ADC_NAPETI) { napeti_mer=ADCW; ADMUX=ADC_PROUD; } else { proud_mer=ADCW; ADMUX=ADC_NAPETI; } ADCSRA = 0xef; } /*----------------------- IR_čidlo na nastavení výstupního napětí ----------------------*/ ISR (INT7_vect) //přerušení od inkementální čidla "Napětí" { _delay_ms(5); if (bit_is_set(PINE,7)) { if(bit_is_clear(PINE,2)) { napeti_poz+=10; if (napeti_poz>3000) { napeti_poz=3000; } } else { napeti_poz-=10; if (napeti_poz<0) { napeti_poz=0; } } } } /*----------------------- IR_čidlo na nastavení výstupního proudu ----------------------*/ ISR (INT5_vect) //přerušení od inkementální čidla "Proud" { _delay_ms(5); if (bit_is_set(PINE,5)) { if(bit_is_clear(PINE,3)) { proud_poz+=10; if (proud_poz>300) { proud_poz=300; } } else { proud_poz-=10; if (proud_poz<0) { proud_poz=0; } } } }