Forum: Mikrocontroller und Digitale Elektronik Watchdog-Reset per UART auf ATmega8535


von Phillip H. (philharmony)


Lesenswert?

Hallo,
ich möchte, wenn ich zb 0x00 per USART sende, den watchdog starten um 
den Atm. zu resetten.
Leider funtkioniert das nicht:
1
int main (void)
2
{
3
//initialisierung etc hab ich hier natürlich auch gemacht
4
5
USART_Transmit('S'); //zum zeichen daß er startet/resettet hat
6
for (;;)
7
 {
8
 }
9
10
}
11
ISR(USART_RX_vect)
12
   {char puffer=UDR;
13
    if (puffer==0xff)
14
     {USART_Transmit('R');  //zum zeichen daß 0xff erkannt wird
15
      reset();
16
     }
17
   }
18
19
20
int reset(void)
21
   {USART_Transmit('E');  //zum zeichen daß er auch resettet
22
    wdt_enable(WDTO_15MS);
23
   }

wenn ich jetzt 0xff sende, dann kriege ich nur das 'R' zurück, er 
erkennt die 0xff also.
Allerdingt kommt danach weder ein 'E' daß er wenigstens in die reset() 
funktion einsteigt, noch ein 'S' daß er neu gestartet hat.

Auch
1
if (puffer==0xff) wdt_enable(WDTO_15MS);
fürht zu keinem reset, das 'S' für Programstart wird nicht gesendet.
Was läuft schief?
(ich simuliere nicht, sondern hab es auf nem breadboard laufen)

von Phillip H. (philharmony)


Lesenswert?

ok, stimmt nicht ganz, wenn ich das so mache wies oden steht dann 
klappts auch. Wollte den text nur weitestmöglich zum posten 
vereinfachen.
Das Problem schient in der switch-Abfrage zu stecken.
1
int main (void)
2
{
3
//initialisierung etc hab ich hier natürlich auch gemacht
4
5
USART_Transmit('S'); //zum zeichen daß er startet/resettet hat
6
for (;;)
7
 {
8
 }
9
10
}
11
ISR(USART_RX_vect)
12
   {char puffer=UDR;
13
    switch (puffer)
14
     case 0x00 : break;
15
     case 0xff : USART_Transmit('R'); reset(); 
16
     }
17
   }
18
19
20
int reset(void)
21
   {USART_Transmit('E');  //zum zeichen daß er auch resettet
22
    wdt_enable(WDTO_15MS);
23
   }

Das lustige ist: wenn ich den reset mit case 0x00 machen lasse, dann 
gehts.
setze ich den reset() in case 0xff ein, dann sendet er.
Habe jetzt auch mal folgendes versucht:
1
switch(puffer)
2
{
3
case 0x00 : USART_Transmit('0');
4
case 0xff : USART_Transmit('R');
5
default : USART_Transmit('d')
6
}

Hier wird jetzt bei 0x00 '0' 'R' und 'd' gesendet, bei 0xff 'R' und 'd' 
und sond nur 'd'...
Sollte switch nicht eigentlich nur die jeweilige Zeile ausspucken?
Wenn nicht, wie mach ich das dann?
lg

von M. Kriegel (Gast)


Lesenswert?

Mach mal die break's wieder rein und definier puffer als unsigned char 
....

switch(puffer)
{
  case 0x00:
    USART_Transmit('0');
  break;

  case 0xff:
    USART_Transmit('R');
  break;

  default:
    USART_Transmit('d');
  break;
}

von Phillip H. (philharmony)


Lesenswert?

Ok, ich habs weiter eingeschränkt.
Die breaks hatte ich natürlich Uhrzeitbedingt vergessen.
Das lustige ist:
case : 0x00 reset(); //geht
case : 0x01 reset(); //geht auch

case : 0xfe reset(); USART_Transmit(puffer) //resettet nicht, schickt 
aber 0xfe
case : 0xff reset(); //das gleiche
?????????

von M. Kriegel (Gast)


Lesenswert?

char puffer = UDR;

oder

unsigned char puffer = UDR;

??

von Phillip H. (philharmony)


Lesenswert?

inzwischen unsigned, und siehe da: es geht... danke ;)

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.