problem umstieg atmega8 auf atmega168

Gast #1229432
Lesenswert?
• ▲
▼
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
Gast #1229473
Lesenswert?
• ▲
▼
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.
Gast #1229536
Lesenswert?
• ▲
▼
>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
#1229540
Lesenswert?
• ▲
▼
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...
#1229545
Lesenswert?
• ▲
▼
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.
#1229614
Lesenswert?
• ▲
▼
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren