mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik problem umstieg atmega8 auf atmega168


Autor: LUK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
              UDR0 = buffer[i];              // Danach: Sende aktuelles
("i"-tes) Zeichen
            }

}

SIGNAL(SIG_UART_RECV)
{

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.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.