hallo, ich hab nen problem beim umstigt vom atmega8 auf atmega168. brauche den aufgrund des größeren speichers. problem taucht nur auf wenn ein interrupt kommt. kommt der interrupt stürt der atmega168 ab. im programm habe ich die register vom atmega8 auf atmega 168 geändert. programm mit den atmega168 registern: void sende(char buffer[]) // sende - Funktion zum Übermitteln einer Zeichenfolge { for ( i=0; buffer[i]!=0; i++ ) // For-Schleife: Abbruch wenn Zeichenfolge { // zu Ende ist, sonst "i" inkrementieren while (bit_is_clear(UCSR0A,5)) // Solange Zeichen noch nicht vollständig... { ; // ...übermittelt wurde, tue nichts! (warte) } UDR0 = buffer[i]; // Danach: Sende aktuelles ("i"-tes) Zeichen } } SIGNAL(SIG_UART_RECV) { zeichen = UDR0; } int main (void) { UBRR0L = 11; // 9600Baud siehe Baudratentabelle UCSR0B = 0b10011000; // Empfänger, Sender ein UCR = UCSRB // Interrupts aktivieren prusart = 0; lcd_init(LCD_DISP_ON); while(1) { ; } } programm mit den atmega8 registern: void sende(char buffer[]) // sende - Funktion zum Übermitteln einer Zeichenfolge { for ( i=0; buffer[i]!=0; i++ ) // For-Schleife: Abbruch wenn Zeichenfolge { // zu Ende ist, sonst "i" inkrementieren while (bit_is_clear(UCSRA,5)) // Solange Zeichen noch nicht vollständig... { ; // ...übermittelt wurde, tue nichts! (warte) } UDR = buffer[i]; // Danach: Sende aktuelles ("i"-tes) Zeichen } } SIGNAL(SIG_UART_RECV) { zeichen = UDR; } int main (void) { UBRRL = 11; // 9600Baud siehe Baudratentabelle UCSRB = 0b10011000; // Empfänger, Sender ein UCR = UCSRB // Interrupts aktivieren lcd_init(LCD_DISP_ON); while(1) { ; } } das ist jetz natürlich nur nen programmausschnitt. bin langsam echt amverzweifeln! danke schon mal! mfg
1 | UDR0 = buffer[i]; // Danach: Sende aktuelles |
2 | ("i"-tes) Zeichen |
3 | }
|
4 | |
5 | }
|
6 | |
7 | SIGNAL(SIG_UART_RECV) |
8 | {
|
Da dein Mega168 anscheinend zwischen UDR0 und UDR1 unterscheidet, kann dieser Interrupt Handler nicht SIG_UART_RECV heissen. Er könnte aber SIG_UART0_RECV heissen.
Wenn Interrupts zicken, bietet sich immer eine Simulation an: Einfach mal kurz das entsprechende Flag setzen, und dann nachsehen, ob der Prozessor in die ISR springt. Wenn nicht, nachprüfen ob Interrupts korrekt konfiguriert wurden und ob auch die korrekten Namen verwendet wurden. Bei deinem konkreten Problem tippe ich übrigens in die gleiche Richtung wie Karlheinz.
>main.c:26: warning: 'SIG_UART_RECV' appears to be a misspelled signal >handler
Glaub einfach deinem Compiler.
SIG_USART_RECV, SIG_UART_RECV werden zwar beide in der Doku als "old
vector name" angegeben, funktionieren tut aber nur der erste (warum auch
immer). Besser wäre es natürlich, gleich auf das aktuelle
1 | ISR(USART_RX_vect ) |
unzustellen. Ein Blick in die Vektortabelle im .lss-File ist bei solchen Problemen auch ganz hilfreich, da sieht man sofort, ob da der Vektor fehlt. Oliver
Oliver wrote: > Ein Blick in die Vektortabelle im .lss-File ist bei solchen Problemen > auch ganz hilfreich, da sieht man sofort, ob da der Vektor fehlt. ...und auch, wie von Karl heinz schon angedeutet, dass es beim Mega168 weder einen UART_RECV noch einen USART_RECV gibt, da beim Mega168 das UART mit einer Nummer versehen ist...
Johannes M. wrote: > Oliver wrote: >> Ein Blick in die Vektortabelle im .lss-File ist bei solchen Problemen >> auch ganz hilfreich, da sieht man sofort, ob da der Vektor fehlt. > ...und auch, wie von Karl heinz schon angedeutet, Ich weiß es ehrlich gesagt nicht mit Sicherheit. Hab nicht im Headerfile nachgeschaut. Aber da bin ich auch schon ein paar mal reingefallen und hab mich schon des öfteren darüber geärgert, dass ein verunglückter Interrupt Name nicht zu einem Error führt. Seitdem ist das immer eines der ersten Dinge, die ich checke, wenn eine ISR Zicken macht: Headerfile auf und nachsehen, ob es einen Eintrag dafür gibt.
>dass es beim Mega168 >weder einen UART_RECV noch einen USART_RECV gibt, da beim Mega168 >das UART mit einer Nummer versehen ist... Nö. Ist er nicht. RTFM. Beide... Oliver
Oliver wrote: >>dass es beim Mega168 >>weder einen UART_RECV noch einen USART_RECV gibt, da beim Mega168 >>das UART mit einer Nummer versehen ist... > > Nö. Ist er nicht. RTFM. Beide... Verf.... Da waren die damals offensichtlich (noch) nicht sonderlich konsequent. Der USART beim Mega168 heißt offiziell USART0. Und ich hätte schwören können, dass auch der Vektor zumindest USART0_RX_vect heißt. Aber so wie es aussieht, ist die Null beim Vektor tatsächlich weggelassen worden...
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.