///////////////////////////////////////////////////////////////////////// //// Ferienprogramm Lötstation 2008 //// ///////////////////////////////////////////////////////////////////////// #include <18F4520.h> #device ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #include #include //------------------------------------------------------------------------------------ #define BUZ PIN_A5 #define KEY1 PIN_B0 #define KEY2 PIN_B1 #define KEY3 PIN_B2 #define KEY4 PIN_B3 #define BASE1 10.2 #define BASE2 57.0 #define BASE3 15.5 //------------------------------------------------------------------------------------ #byte UCFG = 0xF6F // SFR UCFG definieren, Adresse laut DB void gotoxy(int x, int y); void clr_lcd(void); int16 ADC_READ(int i); int16 x_read(int i,int no); // Read AD_Channel with Oversampling void standard_settings(void); void save_settings(void); void read_settings(void); unsigned int d_us=0; unsigned int motor=0; unsigned long multi1=1000; unsigned long multi2=1000; unsigned long multi3=1000; //------------------------------------------------------------------------------------ void main(void) { unsigned int pwm=1; unsigned int pwm_val=1; unsigned int pwm_old=0; unsigned int menu=0; unsigned long ADC1V=0; unsigned long ADC2V=0; unsigned long ADC3V=0; setup_adc_ports(AN0_TO_AN1 | VSS_VDD); // AD INIT setup_adc(ADC_CLOCK_INTERNAL); lcd_init(); clr_lcd(); read_settings(); standard_settings(); if(!input(KEY1)) { while(input(KEY4)) { gotoxy(1,1); printf(lcd_putc,"Multi1: %4lu",multi1); if(!input(KEY2)) { ++multi1; delay_ms(50); } if(!input(KEY3)) { --multi1; delay_ms(50); } } while(!input(KEY4)); while(input(KEY4)) { gotoxy(1,1); printf(lcd_putc,"Multi2: %4lu",multi2); if(!input(KEY2)) { ++multi2; delay_ms(50); } if(!input(KEY3)) { --multi2; delay_ms(50); } } while(!input(KEY4)); while(input(KEY4)) { gotoxy(1,1); printf(lcd_putc,"Multi3: %4lu",multi3); if(!input(KEY2)) { ++multi3; delay_ms(50); } if(!input(KEY3)) { --multi3; delay_ms(50); } } save_settings(); while(!input(KEY4)); } gotoxy(1,1); printf(lcd_putc,"DARC OV-AMBERG U01 DG6RB"); gotoxy(1,2); printf(lcd_putc," Ferienprogramm 2008"); delay_ms(3000); clr_lcd(); // setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // setup interrupts setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_4,100,1); enable_interrupts(INT_TIMER1); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); for(;;) { if(!input(KEY1)) { pwm+=1; delay_ms(20); } if(!input(KEY2)) { pwm-=1; delay_ms(20); } if(!input(KEY3)) { if(motor==1) motor=0; else motor=1; while(!input(KEY3)); } if(!input(KEY4)) { pwm_old=0; ++menu; if(menu>4) menu=0; while(!input(KEY4)); clr_lcd(); } if(pwm<1) pwm=1; if(pwm>100) pwm=100; pwm_val=pwm; d_us=100-pwm; if(menu==0) { if(pwm_old != pwm_val) { pwm_old=pwm_val; gotoxy(1,1); printf(lcd_putc,"Temperatur "); gotoxy(1,2); printf(lcd_putc,"LO HI"); gotoxy(4,2); printf(lcd_putc,"__________"); if(pwm_val>= 1 && pwm_val<10) { gotoxy( 4,2); printf(lcd_putc,"%c"255); } if(pwm_val>=10 && pwm_val<20) { gotoxy( 5,2); printf(lcd_putc,"%c"255); } if(pwm_val>=20 && pwm_val<30) { gotoxy( 6,2); printf(lcd_putc,"%c"255); } if(pwm_val>=30 && pwm_val<40) { gotoxy( 7,2); printf(lcd_putc,"%c"255); } if(pwm_val>=40 && pwm_val<50) { gotoxy( 8,2); printf(lcd_putc,"%c"255); } if(pwm_val>=50 && pwm_val<60) { gotoxy( 9,2); printf(lcd_putc,"%c"255); } if(pwm_val>=60 && pwm_val<70) { gotoxy(10,2); printf(lcd_putc,"%c"255); } if(pwm_val>=70 && pwm_val<80) { gotoxy(11,2); printf(lcd_putc,"%c"255); } if(pwm_val>=80 && pwm_val<90) { gotoxy(12,2); printf(lcd_putc,"%c"255); } if(pwm_val>=90 && pwm_val<=100){ gotoxy(13,2); printf(lcd_putc,"%c"255); } } } if(menu==1) { motor=0; gotoxy(1,1); printf(lcd_putc,"ADC 1 - SIGNAL"); gotoxy(1,2); printf(lcd_putc,"Volt:"); delay_ms(20); ADC1V=x_read(0,50); if(ADC1V>1020) { gotoxy(8,2); printf(lcd_putc,"!OVL!"); } else { gotoxy(8,2); printf(lcd_putc,"%5.2g",((ADC1V*BASE1)/1023.0)*multi1/1000); } } if(menu==2) { motor=0; gotoxy(1,1); printf(lcd_putc,"ADC 2 - SIGNAL"); gotoxy(1,2); printf(lcd_putc,"Volt:"); delay_ms(20); ADC2V=x_read(1,50); if(ADC2V>1020) { gotoxy(8,2); printf(lcd_putc,"!OVL!"); } else { gotoxy(8,2); printf(lcd_putc,"%5.2g",((ADC2V*BASE2)/1023.0)*multi2/1000); } } if(menu==3) { motor=0; gotoxy(1,1); printf(lcd_putc,"ADC 3 - DC-IN"); gotoxy(1,2); printf(lcd_putc,"Volt:"); gotoxy(8,2); ADC3V=x_read(2,50); printf(lcd_putc,"%4.2g",((ADC3V*BASE3)/1023.0)*multi3/1000); } if(menu==4) { motor=0; //123456789012345678901234 gotoxy(1,1); printf(lcd_putc," ADC-1 ADC-2 DC-IN"); ADC1V=x_read(0,50); gotoxy( 3,2); printf(lcd_putc,"%5.2g",((ADC1V*BASE1)/1023.0)*multi1/1000); ADC2V=x_read(1,50); gotoxy(11,2); printf(lcd_putc,"%5.2g",((ADC2V*BASE2)/1023.0)*multi2/1000); ; ADC3V=x_read(2,50); gotoxy(20,2); printf(lcd_putc,"%5.2g",((ADC3V*BASE3)/1023.0)*multi3/1000); } if(motor==0) { output_low(BUZ); // Motor aus if(menu==0) { gotoxy(12,1); printf(lcd_putc," OFF"); } } else { if(menu==0) { gotoxy(12,1); printf(lcd_putc,"%3u %%",pwm_val); } } } } //------------------------------------------------------------------------------------- // LCD-Routines void gotoxy(int x, int y) // Set Cursor to Position { if(y==1) { x+=0; y=1; } if(y==3) { x+=16; y=1; } if(y==2) { x+=0; y=2; } if(y==4) { x+=16; y=2; } lcd_gotoxy(x,y); } void clr_lcd(void) // Clear LCD { gotoxy(1,1); lcd_putc(" "); gotoxy(1,2); lcd_putc(" "); } //------------------------------------------------------------------------------------- int16 ADC_READ(int i) // READ AD_CHANNELS { output_low(BUZ); // Motor aus set_adc_channel(i); // delay_us(1); // get analog Values return(read_adc()); } //--------------------------------------------------------------------- int16 x_read(int i,int no) // Read AD_Channel with Oversampling { unsigned long x=0; unsigned long lauf=0; for(lauf=1;lauf<=no;++lauf) { delay_ms(3); x+=ADC_READ(i); } return(x/no); } //--------------------------------------------------------------------- #INT_TIMER1 void call_function(void) { // output_toggle(BUZ); } //---------------------------------------------------------------------------------------------- #int_TIMER2 TIMER2_isr() { if(motor==0) { output_low(BUZ); return; } if(motor==1) { if(d_us > 1) { output_low(BUZ); } delay_us((d_us-1)*2); output_high(BUZ); } else output_low(BUZ); } //---------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------- void save_settings(void) { unsigned int posi=0; unsigned int val_high=0; unsigned int val_low=0; val_low=multi1&255; val_high=(multi1 >> 8)&255; // Kalibrierwert ADC1 write_eeprom(posi,val_high); ++posi; write_eeprom(posi,val_low); ++posi; val_low=multi2&255; val_high=(multi2 >> 8)&255; // Kalibrierwert ADC2 write_eeprom(posi,val_high); ++posi; write_eeprom(posi,val_low); ++posi; val_low=multi3&255; val_high=(multi3 >> 8)&255; // Kalibrierwert ADC3 write_eeprom(posi,val_high); ++posi; write_eeprom(posi,val_low); ++posi; } //---------------------------------------------------------------------------------------------- void read_settings(void) { unsigned int posi=0; multi1=read_eeprom(posi); multi1<<=8; ++posi; multi1|=read_eeprom(posi); ++posi; multi2=read_eeprom(posi); multi2<<=8; ++posi; multi2|=read_eeprom(posi); ++posi; multi3=read_eeprom(posi); multi3<<=8; ++posi; multi3|=read_eeprom(posi); ++posi; } //---------------------------------------------------------------------------------------------- void standard_settings(void) { if (multi1 > 2000) multi1=1000; if (multi2 > 2000) multi2=1000; if (multi3 > 2000) multi3=1000; if (multi1 < 200) multi1=1000; if (multi2 < 200) multi2=1000; if (multi3 < 200) multi3=1000; } //----------------------------------------------------------------------------------------------