#define MENU_LENGTH 2 sbit LCD_RS at LATD2_bit; sbit LCD_EN at LATD3_bit; sbit LCD_D4 at LATD4_bit; sbit LCD_D5 at LATD5_bit; sbit LCD_D6 at LATD6_bit; sbit LCD_D7 at LATD7_bit; sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit; sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit; char* menu[MENU_LENGTH] = {"KALIBRACIJA", "TESTIRANJE"} ; int current_menu_item; int states[16]; float kalibraciona_konstanta = 1; int button_released(int, unsigned int *, unsigned int); void display_menu_item(int); void display_next_menu_item(); void display_prev_menu_item(); void run_function(); void Lcd_Read(char *); int Lcd_Read_Int(char *); void kalibracija(); void testiranje(); int StrToInt(char*); int ADC_read_custom(); void strip_blanks(char *, char *); void main() { Lcd_Init(); TRISE |= 0b0000000001110000; TRISF |= 0b0000000011110000; TRISG |= 0b0111000000000111; TRISBbits.TRISB1 = 1; AD1PCFGbits.PCFG1 = 0; //pin RB1 definisan kao analogni ulaz AD1CON3bits.ADRC = 0; //sistemski takt AD1CON3bits.ADCS = 0b00000011; //ADCS=3 - fosc/8 AD1CON1bits.SSRC = 0b000; //strat konverzije - manuelno AD1CON1bits.ASAM = 0; //start odabiranja - manuelno AD1CHSbits.CH0SA3 = 0; AD1CHSbits.CH0SA2 = 0; AD1CHSbits.CH0SA1 = 0; AD1CHSbits.CH0SA0 = 1; //prvi kanal - pin RB1 AD1CON1bits.ADON = 1; //ADC on display_menu_item(0); do { if(button_released(12, &PORTG, 12)) display_prev_menu_item(); if(button_released(13, &PORTG, 13)) display_next_menu_item(); if(button_released(14, &PORTG, 14)) run_function(); }while(1); } void run_function() { switch(current_menu_item) { case 0: kalibracija(); break; case 1: testiranje(); break; } } /*------------- KALIBRACIJA -------------*/ void kalibracija() { char s[17]; int voltage; int d; //digitalni ekvivalent referentnog napona voltage = Lcd_Read_Int("Unesi Vref [mV]:"); Lcd_Cmd(_Lcd_Clear); Lcd_Cmd(_Lcd_First_Row); Lcd_Out(1,1,"kalibracija"); Lcd_Out(2,1,"u toku..."); Lcd_Cmd(_Lcd_Cursor_Off); delay_ms(1000); d = ADC_read_custom(); kalibraciona_konstanta = (voltage/1000.0) / d; Lcd_Cmd(_Lcd_Clear); Lcd_Cmd(_Lcd_First_Row); FloatToStr(kalibraciona_konstanta, s); Lcd_Out(1, 1, "konstanta:"); Lcd_Out(2, 1, s); Lcd_Cmd(_Lcd_Cursor_Off); delay_ms(1000); } int ADC_read_custom() { AD1CON1bits.SAMP = 1; // start odabiranja Delay_ms(100); // odabira ... AD1CON1bits.SAMP = 0; // Clear SAMP bit,start konverzije while(AD1CON1bits.DONE == 0); // ceka kraj konverzije return ADC1BUF0; // vrati rezultat konverzije } /*------------- testiranje --------------------*/ void testiranje() { float V; //mjereni napon [V] char s[7]; char buf[16] = ""; char line1[16]; Lcd_Cmd(_Lcd_Clear); Lcd_Cmd(_Lcd_Cursor_Off); Lcd_Out(1,1,"Napon [V]:"); while(1) { V = kalibraciona_konstanta * ADC_read_custom(); FloatToStr(V,buf); //sprintf(s,"%.4f",V); Lcd_Out(2,1," "); Lcd_Out(2, 1, buf); } } /*------------- korisne funkcije --------------*/ void strip_blanks(char *in, char *out) { int i,j; int len=0; len = strlen(in); for(j=0,i=0; i 0) display_menu_item(current_menu_item-1); else display_menu_item(MENU_LENGTH-1); }