Gast
#303732
Hi, und zwar ist mir gestern Abend an meinem ATMEGA8535 mit T6963 Display folgendes aufgefallen In meinem Hauptprogramm verwende ich diesen Code: while() { if(tasten() == 3) tagesprofil(); } Wenn ich meinen Hex Code in meinen ATMEGA8535 lade dann wird auch alles auf meinem Display angezeigt. Nur meine Uhr bleibt komischerweise stehe. Ich vermute dass es an dem "getchar()" liegt. Denn wenn ich diese if Anweisung entferne, dann funzt auch alles super. Ich Verwende den sende und empfangs Interrupt der UART den AD Wandler und den "TIM1_COMPA" Interrupt. Was könnte da falsch sein? interrupt [USART_RXC] void uart_rx_isr(void) { uart_recieve = UDR; } interrupt [USART_TXC] void uart_tx_isr(void) { } void tagesprofil (void) { unsigned char n, m; for (n=0; n<24; ++n) { if (n == 0) { putchar('T'); } sprintf (printbuf,"%4d %2d.%2d.%2d ",2006,(int)12,(int)16,(int)n); sprintf (printbuf+15,"%4d%3d",1014,(int)23); *(printbuf+24) = 0x0d; *(printbuf+25) = 0x0a; for (m=0; m<26; ++m) { putchar(*(printbuf + m)); } {unsigned int i; for (i=1000; i>0; --i);} } putchar('E'); } unsigned int readADC_10BIT(unsigned char channel) { unsigned char m; unsigned int result; ADCSRA = 0x86; // Frequenzvorteiler // setzen auf 64 (1) und ADC aktivieren (1) ADMUX = channel; // Kanal waehlen ADMUX |= 0x40; // AVCC als Referenzspannung nutzen /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= 0x40; // eine ADC-Wandlung while(!(ADCSRA & 0x10)); // auf Abschluss der Konvertierung warten (ADIF-bit) result = 0; /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ for(m=0;m<4;m++) { ADCSRA |= 0x40; // eine Wandlung "single conversion" while(!(ADCSRA & 0x10)); // auf Abschluss der Konvertierung warten (ADIF-bit) result += (ADCL + (ADCH<<8)); // mit uint16_t x //result += ADC; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~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); tasten(); #if XTAL % DEBOUNCE // handle remainder OCR1A = XTAL / DEBOUNCE + XTAL % DEBOUNCE - 1; // compare once per second #endif } }

