www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Watchdog & UART am Mega16


Autor: controller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy


ich möchte das mein Programm zu beginn 5 Werte per RS232 aufnimmt und 
mit denen dann weiterarbeitet.

Wenn die Werte korreckt ankommen funktionert das auch wunderbar. Wenn 
jedoch nur 4 ankommen bleibt er in dem Punkt hängen.

Daher wollte ich einen Watchdogtimer einführen, der dann nach 2,2s 
resetet...

nutze

#define   F_CPU 8000000UL
#include  <avr/io.h>
#include  <stdio.h>
#include  <stdlib.h>
#include   <inttypes.h>
#include   <avr/interrupt.h>
#include   <avr/wdt.h>

#define BAUD     38400UL
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)

int main (void) 
{

//  Programm

// RS232 aktivieren

UCSRB   |= (1 << TXEN) | ( 1 << RXEN ) | ( 1 << RXCIE ) ;    // UART TX, RX einschalten
   
UCSRC   |= ( 1 << URSEL ) | ( 1<<UCSZ1 ) | ( 1<<UCSZ0 ) | ( 1<<UPM1 );    // Asynchron 8N1
   
UBRRH  = (uint8_t) (UBRR_BAUD>>8);        // USART Baud
    
UBRRL  = (uint8_t) UBRR_BAUD;
  
wdt_enable(7);
sei(); 

while (!(UCSRA & (1<<UDRE)));
UDR = 0;

// Empfangen der Parameter
  while (!(UCSRA & (1<<RXC)));
  Xonin = UDR;          // Zeiweisung der ersten 8 Bit
  while (!(UCSRA & (1<<RXC)));           // Warten auf die Parametereingabe
  loesungnew = UDR;        // Zuweisung der Zusatzes von RX
  while (!(UCSRA & (1<<RXC)));           // Warten auf die Parametereingabe
  parameterHnew = UDR;        // Zeiweisung der ersten 8 Bit
  while (!(UCSRA & (1<<RXC)));      // Warten auf die Parametereingabe    
  parameterLnew = UDR;        // Zeiweisung der zweiten 8 Bit    
  while (!(UCSRA & (1<<RXC)));      // Warten auf die Parametereingabe    
  Xoffin = UDR;

...

}
                    // Interrupt aktivieren
wdt_reset();

// Messungschleife

  for (;;) 
  {
    wdt_reset();
  i++;
  for (a=0;a<1000;)
  {
  a++;
  }
  // Summation der Werte in einer Messschleife
    if (i == parameter)                    // Intervalllänge bestimmt durch Parametereingabe
    output();                        // Ausgabe der Daten per RS232
  }      
}


Autor: controller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh da fehlt wohl was ;-)

also er resetet leider dauerhaft. bzw bleibt einfach stehen, wenn ich 
was empfange.

wenn ich den WDT einfach rausschmeisse funktioniert es wunderbar

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

Bewertung
0 lesenswert
nicht lesenswert
> ich möchte das mein Programm zu beginn 5 Werte per RS232 aufnimmt
> und mit denen dann weiterarbeitet.

Du zäumst das Pferd falsch auf.

Der UART kann dir einen Interrupt auslösen, wenn er
ein Zeichen empfängt.
Im Interrupt holst du das Zeichen ab und entweder
  * speicherst du es zwischen
  * wenn es das 5.te Zeichen war, machst deine Magic zb.
    indem du eine globale Variable auf 1 setzt.

Das Hauptprogramm wartet nur noch darauf, ob diese globale
Variable jemals 1 wird. Ist das der Fall, dann sind
5 Zeichen empfangen worden.


Der WDT ist nicht wirklich dazu gedacht, Warteschleifen
auszutimen. Hier hast du ja den Fall, dass du warten musst,
du weist nur nicht wie lange. Dafür würde man wohl eher
einen normalen Timer nehmen. Der WTD ist gedacht um das
Programm aus unerwarteten Fehlerzuständen wieder definiert
herauszuholen. Für Timeout Sachen an Schnittstellen ist er
ob seiner Konsequenzen wohl etwas übertrieben.

Autor: controller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mache ich auch im Hauptprogramm per ISR. aber möchte es an anfang 
explizit abfragen, da das Programm sonst nicht starten darf!
wenn während des Betriebs daten kommen wird die ISR ausgelöst und liest 
die Daten ein.

Da ich sowieso ein WDT brauche passt das gut mit rein.

Ich hatte die Zeit auf 2,2Sekunden gesetzt, das heißt ja er resetet alle 
2,2Sekunden, bis er das erste mal die richtigen Daten bekommt. dann geht 
es normal los und in jedem Durchlauf soll der WDT resetet werden..

wo liegt mein Fehler?

Autor: controller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok hab den Fehler gefunden. danke für die Hilfe..

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
controller wrote:

> Da ich sowieso ein WDT brauche passt das gut mit rein.

Das ist der völlig falsche Ansatz.

Einen Watchdog braucht man nie. Er ist nur das Tüpfelchen an Sicherheit, 
welches man zum Schluß auf die Anwendung draufpappt

Wenn der Watchdog aber regulär gebraucht wird, dann hat man etwas 
grundsätzlich falsch gemacht.
Auch kann man dann nicht mehr erkennen, ob es ein echter Watchdogreset 
oder nur ein Timeout war.

Für irgendwelche Zeitabhängigkeiten hat man schließlich haufenweise 
Timer zur Verfügung.

Und es sieht auch beschissen aus, wenn alle LEDs flackern und Relais 
klappern, nur weil ständig sämtliche Ausgänge durch den Watchdog 
kurzzeitig hochohmig geschaltet werden.


Peter

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.