Forum: Mikrocontroller und Digitale Elektronik Problem mit WMCON und Keil Assembler A51 für 8051


von LSC (Gast)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

Ist das dein Ernst?

Probier mal : mov WMCON,#03h

von Stephan H. (stephan-)


Lesenswert?

Du kannst aber auch davor noch
Mov 03h,#03h
schreiben.
Werte immer mit "#" ! Sonst ist eben von Speicherstellen die Rede.

von LSC (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Muß data sein und mit #:
1
LOC  OBJ            LINE     SOURCE
2
3
  0096                 1     WMCON data 96h
4
                       2
5
0000 759603            3     mov WMCON #03h


Peter

von LSC (Gast)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

>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.

von LSC (Gast)


Lesenswert?

@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.

von Peter D. (peda)


Lesenswert?

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

von LSC (Gast)


Lesenswert?

@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 :-)

von Gast (Gast)


Lesenswert?

>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.

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.