Forum: Mikrocontroller und Digitale Elektronik problem umstieg atmega8 auf atmega168


von LUK (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

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.

von mr.chip (Gast)


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.

von Oliver (Gast)


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

von Johannes M. (johnny-m)


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...

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


Lesenswert?

>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

von Johannes M. (johnny-m)


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...

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
Noch kein Account? Hier anmelden.