Forum: Mikrocontroller und Digitale Elektronik Watchdog & UART am Mega16


von controller (Gast)


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
1
#define   F_CPU 8000000UL
2
#include  <avr/io.h>
3
#include  <stdio.h>
4
#include  <stdlib.h>
5
#include   <inttypes.h>
6
#include   <avr/interrupt.h>
7
#include   <avr/wdt.h>
8
9
#define BAUD     38400UL
10
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)
11
12
int main (void) 
13
{
14
15
//  Programm
16
17
// RS232 aktivieren
18
19
UCSRB   |= (1 << TXEN) | ( 1 << RXEN ) | ( 1 << RXCIE ) ;    // UART TX, RX einschalten
20
   
21
UCSRC   |= ( 1 << URSEL ) | ( 1<<UCSZ1 ) | ( 1<<UCSZ0 ) | ( 1<<UPM1 );    // Asynchron 8N1
22
   
23
UBRRH  = (uint8_t) (UBRR_BAUD>>8);        // USART Baud
24
    
25
UBRRL  = (uint8_t) UBRR_BAUD;
26
  
27
wdt_enable(7);
28
sei(); 
29
30
while (!(UCSRA & (1<<UDRE)));
31
UDR = 0;
32
33
// Empfangen der Parameter
34
  while (!(UCSRA & (1<<RXC)));
35
  Xonin = UDR;          // Zeiweisung der ersten 8 Bit
36
  while (!(UCSRA & (1<<RXC)));           // Warten auf die Parametereingabe
37
  loesungnew = UDR;        // Zuweisung der Zusatzes von RX
38
  while (!(UCSRA & (1<<RXC)));           // Warten auf die Parametereingabe
39
  parameterHnew = UDR;        // Zeiweisung der ersten 8 Bit
40
  while (!(UCSRA & (1<<RXC)));      // Warten auf die Parametereingabe    
41
  parameterLnew = UDR;        // Zeiweisung der zweiten 8 Bit    
42
  while (!(UCSRA & (1<<RXC)));      // Warten auf die Parametereingabe    
43
  Xoffin = UDR;
44
45
...
46
47
}
48
                    // Interrupt aktivieren
49
wdt_reset();
50
51
// Messungschleife
52
53
  for (;;) 
54
  {
55
    wdt_reset();
56
  i++;
57
  for (a=0;a<1000;)
58
  {
59
  a++;
60
  }
61
  // Summation der Werte in einer Messschleife
62
    if (i == parameter)                    // Intervalllänge bestimmt durch Parametereingabe
63
    output();                        // Ausgabe der Daten per RS232
64
  }      
65
}

von controller (Gast)


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

von Karl H. (kbuchegg)


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.

von controller (Gast)


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?

von controller (Gast)


Lesenswert?

ok hab den Fehler gefunden. danke für die Hilfe..

von Peter D. (peda)


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

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.