Problem mit WMCON und Keil Assembler A51 für 8051

Gast #1496684
Hallo Alle,

ich hab das Problem, dass ich ein altes Projekt (ATMEL AT89S8252) 
übernommen habe. Nun soll ich ein paar Bytes an Code einsparen. Der 
einfachste Weg wäre der den HW watchdog zu verwenden, anstatt den 
Selbstgeschriebenen.
Im Datenblatt gibt es dafür das Register WMCON. Mit dem C-Compiler (C51) 
lässt sich dieses Register auch ändern. Mit dem Assembler scheint es 
aber nicht zu funktionieren.

Mein Assemblercode lautet (und so sollte es laut Assemblerspec 
funktionieren) :

WMCON sfr 96h    ; das WMCON Register befindet sich an Adresse 0x96

mov WMCON 03h    ; wdtreset enable wdt enable

die Zuweisung "sfr" scheint er nicht zu kennen. Benutze ich aber "data" 
schreibt er die 0x03 einfach ins RAM.

Gibt es irgendwelche anderen Möglichkeiten für eine Zuweisung auf ein 
SFR?
Gast
Hallo,

@Gast: Das Register WMCON kennt er nicht (im Gegensatz zu TCON).

@Stephan:

Sorry Schreibfehler. Zeile lautet:

  mov WMCON,#03h ; wdtreset enable wdt enable

Was soll mir "mov 03h,#03h" bringen?
Ich hab schon "mov 96h,#03h" versucht, funktioniert aber auch nicht.
Gast
Erstmal danke für eure Hilfe. Leider hab ich schon alles ausprobiert und 
nichts hat funktioniert.

@Peter:

Mit data schreibt er es nur ins RAM. Das Register ist aber ein SFR.

Im C-Compiler muss ich das WMCON Register aus explizit als SFR Register 
deklarieren.
Persönliche Seite
LSC schrieb:

> Mit data schreibt er es nur ins RAM. Das Register ist aber ein SFR.
>
> Im C-Compiler muss ich das WMCON Register aus explizit als SFR Register
> deklarieren.

Geht es jetzt um Assembler oder C?

Der C-Compiler muss wissen, dass WMCON ein SFR ist, weil er es anders 
behandeln muss als eine gewöhnliche Variable in einer RAM-Zelle. Z.B. 
müssen alle Zugriffe instantemente durchgereicht werden und Zugriffe 
dürfen nicht wegoptimiert werden (Stichwort volatile). In Assembler ist 
diese Info nicht nötig bzw. programmierst DU entsprechend. Soweit ich im 
Instruction Set lese, gibt es bei der direct Addressierung keinen 
grundlegenden Unterschied zwischen SFR und RAM.

Bist du mal der Frage nachgegangen, wieso WMCON bei deinem Keil 
Assembler A51 für 8051 nicht bekannt ist? Arbeitest du eventuell mit dem 
falschen Target-µC?

Hast du mal kontrolliert, ob du mit dem Wert 0x03 (= WDTEN | WDTRST) 
gleichzeitig den Watchdog enablen und resetten darfst oder ob dazu 
getrennte Anweisungen nötig sind? Ich weiss auch nicht wie die Umgebung 
um diese Stelle in deinem Programm aussieht; ich würde aber 
programmlogisch einen getrennten Enable-Teil und einen Reset-Teil 
erwarten.
Gast
>Mit data schreibt er es nur ins RAM. Das Register ist aber ein SFR.

Nein, das RAM oberhal 7Fh ist nur indirekt ansprechbar. die 03h
müssen also im SFR landen.
Gast
@Gast

Stimmt hast recht. Er schreibt es nicht ins RAM. Leider aber auch nicht 
ins SFR Register.
Wahrscheinlich liegts an dem uralten Assembler. Der erkennt nicht, dass 
das kein Standard 8051 sondern ein erweiterter 8051 mit zusätzlichen 
SFRs ist.

Mit dem Seehau (ICE/Debugger) kann ich das WMCON auch nicht ändern. Nur 
die StantardSFRregister vom 8051.

Also muss ich mir nen neuen Assembler (am besten kostenlos) suchen.

Danke für eure Hilfe.
LSC schrieb:
> Stimmt hast recht. Er schreibt es nicht ins RAM. Leider aber auch nicht
> ins SFR Register.

Woher willst Du das wissen?
Diese Bits sind ja nicht rücklesbar.

> Wahrscheinlich liegts an dem uralten Assembler. Der erkennt nicht, dass
> das kein Standard 8051 sondern ein erweiterter 8051 mit zusätzlichen
> SFRs ist.

Das muß er auch nicht, er erzeugt nur den Befehl 75h mit 2 Argumenten 
und gut is.
Jeder 8051-Assembler geht für jeden 8051-Typ ohne Ausnahme.


Peter
Gast
@Peter:

>> Stimmt hast recht. Er schreibt es nicht ins RAM. Leider aber auch nicht
>> ins SFR Register.

>Woher willst Du das wissen?
>Diese Bits sind ja nicht rücklesbar.

Ist nur das WMCON Register nicht rücklesbar? Mit meinem ICE (SEEHAU) 
kann ich nämlich die anderen SFRs beschreiben und lesen (in der IDE).

Und auch wenn es nicht lesbar wäre, müsste er doch wenigsten einen 
Watchdogreset auslösen :-(

>> Wahrscheinlich liegts an dem uralten Assembler. Der erkennt nicht, dass
>> das kein Standard 8051 sondern ein erweiterter 8051 mit zusätzlichen
>> SFRs ist.

>Das muß er auch nicht, er erzeugt nur den Befehl 75h mit 2 Argumenten
>und gut is.
>Jeder 8051-Assembler geht für jeden 8051-Typ ohne Ausnahme.

Ja stimmt. Meine Frau sagt schon immer zu mir :Erst denken, dann 
schreiben :-)
Gast
>Ist nur das WMCON Register nicht rücklesbar? Mit meinem ICE (SEEHAU)
>kann ich nämlich die anderen SFRs beschreiben und lesen (in der IDE).

Das geht schon, wenn du die SFR-Adresse direkt angibst:

mov A,96h

Oder umgekehrt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.