#include <90s8535.h> #include "glcd_t6963.h" #include #include #include #define XTAL 8000000 #define DEBOUNCE 256 unsigned int readADC_10BIT(unsigned char channel); void Uhrzeit(unsigned char sekunde); void Uhrzeit_init(void); unsigned char value; float luftdruck,temperatur,hoehe,hilf,hoehenkorrektur; unsigned char sekunden, minuten, stunden; unsigned char wochentag, tag, monat; unsigned int jahr,g,m; char *text[] = {"Mo","Di","Mi","Do","Fr","Sa","So"}; unsigned char prescaler,sekunde; unsigned char select,u; float ua, rt2, kt, T; unsigned char x, uart_zeichen; unsigned char printbuf [96]; unsigned int i=0; unsigned char zeichen; unsigned int readADC_10BIT(unsigned char channel) { unsigned char m; unsigned int result; ADCSR = 0x86; ADMUX = channel; // Kanal waehlen ADCSR |= 0x40; // eine ADC-Wandlung while(!(ADCSR & 0x10)); // auf Abschluss der Konvertierung warten (ADIF-bit) result = 0; /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ for(m=0;m<4;m++) { ADCSR |= 0x40; // eine Wandlung "single conversion" while(!(ADCSR & 0x10)); // auf Abschluss der Konvertierung warten (ADIF-bit) result += (ADCL + (ADCH<<8)); // mit uint16_t x } ADCSR &= ~0x80; // ADC deaktivieren (2) result >>= 2; // Summe durch vier teilen = arithm. Mittelwert return result; } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { #if XTAL % DEBOUNCE // bei rest OCR1A = XTAL / DEBOUNCE - 1; // compare DEBOUNCE - 1 times #endif if( --prescaler == 0 ) { prescaler = DEBOUNCE; sekunde++; // exact one second over Uhrzeit(sekunde); #if XTAL % DEBOUNCE // handle remainder OCR1A = XTAL / DEBOUNCE + XTAL % DEBOUNCE - 1; // compare once per second #endif } } void Uhrzeit(unsigned char sekunde) { if (sekunden < 59) ++sekunden; else { sekunden = 0; if (minuten < 59) ++minuten; else { minuten = 0; if (stunden < 23) ++stunden; else { stunden = 0; if (wochentag < 6) ++wochentag; else wochentag = 0; if ((monat == 1)||(monat == 3)||(monat == 5)|| (monat == 7)||(monat == 8)||(monat == 10)) { if (tag < 31) ++tag; else { tag = 1; ++monat; } } else if (monat == 12) { if (tag < 31) ++tag; else { tag = 1; monat = 1; ++jahr; } } else if (monat == 2) { if (((jahr%4==0) && (jahr%100!=0)) || (jahr%400==0)) { if (tag < 29) ++tag; else { tag = 1; ++monat; } } else { if (tag < 28) ++tag; else { tag = 1; ++monat; } } } else { if (tag < 30) ++tag; else { tag = 1; ++monat; } } } } } } void Uhrzeit_init(void) { wochentag = 3; monat = 2; tag=16; jahr = 2007; stunden = 15; minuten = 29; sekunden = 0; } //Hauptprogramm void main(void) { DDRB = 0xFF; PORTB = 0; DDRD = 0x00; PORTD = 0; PORTC_output(); t6963cinit(); LCD_Clear_Graphics(); LCD_Clear_Text(); Uhrzeit_init(); ACSR=0x80; TCCR1B=0x09; OCR1A = XTAL / DEBOUNCE - 1; // Output Compare Register TCNT1 = 0; // Timmer startet mit 0 sekunde = 0; TIMSK=0x10; ADCSR=0x86; #asm("sei") while (1) { LCD_int(0, 5,"AD-Channel(0): %3d",readADC_10BIT(0)); //Ausgabe Datum LCD_text(0,0,"Datum:"); LCD_int(7,0,"%s.",text[wochentag-1]); LCD_int(10,0,"%02u.",tag); LCD_int(13,0,"%02u.",monat); LCD_int(16,0,"%04u",jahr); //Ausgabe Uhrzeit LCD_text(0,1,"Uhrzeit:"); LCD_int(9,1,"%02u:",stunden); LCD_int(12,1,"%02u:",minuten); LCD_int(15,1,"%02u",sekunden); }; }