Hallo Leute, ich habe folgende Probleme und zwar. Ich vesuche ein Testprogramm zu schreiben. Wenn ein Interrupt kommt, soll der RTC aktivieren und bei jeder Sekunde ein Ausgabe per USART erfolgen. Die Code sind folgende: #include <avr/io.h> #include "quarz.h" #include <avr/interrupt.h> #include <avr/sleep.h> #include "usart_128.h" volatile uint8_t flag = 0x00; void timer0_aktivieren (void) { ASSR |= (1 << AS0); TCCR0 |= (1 << CS02) | (1 << CS00); TIMSK |= (1 << TOIE0); } ISR (TIMER0_OVF_vect) { USART_Transmit_String1 ("tick\n\r"); } ISR (INT1_vect) { timer0_aktivieren (); } int main (void) { USART_Init1 (); MCUCR |= (1 << SE) | (1 << SM1) | (1 << SM0); EIMSK |= (1 << INT1); EICRA |= (1 << ISC11); sei (); while (1) {sleep_mode ();} return 0; } Die USART-Funktion habe ich schon getestet und einwandfrei funktioniert. Aber nachdem ich die RTC-Funktion eingebaut habe. Die Ausgabe funktioniert nicht mehr richtig. Statt "tick\n\r" auszugeben, gibt sie irgendwas anderes aus. Kann jemand mir bitte sagen, was ich flasch gemacht habe? Tommi
hallo, schicke uns doch mal bitte deine inti-Routinen. Hast du die Interrupts wärend der Übertragung vom USART ausgeschaltet?
sorry für den Doppelpost, ahb aber noch was entdeckt: dein sleepmode ist nicht initialisert, es kann sein das dein µC nach nem Irq wieder nach Reset springt, hatte das selbe Problem, die mitgelieferte sleep-lib unterstützt bisher nur das irq-rst-model, den reine irq-mode wie du ihn braust musste selbst initialisieren, oder nim diese Lib: http://www.mtcnet.net/~henryvm/wdt/
tommi schrieb: > MCUCR |= (1 << SE) | (1 << SM1) | (1 << SM0); ... > {sleep_mode ();} Wie soll denn die UART senden, wenn Du ihr immer wieder den Takt abschaltest? UART geht nur im Idle-Mode weiter! Peter
Die Initialisierung von USART sind folgende #define F_CPU 1843200UL #define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 void USART_Init1 (void) // usart1 initialisieren { uint8_t ubrr = MYUBRR; UBRR1H = (unsigned char) (ubrr >> 8); UBRR1L = (unsigned char) ubrr; UCSR1B = (1 << RXEN1) | (1 << TXEN1); } und mit der Frage ***Hast du die Interrupts wärend der Übertragung vom USART ausgeschaltet?*** Die beiden Interrupt wurden nicht ausgeschaltet. Da die Aufwecksignal fuer Int1 nur 1-Mal auftreten zum Aktivieren von timer0 und der Intervall von Overflow dauert eine Sekunde. Tommi
***die mitgelieferte sleep-lib unterstützt bisher nur das irq-rst-model, den reine irq-mode wie du ihn braust musste selbst initialisieren*** Kannst du mir noch bitte mehr erklären, was du mit dem ***irq-rst-model*** meinst? und wie kann ich die irq-mode selbst initialisieren? Tommi
Hallo Peter, Es soll nämlich wie folgenden funktioniert: Als Erstes soll der µC sofort in power-save-modus gehen. Dann wenn am Int1 eine fallende Flanke eintrifft, soll der timer0 aktivieren. Danach mit jedem Overflow-Int soll der µC aufwecken, Zeichenkette ausgeben und dann wieder im power-save-modus gehen bis der nächsten Overflowinterrupt eintrifft. Tommi
Was sollen denn diese zerstreuten Schnipselchen? Zerreist Du auch immer erst Bücher, ehe Du sie jemand anderem zum Lesen gibst? Wozu denkst Du, ist der Dateianhang da? Warum ist es denn immer so unsäglich schwer, zur Abwechslung mal nen relevanten und compilierbaren Code zu posten? [Glaskugelmodus an] Deine geheimnisvolle "USART_Transmit_String1" wartet nicht, bis das letzte Stopbit raus ist und deshalb klaut das Sleep der UART den Takt unterm Arsch weg. Peter
Hi noch mal, tut mir leid, wenn mein Post dich so sehr stört. Ich habe nicht die Absicht dich zu irren. Ich bin mir sicher, dass meine USART funktion gut funktioniert und habe auch getestet. Dewegen wollte ich ja nicht meine ganze Code reinschreiben. Na ja wenn du willt. Hier noch die USART-Funktionen #define F_CPU 1843200UL #define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 void USART_Init1 (void) // usart1 initialisieren { uint8_t ubrr = MYUBRR; UBRR1H = (unsigned char) (ubrr >> 8); UBRR1L = (unsigned char) ubrr; UCSR1B = (1 << RXEN1) | (1 << TXEN1); } void USART_Transmit1 (char data) // zeichen senden { while (! (UCSR1A & (1 << UDRE1))) ; UDR1 = data; } void USART_Transmit_String1 (char *string) // zeichenkette senden { while (*string) USART_Transmit1 (*string++); } unsigned char USART_Receive1 (void) // zeichen empfangen { while (! (UCSR1A & (1 << RXC1))) ; return UDR1; } Tommi
Oh und als weiteres Das Problem ist: Statt "tick\n\r" raus zu geben. Gib der µC ein völliges anderes Zeichen (bei jeder Ausgabe 3 Zeichen, Jedes Mal gleich) aus aber mit dem richtigen Intervall zwar 1 sekunde. Tommi
Hi Nur mal so: Wenn du eine Aktion nach dem Senden eines Zeichens ausführen willst, musst du TXC und nicht UDRC prüfen. MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.