www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Watchdog PIC16

Autor: Peters (Gast)
Datum: 28.04.2008 17:13

Hallo,

folgendes Problem:

Ich Habe einen PIC16F690, in den Konfigurationsbit ist der Watchdog
disabled, damit ich ihn mit dem SWDTEN bit ein- und ausschalten kann.
Dies funktioniert auch. Nun möchte ich nach einem Neustart des
Controllers erfahren wodurch der Reset Ausgelöst wurde. Hierzu steht das
TO Flag im Statusregister bereit, jedoch ist das Statusregister nach
jedem Neustart, egal ob Reset, MCLR oder WDT Reset 0x18 also TO = 1 und
PD = 1.

Muss ich irgendwo das TO bit "freischalten" und durch wen wird dieses TO
bit im Statusregister überhaupt gelöscht?

In meinem Quelltext siehts ca. so aus:

SWDTEN = 1;
get_Messwert();
asm("clrwdt");
get_Messwert();
asm("clrwdt");
get_Messwert();
asm("clrwdt");
SWDTEN = 0;

Der WDTPS ist auf 1001b eingestellt, ergibt ca 530ms.

Für Hile wäre ich dankbar.
Autor: Ernst Bachmann (ernst)
Datum: 28.04.2008 17:17

Wahrscheinlich setzt der vom Compiler generierte Startup-Code das
Register zurück, bevor du überhaupt aus dem C-Code drankommst.

Lass dir mal ein ASM-File generieren, und schau darin nach, was der
Controller direkt nach dem Reset-Vector macht.
Autor: Severino R. (severino)
Datum: 28.04.2008 17:29

Und wo in Deinem Code sollte ein WDT ausgelöst werden?
Autor: Peters (Gast)
Datum: 29.04.2008 08:33

@severino

wenn die get_Messwert Funktion nicht mehr zurückkehrt bzw. länger als
die 530ms benötigt, denn dann ist etwas faul.
Autor: Peters (Gast)
Datum: 29.04.2008 18:18

Hallo Ernst,

Ich nutze den PICC von Htsoft. Leider kann ich keine assembler option
finden, die mir ein komplettes ASM File generiert. Es ist zwar
(angeblich) möglich mit dem subbefehl +keep die startup.as nach dem
linken zu behalten, doch dies war bei mir nicht möglich....

Meine Fehlerbeschreibung/Vorgehensweise sieht nun folgendermaßen aus:

Ich habe das powerup.as file zu meinem Projekt hinzugefügt, in dem kann
man die ersten Prozessorzyklen nach dem Reset für eigenen Code nutzen.
Dies sieht auch alles vollständig aus, heiß ein neues psec wird erzeugt
und powerup genannt. Ich habe mir nun gedacht dort könnte ich sowas wie:

movf Status, W
movlw _ResetStatus

eingeben, und in meinem Hauptprogramm dann einfach den _ResetStatus
auslesen und weiterverarbeiten. Leider Funktioniert das auch nicht, un
der _ResetStatus enthält immer 0. Im Disasembly ist der oben genannte
ASM-Code folgendermaßen übersetzt:

movf 0x3,0  -> das ist korrekt
movlw 0     -> das macht mich stutzig

den dort sollte doch eigentlich die Adresse meiner _ResetStatus
Variablen stehen? Die adresse des _ResetStatus ist im Mapfile mit rbss_0
0020 angegeben.

Ich weiß jetzt auch nicht weiter, die Assembler optionen -clear oder
-init haben auch nichts geändert, obwohl sie das Löschen der Variablen
beim Reset  verhindern sollen.

Es gibt noch die Option +resetbits, dort soll der STATUS status in einer
variablen __timeout gespeichert werden.... Ich find keine???

Irgendwelche PICC oder PIC Profis die mir tips geben könnten...

Entwicklungsumgebeung ist MPLAB IDE 8.0 und PICC Compiler

grüße
Autor: Bernd Rüter (bigwumpus)
Datum: 29.04.2008 23:28

Wenn Du den CLRWDT-Befehl ausführst, bevor Du TO abfragst, ist TO=1!

Sieh Dir den Code an!
Autor: Peters (Gast)
Datum: 30.04.2008 12:37

@ Bernd

Nach einem WDT Reset wird das TO Bit im Statusregister von der HW
gelöscht. Nach jedem anderen Reset wird das TO bit gesetzt, oder bleibt
unverändert. Wird nun also der Watchdog nicht rechtzeitig retriggert, da
die Funktion nicht zurückkehrt, Resetet er den uC -> TO = 0. Ich frage
logischerweise das T0 bit nach dem entry in die Mainschleife ab, da dies
der erste Punkt ist an dem der PC vorbeiläuft. Ich sehe jetzt nicht was
du meinst mit: "sieh dir den Code an!"

Der Watchdog läuft nur während der oben angegebenen Funktion also
zwischen SWDTEN = 1 und SWDTEN = 0. Deshalb muss ich CLRWDT auch
nirgends sonst im Programm verwenden, daher sollte das einzige CLRWDT in
eben dieser Funktion enthalten sein.
Autor: Severino R. (severino)
Datum: 30.04.2008 13:16

Peters wrote:

> movf Status, W
> movlw _ResetStatus
>
Was willst Du damit erreichen?
Du schreibst den Inhalt von Status nach W, anschliessend schreibst Du
den Wert (nicht Inhalt der Speicherstelle) _ResetStatus nach W.
Autor: Peters (Gast)
Datum: 30.04.2008 15:45

Hallo Severino,

uups, tippfehler:

Ich möchte den Inhalt des STATUS Registers in eine globale Variable
schreiben.
Es muss natürlich heißen (so stehts auch in meinem Code)

movf STATUS, W
movwf _ResetStatus

Das ist so richtig, oder?


(Ich glaub ich muss erst mal ein paar Bier auf dem Maifest pfetzen)
Autor: Peters (Gast)
Datum: 06.05.2008 13:09

Hallo,

folgendes löste das Problem:

1. anstelle der pic.h muss htc.h included werden.

2. den Linker mit der Option "--runtime=+resetbits" aufrufen.

Dann steht eine (bit) Variable __timeout zur Verfügung, auf die man eine
Abfrage starten kann.

Funktioniert wunderbar, und ist in wenigen sekunden eingebunden :|

Gruß

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net