Forum: Mikrocontroller und Digitale Elektronik Watchdog Timer Problem C515C


von Martin S. (drunkenmunky)


Lesenswert?

Hallo,
ich verwende das miniMODUL der Firma Phytec mit einem Infineon 
SAF-C515C. Ich programmiere mit Keil uVision3. Jetzt habe ich probiert 2 
Analogwerte einzulesen und mit dem Keil Simulator zu simulieren.

Problem ist aber dass er laufend "Watchdog Timer Reset occured" meldet.

Ist der Watchdog Timer standardmäßig eingeschalten? Wie setzt ich ihn 
zurück oder schalte ihn aus? Oder woran liegt es, dass der Watchdog 
anspricht?

Hier mal mein Code:
1
#include<stdio.h>
2
#include <reg515c.h>
3
 
4
int aduwert(char kanal)
5
{
6
  ADCON1 = kanal;
7
  ADDATL = 0;   // ADU starten
8
  while(BSY);    //auf Wandlungsende warten
9
  return((ADDATL>>6)+ADDATH*4);
10
}
11
      
12
void main(void)
13
{    
14
  int analogwert_AN0, analogwert_AN1;
15
  float spannung0, spannung1;
16
   
17
  ADEX = 0;    //interner Wandlungsstart
18
  ADM = 1;    // kontinuierliche Wandlung
19
20
  while(1)
21
  {
22
    while(BSY);
23
    analogwert_AN0 = aduwert(0);     //Analogwert einlesen lassen
24
    while(BSY);
25
    analogwert_AN1 = aduwert(1);
26
     
27
    spannung0 = 5 * ((float)analogwert_AN0/1024);    //Analogwert umrechnen auf Eingangsspannung bei 5V Referenzspannung
28
    spannung1 = 5 * ((float)analogwert_AN1/1024);
29
  
30
  }
31
32
}

Vielen Dank im voraus

von Ralf (Gast)


Lesenswert?

> Problem ist aber dass er laufend "Watchdog Timer Reset occured" meldet.
Okay, das ist schon mal ne konkrete Fehlerbeschreibung.

> Ist der Watchdog Timer standardmäßig eingeschalten?
siehe Datenblatt

> Wie setzt ich ihn zurück oder schalte ihn aus?
siehe Datenblatt

> Oder woran liegt es, dass der Watchdog anspricht?
siehe Datenblatt

Die obigen Antworten sollen dir nur verdeutlichen, dass du mehr und 
bessere Antworten bekommst, je mehr Input du lieferst :) Also 
Datenblatt, Schaltplan, etc.

Hab's mir mal angesehen bzw. nur kurz überflogen. Kapitel 8.1 vom 
UserManual ist der Ansatzpunkt. Es gibt den PE/SWD Pin welcher u.a. 
bestimmt, ob der Watchdog bei einem Reset automatisch aktiviert wird. 
Leider konnte ich auf die Schnelle keinen Schaltplan zu deinem Board 
finden, aber der Beschreibung des Boards nach ist Jumper J7 die 
Verbindung zum PE/SWD Pin, vermute ich mal.

Soweit ich das sehen kann, gibt es keine Möglichkeit, den WatchDog zu 
deaktivieren, wenn er einmal gestartet wurde. Du musst ihn in dem Fall 
permanent rücksetzen -> siehe UserManual. Die andere Option ist, mittels 
Jumper den automatischen Start zu unterbinden. Die weiteren Auswirkungen 
(z.B. auf die Stromsparmodi, etc.) musst du selber bewerten und 
entscheiden, ob du das machen willst.

Deine Software hab ich mir jetzt nicht angeguckt, weil ich denke, dass 
du zuerst das mit dem Watchdog eintüten solltest :)
Wenn weitere Fragen sind, nur her damit...

Ralf

von Ralf (Gast)


Lesenswert?

> ...aber der Beschreibung des Boards nach ist Jumper J7 die
> Verbindung zum PE/SWD Pin, vermute ich mal.
Korrektur: Jumper J9 !!!

Ralf

von R. W. (quakeman)


Lesenswert?

Martin S. schrieb:
> Hallo,
> ich verwende das miniMODUL der Firma Phytec mit einem Infineon
> SAF-C515C. Ich programmiere mit Keil uVision3. Jetzt habe ich probiert 2
> Analogwerte einzulesen und mit dem Keil Simulator zu simulieren.
>
> Problem ist aber dass er laufend "Watchdog Timer Reset occured" meldet.
>
> Ist der Watchdog Timer standardmäßig eingeschalten? Wie setzt ich ihn
> zurück oder schalte ihn aus? Oder woran liegt es, dass der Watchdog
> anspricht?

Bei der Simulation in µVision ist der Interrupt per Hardware Pin 
standardmäßig aktiviert. Um diesen in der Simulation zu deaktivieren 
mußt du den Pin PE/SWD=0 setzen. Dies machst du in dem du eine Datei mit 
der Endung .ini anlegst in welcher drinsteht:
1
PE_SWD = 0
2
RESET
Diese Datei gibst du dann unter "Project->Options for Target->Debug" in 
dem Feld "Initialization File" an. Beim Start des Debuggers wird diese 
Datei dann geladen und der Pin PE/SWD in der Simulation auf 0 gesetzt, 
wodurch der Hardware-Watchdog beim Start deaktiviert ist.

Ciao,
     Rainer

von Martin S. (drunkenmunky)


Lesenswert?

danke für die Antworten!

dann müsste ja der Watchdog auf dem miniMODUL ausgeschalten sein, denn 
der J9 ist noch auf 1+2 gestellt.

Und die ini in die Simulation mit einfügen hat auch geklappt.

Danke!

von Martin S. (drunkenmunky)


Lesenswert?

Eine Frage hätte ich noch zum Analogwert einlesen. Ich habe das Programm 
ein bisschen erweitert:
1
sbit P20 = 0xa0;   //Definition Port-Pin 2.0
2
sbit P21 = 0xa1;   //Definition Port-Pin 2.1
3
sbit P22 = 0xa2;   //Definition Port-Pin 2.2
4
sbit P23 = 0xa3;   //Definition Port-Pin 2.3
5
 
6
int aduwert(char kanal)
7
{
8
  ADCON1 = kanal;
9
  ADDATL = 0;   // ADU starten
10
  while(BSY);    //auf Wandlungsende warten
11
  return((ADDATL>>6)+ADDATH*4);
12
}
13
      
14
void main(void)
15
{    
16
  int analogwert_AN0, analogwert_AN1;
17
  float spannung0, spannung1, test;
18
   
19
  ADEX = 0;   //interner Wandlungsstart
20
  ADM = 0;    //keine kontinuierliche Wandlung
21
22
  while(1)
23
  {
24
    while(BSY);
25
    analogwert_AN0 = aduwert(0);     //Analogwert einlesen lassen
26
    while(BSY);
27
    analogwert_AN1 = aduwert(1);
28
29
    spannung0 = 5 * ((float)analogwert_AN0/1024);    //Analogwert umrechnen auf Eingangsspannung bei 5V Referenzspannung
30
    spannung1 = 5 * ((float)analogwert_AN1/1024);
31
        
32
    if(spannung0 > 1.0)
33
      P20 = 1;
34
    else
35
      P20 = 0;
36
37
    if(spannung0 > 2.0)
38
      P21 = 1;
39
    else
40
      P21 = 0;
41
    
42
    if(spannung0 > 3.0)
43
      P22 = 1;
44
    else
45
      P22 = 0;
46
  }
47
48
}

die Variable analogwert_AN0 ist, wenn ich 1V am Eingang einstelle bei 5V 
Referenzspannung, nach der Zeile:
1
analogwert_AN0 = aduwert(0);

auf analogwert_AN0 = 204, soweit OK, aber nach der Zeile:
1
spannung0 = 5 * ((float)analogwert_AN0/1024);

ist analogwert_AN0 = 126

und nach
1
if(spannung0 > 1.0)

ist analogwert_AN0 = 0

warum verändert sich analogwert_AN0 überhaupt nochmal wenn ich ihm doch 
nichts neues zuweise?

von R. W. (quakeman)


Lesenswert?

Martin S. schrieb:
> die Variable analogwert_AN0 ist, wenn ich 1V am Eingang einstelle bei 5V
> Referenzspannung, nach der Zeile:
>
>
1
analogwert_AN0 = aduwert(0);
>
> auf analogwert_AN0 = 204, soweit OK, aber nach der Zeile:
>
>
1
spannung0 = 5 * ((float)analogwert_AN0/1024);
>
> ist analogwert_AN0 = 126
>
> und nach
>
>
1
if(spannung0 > 1.0)
>
> ist analogwert_AN0 = 0
>
> warum verändert sich analogwert_AN0 überhaupt nochmal wenn ich ihm doch
> nichts neues zuweise?

Das liegt an der Optimierung des Compilers, welcher Variablen 
wiederverwendet insofern dies keine Auswirkung auf das Programm hat. Da 
du die Variable analogwert_AN0 nach der Umrechnung nicht mehr benutzt, 
wird der Speicherplatz dieser Variablen für die folgenden Berechnungen 
intern mitbenutzt. Dadurch werden keien neuen internen Variablen erzeugt 
und der Compiler spart RAM. Das ist also alles schon richtig so und du 
hast dadurch insgesamt auch mehr RAM für dein Programm zur Verfügung.

Ciao,
     Rainer

von Martin S. (drunkenmunky)


Lesenswert?

Achso, dann bin ich ja beruhigt... :-)

Vielen Dank für die Antwort!

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.