www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega128RFA1 Reset (extern) alle 1/2h


Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Setup:
- ATmega128RFA1 auf nem Dresden Elektronik Board, sitzt auf:
- PCB mit USB-Versorgung, LDO zu 3.3V, LiPo Backup
- FT232RQ zum PC

Firmware:
Ein Board agiert als PAN Coordinator (=Master) und gibt empfangene 
Funkdaten der Nodes (=Slaves) über USART0 => FT232 => PC Terminal aus
- Funkdaten empfangen => in Buffer kopieren, überprüfen => teilweise in 
Buffer für USART0 Ausgabe kopieren => USART0 Ausgabe mit TXC Interrupt
- mit Codevision erstellt
- alle nötigen Interrupts für Transceiver und USART0 werden verwendet 
(habe die ISRs aufs reine Flag-setzen ausgedünnt)

*Problem:*
Nach etwa einer halben Stunde Laufzeit gibt's einen Reset.

Das Reset Register nach Neustart sagt: Reset Source extern.
Hardware macht das aber nicht, habe Spannung und externen Reset 
Controller (TCM809) überprüft, da passiert nix.
Watchdog scheidet auch aus.

=> Vermutung: Irgendwie springt der Program Counter auf $0000 = Reset.
Aber wie kann das passieren?
Ich arbeite viel mit Zeigern, auch auf konstante Strings im Flash. Kann 
dort etwas faul sein?


Hier mal ein paar Code-Auszüge:

Beispiel für pointer ins flash, kopiert in globalen
TX_buffer für RS232, mit Beispiel String im Flash.
Hmm, eigentlich funktioniert's ja für einige 1000e Zeichen...

flash char str_ohyeah[] = "Oh Yeah!";

string2TXbuf(str_ohyeah);

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// put string array into TX_buffer, end with null termination \0 = NUL = 0x00
void string2TXbuf(flash char *ptr_str)
{
  unsigned char i = 0;

  for( i = 0; i < STRING_MAX_LEN; i++ )
  {
    if ( *(ptr_str + i) == '\0' ) break;          // end of string
    else TX_buffer[TX_length++] = *(ptr_str + i);
  }
}

Und wenn TX_buffer gefüllt ist:

....
  string2TXbuf(str_ohyeah);
  TX_buffer[TX_length++] = LF;
  TX_buffer[TX_length++] = CR;

// Ready to send TX_buffer:

  TX0_bts2send = TX_length;
  TX0_go = 1;

  // Trigger transmission by sending first byte, rest is done auto with ISR
  TX0_byte(TX_buffer[0]);
}

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
  static unsigned char bytes_sent = 0;

  // TXC flag auto resets here

  bytes_sent++;

  if ( TX0_go == 1 && bytes_sent < TX0_bts2send )
  {
    UDR0 = TX_buffer[bytes_sent];
  }
  else
  {
    TX0_go = 0;
    bytes_sent = 0;
  }
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
X- Rocka schrieb:
> Irgendwie springt der Program Counter auf $0000 = Reset.

Das sollte allerdings kein Extern-Reset-Flag setzen.

Hast du die Flags in MCUCSR denn initial ordentlich gelöscht, damit
du sauber erkennen kannst, ob nach dem Neustart wirklich eins neu
gesetzt worden ist?  Wenn dem so ist, und du siehst das EXTRF-Bit,
dann brauchst du nicht in der Software zu suchen, dann muss es über
die Hardware reingekommen sein.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
X- Rocka schrieb:
> Ich arbeite viel mit Zeigern, auch auf konstante Strings im Flash. Kann
> dort etwas faul sein?

Bestimmt nicht, da wärst du der Allererste ;)

Oliver

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ji Jörg,

Hmm, habe den Reset Pin und die 3.3V ge-scoped, und da ist im Moment des 
Reset nix.

Mit MCUSR &= 0xE0 sollte das Register eigentlich resettet sein...
void Reset_Source_Check(void)
{
  TX0_message(str_reset_src_hdr, HEADER);

  // Power-on Reset
  if (MCUSR & 0x01)     TX0_message(str_reset_src_POR, HEADER);
  // External Reset
  else if (MCUSR & 0x02)   TX0_message(str_reset_src_EXT, HEADER);
  // Brown-Out Reset
  else if (MCUSR & 0x04)   TX0_message(str_reset_src_BRO, HEADER);
  // Watchdog Reset
  else if (MCUSR & 0x08)   TX0_message(str_reset_src_WDT, HEADER);
  // JTAG Reset
  else if (MCUSR & 0x10)   TX0_message(str_reset_src_JTG, HEADER);

  MCUSR &= 0xE0;
}

Oliver, kannst du denn in dne obigen Routinen irgendwas verdächtiges 
sehen?

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> X- Rocka schrieb:
>> Irgendwie springt der Program Counter auf $0000 = Reset.
>
> Das sollte allerdings kein Extern-Reset-Flag setzen.
>
> Hast du die Flags in MCUCSR denn initial ordentlich gelöscht, damit
> du sauber erkennen kannst, ob nach dem Neustart wirklich eins neu
> gesetzt worden ist?  Wenn dem so ist, und du siehst das EXTRF-Bit,
> dann brauchst du nicht in der Software zu suchen, dann muss es über
> die Hardware reingekommen sein.

Oh Meister... ich bin so dermaßen dämlich - es ist ein externer Reset, 
habe am falschen Pin gemessen... -schäm-

Danke!
Den Rest finde ich selbst raus.

Aua.

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.