|
 |
 |
 |
 |
|
The AVR Code for the ATMega 16
|
|
|
|
/********************************************************** Datum : 18.12.2004 Author : Harald Brachschoss AVR : ATmega16 / 16 Mhz.
*/
// -------------------------------------------------------------------------------- // Achtung! Um Port C im ATMEGA 16 als I/O benutzen zu // können muss beim Ponyprog. JTAG disabled werden ! // --------------------------------------------------------------------------------
#include <mega16.h> #include <ctype.h> // -------------------------------------------------------------------------------- // Definitionen für die LCD Funktionen setzen, Port A // -------------------------------------------------------------------------------- #asm .equ __lcd_port=0x1b #endasm #include <lcd.h>
// -------------------------------------------------------------------------------- // Definitionen für 1 wire bus funktionen setzen, Port B, Bit 0 = Pin 1 am ATMega16 // -------------------------------------------------------------------------------- #asm .equ __w1_port=0x18 .equ __w1_bit=0 #endasm #include <1wire.h> #include <ds1820.h>
// -------------------------------------------------------------------------------- // Definitionen für den PCF8583 Uhrenchip setzen. Port C // -------------------------------------------------------------------------------- #asm .equ __i2c_port=0x15 .equ __sda_bit=1 .equ __scl_bit=0 #endasm #include <i2c.h> #include <pcf8583.h>
#include <stdlib.h> #include <delay.h> #include <string.h> #include <math.h> #include <stdio.h> // -------------------------------------------------------------------------------- // Definitionen für den DS1820 Tempereturchip setzen // -------------------------------------------------------------------------------- #define MAX_DS1820 2 unsigned char ds1820_devices; unsigned char ds1820_rom_codes[MAX_DS1820, 9]; char strRecBuff[10] ; char strText[15] [21] ; unsigned char time[8] ;
#define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7
#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)
// #define debug// Debug Ausgabe einschalten
// USART Receiver buffer #define RX_BUFFER_SIZE 16 char rx_buffer[RX_BUFFER_SIZE]; unsigned char rx_wr_index,rx_rd_index,rx_counter; // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine #pragma savereg- interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; #asm push r26 push r27 push r30 push r31 in r26,sreg push r26 #endasm status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; #asm pop r26 out sreg,r26 pop r31 pop r30 pop r27 pop r26 #endasm } #pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif
// Declare your global variables here
eeprom unsigned char EEPORTB=0 ;// NOV Speicher für PortB unsigned char SRamPORTB=0 ; char dchar[15] ; char sBin[8]; unsigned char lcdlight=0 ; unsigned char keymode=0 ; unsigned char keycnt=0 ; unsigned char h,m,s,hs ;// Uhrzeitvariablen
// -------------------------------------------------------------------------------- // Anzeigetexte in die variablen laden. (spart speicherplatz) // -------------------------------------------------------------------------------- void ladetexte(void) { strcpyf(strText[1],"Teichpumpe aus "); strcpyf(strText[2],"Teichpumpe an ");
strcpyf(strText[3],"Teichbeleuchtung aus"); strcpyf(strText[4],"Teichbeleuchtung an ");
strcpyf(strText[5],"Gartenbeleucht.1 aus"); strcpyf(strText[6],"Gartenbeleucht.1 an ");
strcpyf(strText[7],"Gartenbeleucht.2 aus"); strcpyf(strText[8],"Gartenbeleucht.2 an ");
strcpyf(strText[9],"Reserve 1 aus "); strcpyf(strText[10],"Reserve 1 an ");
strcpyf(strText[11],"Reserve 2 aus "); strcpyf(strText[12],"Reserve 2 an "); strcpyf(strText[13],"Reserve 3 aus "); strcpyf(strText[14],"Reserve 3 an "); }
// -------------------------------------------------------------------------------- // LCD 2. Zeile löschen // -------------------------------------------------------------------------------- void lcdline1clr(void) { lcd_gotoxy(0,1) ; lcd_putsf(" "); }
// -------------------------------------------------------------------------------- // LCD 1. Zeile löschen // -------------------------------------------------------------------------------- void lcdline0clr(void) { lcd_gotoxy(0,0) ; lcd_putsf(" "); }
// -------------------------------------------------------------------------------- // Setzen oder Rücksetzen des übergebenen Bits 0=nur einlesen und setzen des Anzeigearrays // -------------------------------------------------------------------------------- void togglebit(unsigned char BitNo) { #ifdef debug sprintf(dchar,"%-u - ",BitNo) ; lcd_gotoxy(12,1) ; lcd_puts(dchar) ; #endif if ( BitNo > 0 )// nicht für Bit 0 ausführen. switch (BitNo) { case 1: if ( PINB.1 == 1 ) PORTB.1 = 0 ; else PORTB.1 =1 ; break ; case 2: if ( PINB.2 == 1 ) PORTB.2 = 0 ; else PORTB.2 =1 ; break ;
case 3: if ( PINB.3 == 1 ) PORTB.3 = 0 ; else PORTB.3 =1 ; break ;
case 4: if ( PINB.4 == 1 ) PORTB.4 = 0 ; else PORTB.4 =1 ; break ;
case 5: if ( PINB.5 == 1 ) PORTB.5 = 0 ; else PORTB.5 =1 ; break ;
case 6: if ( PINB.6 == 1 ) PORTB.6 = 0 ; else PORTB.6 =1 ; break ;
case 7: if ( PINB.7 == 1 ) PORTB.7 = 0 ; else PORTB.7 =1 ; }
sBin[7] = ' ' ;// Anzeige updaten if ( PINB.1 == 1 ) sBin[6] = '1' ; else sBin[6] = '0' ;
if ( PINB.2 == 1 ) sBin[5] = '1' ; else sBin[5] = '0' ;
if ( PINB.3 == 1 ) sBin[4] = '1' ; else sBin[4] = '0' ;
if ( PINB.4 == 1 ) sBin[3] = '1' ; else sBin[3] = '0' ;
if ( PINB.5 == 1 ) sBin[2] = '1' ; else sBin[2] = '0' ;
if ( PINB.6 == 1 ) sBin[1] = '1' ; else sBin[1] = '0' ;
if ( PINB.7 == 1 ) sBin[0] = '1' ; else sBin[0] = '0' ; SRamPORTB = PINB ; SRamPORTB = PINB - 1; // Nochmal einlesen, da bei Bit 7 es bei einmaligem lesen nicht funktioniert ! if ( BitNo > 0 ) // EEprom nur schreiben wenn sich etwas geändert hat. EEPORTB=SRamPORTB; #ifdef debug sprintf(dchar," %u",SRamPORTB) ; lcd_puts(dchar) ; #endif lcd_gotoxy(12,1) ; lcd_puts(sBin) ; printf("<ST%s>\n\r",sBin) ; }
// -------------------------------------------------------------------------------- // Portstatus der einzelnen Ausgänge anzeigen. wird ca. alle 65 sek. aufgerufen. // -------------------------------------------------------------------------------- void showinfo(void) { lcd_clear() ; lcd_gotoxy(0,0); // 12345678901234567890 lcd_putsf("AT-Mega WLan Control"); lcd_gotoxy(0,1); lcd_putsf(" Harald Brachschoss "); delay_ms(2000) ;
lcdline0clr() ; lcd_gotoxy(0,0); lcd_putsf("I/O Status: ");
lcd_gotoxy(0,1); if ( PINB.1 == 0 ) lcd_puts(strText[1]); else lcd_puts(strText[2]); if ( rx_counter != 0 ) return ; delay_ms(2000) ;
lcd_gotoxy(0,1); if ( PINB.2 == 0 ) lcd_puts(strText[3]); else lcd_puts(strText[4]); if ( rx_counter != 0 ) return; delay_ms(2000) ;
lcd_gotoxy(0,1); if ( PINB.3 == 0 ) lcd_puts(strText[5]); else lcd_puts(strText[6]); if ( rx_counter != 0 ) return ; delay_ms(2000) ;
lcd_gotoxy(0,1); if ( PINB.4 == 0 ) lcd_puts(strText[7]); else lcd_puts(strText[8]); if ( rx_counter != 0 ) return ; delay_ms(2000) ;
lcd_gotoxy(0,1); if ( PINB.5 == 0 ) lcd_puts(strText[9]); else lcd_puts(strText[10]); if ( rx_counter != 0 ) return ; delay_ms(1000) ;
lcd_gotoxy(0,1); if ( PINB.6 == 0 ) lcd_puts(strText[11]); else lcd_puts(strText[12]); if ( rx_counter != 0 ) return ; delay_ms(1000) ; lcd_gotoxy(0,1); if ( PINB.7 == 0 ) lcd_puts(strText[13]); else lcd_puts(strText[14]); if ( rx_counter != 0 ) return ; delay_ms(1000) ; lcd_gotoxy(0,0); lcd_putsf("AT-Mega WLan Control"); lcdline1clr(); togglebit(0) ;
}
// -------------------------------------------------------------------------------- // Portstatus des angesprochenen Ports, beim setzen oder rücksetzen anzeigen // -------------------------------------------------------------------------------- void showinfoline(int info) { lcdline1clr() ; lcd_gotoxy(0,1); // 12345678901234567890
switch (info) { case 1: if ( PINB.1 == 0 ) lcd_puts(strText[1]); else lcd_puts(strText[2]); break ;
case 2:if ( PINB.2 == 0 ) lcd_puts(strText[3]); else lcd_puts(strText[4]); break ; case 3: if ( PINB.3 == 0 ) lcd_puts(strText[5]); else lcd_puts(strText[6]); break ;
case 4: if ( PINB.4 == 0 ) lcd_puts(strText[7]); else lcd_puts(strText[8]); break ; case 5: if ( PINB.5 == 0 ) lcd_puts(strText[9]); else lcd_puts(strText[10]); break ; case 6: if ( PINB.6 == 0 ) lcd_puts(strText[11]); else lcd_puts(strText[12]); break ; case 7: if ( PINB.7 == 0 ) lcd_puts(strText[13]); else lcd_puts(strText[14]); }
if ( keymode == 0 ) { delay_ms(2000) ;
lcdline1clr(); togglebit(0) ; }
} // -------------------------------------------------------------------------------- // LcdLightOFF Displaybeleuchung ausschalten oder abdimmen // -------------------------------------------------------------------------------- void lcdlightoff(unsigned char status) { if ( status == 1 ) { lcdlight=0 ; OCR1A=lcdlight ; } else while (lcdlight > 0 )// Display Beleuchtung aufdimmen { lcdlight = lcdlight-5 ; delay_ms(50); if (lcdlight != 0 ) OCR1A=lcdlight ; }
}
// -------------------------------------------------------------------------------- // LcdLightOn Displaybeleuchtung einschalten oder aufdimmen // -------------------------------------------------------------------------------- void lcdlighton(unsigned char status) { if ( status == 1 ) { lcdlight=245 ; OCR1A=lcdlight; } else for (lcdlight=0; lcdlight<245;)// Display Beleuchtung aufdimmen { OCR1A=lcdlight ; lcdlight = lcdlight+5 ; delay_ms(50); } }
// -------------------------------------------------------------------------------- // Uhrzeitanzeige im Eingabemodus // -------------------------------------------------------------------------------- void UhrzeitAnzeige(void) { while ( PIND.2==1 ) {} ; lcdline1clr() ; while ( PIND.2==0 ) { if ( rx_counter !=0 ) break ; lcd_gotoxy(0,1) ; lcd_putsf("Uhrzeit: "); rtc_get_time(0,&h,&m,&s,&hs);// Uhrzeit einlesen sprintf(time,"%02d:%02d:%02d",h,m,s); // Uhrzeit im string "time" formatieren HH:MM:SS lcd_gotoxy(12,1) ; lcd_puts(time); if ( PIND.2 == 1 ) break ; delay_ms(250) ; if ( PIND.2 == 1 ) break ; } lcdline1clr() ; lcd_gotoxy(0,1) ; lcd_putsf("Zeitanzeige beendet."); while ( PIND.2==1 ) {} ;
}
|
|
 |
 |
|
continuing code:
// ----------------------------------------------------------------- --------------- // External Interrupt 0 service routine // ----------------------------------------------------------------- --------------- interrupt [EXT_INT0] void ext_int0_isr(void) { int i=0 ; int nextline=0 ; int keytimeout=0 ; keymode=0 ; keycnt=0 ;
delay_ms(100) ; if ( PIND.2 == 1 ) { while ( PIND.2 == 1 ) {}; // warten bis Taste wieder losgelassen wird keymode=1 ; }
if ( keymode == 1 ) { lcdlighton(1) ; lcdline0clr() ; lcd_gotoxy(0,0); lcd_putsf("Eingabemodus: "); lcd_gotoxy(0,1); lcd_putsf("Taste kurz=blaettern"); while ( PIND.2 == 0 ) { if ( keytimeout > 1000 ) // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen. { keycnt=0 ; keymode=0 ; break ; } keytimeout++ ; delay_ms(10) ; } ; while ( PIND.2 == 1 ) { if ( keytimeout > 1000 ) // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen. { keycnt=0 ; keymode=0 ; break ; } keytimeout++ ; delay_ms(10) ; } ; lcd_gotoxy(0,1); lcd_putsf("Taste lang=Auswahl "); while ( PIND.2 == 0 ) { if ( keytimeout > 1000 ) // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen. { keycnt=0 ; keymode=0 ; break ; } keytimeout++ ; delay_ms(10) ; } ; } while (keymode == 1 ) { if ( PIND.2 == 1 ) { while ( (i < 25 ) & (PIND.2 == 1 ) ) // ca. 2 Sek. { delay_ms(50) ; i++ ;
} if ( i <= 10 ) { keycnt++ ; nextline = 1 ; i = 0 ; keytimeout=0 ; }
if ( i >= 20 ) { i = 0 ; switch ( keycnt ) { case 1: togglebit(1) ; showinfoline(1); break ; case 2: togglebit(2) ; showinfoline(2); break ; case 3: togglebit(3) ; showinfoline(3); break ; case 4: togglebit(4) ; showinfoline(4); break ; case 5: togglebit(5) ; showinfoline(5); break ; case 6: togglebit(6) ; showinfoline(6); break ; case 7: togglebit(7) ; showinfoline(7); break ; case 8: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Zeige Uhrzeit.");UhrzeitAnzeige(); break ; case 9: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Eingabe beendet."); } keycnt = 0 ; keymode=0 ; keytimeout=0 ; while ( PIND.2 == 1 ) {} ;// warten bis Taste ganz sicher wieder freigegeben wurde }
} if ( nextline == 1 ) { switch ( keycnt ) { case 1:showinfoline(keycnt) ; break ; case 2: showinfoline(keycnt) ; break ; case 3: showinfoline(keycnt) ; break ; case 4: showinfoline(keycnt) ; break ; case 5: showinfoline(keycnt) ; break ; case 6: showinfoline(keycnt) ; break ; case 7: showinfoline(keycnt) ; break ; case 8:lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Uhrzeit Anzeige ?"); break ; case 9: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Eingabe verlassen ?"); } nextline=0 ; keytimeout=0 ; } if ( keycnt > 8 ) keycnt = 0 ;
if ( keytimeout > 500 ) // 12,5 Sek. keine Taste gedrückt - > Eingabemodus verlassen. { keycnt=0 ; keymode=0 ; } keytimeout++ ; delay_ms(25) ; }
lcd_clear() ; lcd_gotoxy(0,0); lcd_putsf("AT-Mega WLan Control");
togglebit(0) ; #asm("cli") #asm("sei")// Interrupts wieder zulassen }
// ----------------------------------------------------------------- --------------- // ShowClock() Uhrzeit ausgeben ( für ca. 5 Sek. ) // ----------------------------------------------------------------- --------------- void showclock(void) { int clkcnt=0 ; while ( clkcnt <= 10 ) { if ( rx_counter != 0 ) break ; rtc_get_time(0,&h,&m,&s,&hs);// Uhrzeit einlesen sprintf(time,"%02d:%02d:%02d",h,m,s); // Uhrzeit im string "time" formatieren HH:MM:SS lcd_gotoxy(12,1) ; lcd_puts(time); delay_ms(500) ; clkcnt++ ; }
}
void rxempty(void) { unsigned char serchar ; while ( rx_counter !=0 ) serchar= getchar(); }
// ----------------------------------------------------------------- --------------- // SetClock() Uhrzeit vom PC aus setzen // ----------------------------------------------------------------- --------------- void setclock(void) { unsigned char sdatacnt=0 ; unsigned char sdtime[20] ; unsigned int v1,v2,v3,v4,v5 ;
delay_ms(500) ;
while ( rx_counter != 0 ) { sdtime[sdatacnt] = getchar() ; sdatacnt++ ; } v1 = toascii(sdtime[0]) ; v2 = toascii(sdtime[1]) ; v1 = v1 - 48 ; v2 = v2 - 48 ; v3 = v1*10 ; v3 = v3 + v2 ;
v1 = toascii(sdtime[2]) ; v2 = toascii(sdtime[3]) ; v1 = v1 - 48 ; v2 = v2 - 48 ; v4 = v1*10 ; v4 = v4 + v2 ;
v1 = toascii(sdtime[4]) ; v2 = toascii(sdtime[5]) ; v1 = v1 - 48 ; v2 = v2 - 48 ; v5 = v1*10 ; v5 = v5 + v2 ;
rtc_set_time(0,v3,v4,v5,0); // Zeit kann dezimal z.B. 22 oder hex z.B. 0x16 angegeben werden. lcdline1clr(); lcd_gotoxy(0,1); //sprintf(dtime,"%02d:%02d:%02d - %s",hh,mm,ss,sdtime) ; // lcd_puts(dtime) ; lcd_putsf("Zeit gesetzt."); delay_ms(2000) ; }
// ----------------------------------------------------------------- --------------- // Main // ----------------------------------------------------------------- --------------- void main(void) { int temp ; int result ; int i ; int cnt=0 ; int infocnt=0, infocnt2=0 ;
double tcnt, tres, tfloat ;
// Input/Output Ports initialization // Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T // PORTB=0xFE; PORTB=0x00; DDRB=0xFE; // Port C initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0xFF;
// Port D initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=Out Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=0 State6=T State7=T PORTD=0x04;// Bit 2 = Input DDRD=0x20; // Bit 5=PWM output
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x81; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: Off // INT2: Off GICR|=0x40; MCUCR=0x03; MCUCSR=0x00; GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x67;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; ladetexte() ;
// ----------------------------------------------------------------- --------------- // I2C Bus initialisieren // ----------------------------------------------------------------- --------------- i2c_init() ; delay_ms(100) ;
// ----------------------------------------------------------------- --------------- // Uhr initialisieren und Uhrzeit setzen // ----------------------------------------------------------------- --------------- rtc_init(0,0) ; delay_ms(100) ; // rtc_set_time(0,19,16,0,0); // Zeit kann dezimal z.B. 22 oder hex z.B. 0x16 angegeben werden. // ----------------------------------------------------------------- --------------- // Uhrzeit einlesen // ----------------------------------------------------------------- --------------- delay_ms(100) ; rtc_get_time(0,&h,&m,&s,&hs);
// ----------------------------------------------------------------- --------------- // LCD initialisieren // ----------------------------------------------------------------- --------------- result = lcd_init(20); delay_ms(100) ; lcd_clear() ; delay_ms(150) ;
// ----------------------------------------------------------------- --------------- // Hintergrndbeleuchtung einschalten // ----------------------------------------------------------------- --------------- lcdlighton(0) ;
// ----------------------------------------------------------------- --------------- // Einschaltmeldung ausgeben // ----------------------------------------------------------------- --------------- lcd_gotoxy(0,0); // 12345678901234567890 lcd_putsf("AT-Mega WLan Control"); lcd_gotoxy(0,1); lcd_putsf(" Harald Brachschoss "); delay_ms(2000) ; // ----------------------------------------------------------------- --------------- // Wieviele DS1820 sind am 1Wire Bus angeschlossen ? // ----------------------------------------------------------------- --------------- result = w1_init() ; if (result > 0 ) printf("Sensoren sind am Bus angeschlossen.\n\r") ; ds1820_devices=w1_search(0xf0,ds1820_rom_codes); printf("%-u Sensor(en) gefunden\n\r",ds1820_devices) ; // ----------------------------------------------------------------- --------------- // EEprom auslesen und den Ausgangport wiederherstellen (retentive) // ----------------------------------------------------------------- --------------- if ( EEPORTB == 255 ) EEPORTB = 0 ; if ( EEPORTB != 0 ) SRamPORTB = EEPORTB ; else SRamPORTB = 0 ;
PORTB = SRamPORTB ;// Port gemäss EEprom setzten
lcdline1clr() ; togglebit(0) ;
// Global enable interrupts #asm("sei")
while(1) { if ( lcdlight < 10 ) lcdlighton(0) ; while ( rx_counter == 0 ) // Ausgabe der Temperatur auf dem LCD, solange bis Kommandos über RS232 kommen. { if ( infocnt >= 50 ) { showinfo() ; lcd_gotoxy(0,0); lcd_putsf("AT-Mega WLan Control"); infocnt = 0 ; lcdlightoff(0) ; }
if ( infocnt2 >= 10 ) { showclock() ; infocnt2 = 0 ; togglebit(0); }
infocnt2++ ; infocnt++ ; for ( i=0; i < ds1820_devices;)// Temperaturanzeige auf dem LCD ausgeben solange kein Kommando über RS232 kommt { temp=ds1820_temperature_10(&ds1820_rom_codes[i][0]);// Temperatur einlesen. tcnt = __ds1820_scratch_pad.cnt_c ; tres = __ds1820_scratch_pad.cnt_rem ; tfloat = temp - 0.25 + ((tcnt - tres) / tcnt) ; // hires Umrechnung sprintf(dchar,"T%-u:%6.2f\xdfC",++i,tfloat/10) ; lcd_gotoxy(0,1) ; lcd_puts(dchar) ; for (cnt=0; cnt<20; cnt++) // ca. 1 Sekunde Anzeigedauer. { delay_ms(50) ; if ( rx_counter > 0 )// Sobald ein Kommando empfangen wird -> raus. break ; } } } strRecBuff[0] = getchar() ; // 1. Zeichen abholen
if ( strRecBuff[0] == '1' )// 0x31 { // rxempty() ; temp=ds1820_temperature_10(&ds1820_rom_codes[0][0]);// Temperatur 1 einlesen. tcnt = __ds1820_scratch_pad.cnt_c ; tres = __ds1820_scratch_pad.cnt_rem ; tfloat = temp - 0.25 + ((tcnt - tres) / tcnt) ; // hires Umrechnung printf("<t1=%6.2f>\n\r",tfloat/10 ) ; // Ausgabe: t1=[-]nn.nn sprintf(dchar,"t1:%6.2f",tfloat/10) ; infocnt=0 ; delay_ms(500) ; }; if ( strRecBuff[0] == '2' ) // 0x32 { // rxempty() ; temp=ds1820_temperature_10(&ds1820_rom_codes[1][0]);// Temperatur 2 einlesen. tcnt = __ds1820_scratch_pad.cnt_c ; tres = __ds1820_scratch_pad.cnt_rem ; tfloat = temp - 0.25 + ((tcnt - tres) / tcnt) ; // hires Umrechnung printf("<t2=%6.2f>\n\r",tfloat/10 ) ; // Ausgabe: t2=[-]nn.nn infocnt=0 ; delay_ms(500) ; }; if ( strRecBuff[0] == '3' ) // 0x33 { // rxempty() ; rtc_get_time(0,&h,&m,&s,&hs);// Uhrzeit einlesen sprintf(time,"%02d:%02d:%02d",h,m,s); // Uhrzeit im string "time" formatieren HH:MM:SS printf("<t3 %s>\n\r",time ) ; // Ausgabe: t3 nn:nn:nn infocnt=0 ; delay_ms(500) ; };
if ( strRecBuff[0] == 'S' ) { infocnt=0 ; lcdlighton(1) ; strRecBuff[1] = getchar() ; // 2. zeichen abholen #ifdef debug lcd_gotoxy(0,0); sprintf(dchar,"%-c",strRecBuff) ; lcd_puts(dchar) ; #endif switch ( strRecBuff[1] ) { case '0': togglebit(0) ; break ; case '1': togglebit(1) ; showinfoline(1); break ; case '2': togglebit(2) ; showinfoline(2); break ; case '3': togglebit(3) ; showinfoline(3); break ; case '4': togglebit(4) ; showinfoline(4); break ; case '5': togglebit(5) ; showinfoline(5); break ; case '6': togglebit(6) ; showinfoline(6); break ; case '7': togglebit(7) ; showinfoline(7); break ; case 'T': setclock(); break ; }; strcpyf(strRecBuff," "); };
};
}
|
|