Hallo,
ich habe beim o.g. uC ein Problem mit dem MOVC-Befehl. Dieser äußert
sich, indem scheinbar während der Ausführung von MOVC zum Ergebnis, das
in ACC gespeichert wird, noch 1 addiert wird.
Mein Beispielcode (s.u.) kommt mit ACC=0FBh aus dem Unterprogramm, wenn
pcSerialSpeed=0 ist. Wird beispielsweise pcSerialSpeed=11dez gesetzt,
ist ACC=0FEh bei Ausführung des RET-Befehls.
Hat irgend jemand eine Idee dazu?
Danke und Gruß - Holger
1
:
2
:
3
083D 7400 =1 MOV A,#pcSerialSpeed
4
=1 ;in A steht jetzt die gewünschte Baudrate (codiert)
5
=1 ;verrechnen mit CPU-Freq
6
083F 540F =1 ANL A,#00001111B ;nur Zahlen zwischen 0..F
Dann hat Dein Akku immer mindestens den Wert von 1.
Nulle den Akku bevor Du ihn mit dem Wert der Baudrate fütterst.
Zum Test kannst du ihn ja einfach mal mit "fixen" Werten laufen lassen.
Deine Darstellung sieht etwas komisch aus, sollte aber gehen.
Falls Du den Fehler nicht findest und er konstant ist, mache einfach
vor dem Sprung in die Tabelle ein "DEC A "und gut ist.
ein Beispiel von mir, viel. hilft es...
MOV DPTR,#tabelle_init
MOV B,#9h
init2: MOV A,#0h
MOVC A,@a+dptr
usw...
tabelle_init: DB 30h,30h,30h,20h,28h,08h,01h,06h,0fh
@Peter, @Stephan: Vielen Dank, dass Ihr den Code mal angesehen habt.
@Peter: Du wirst (wie so oft) richtig liegen. Etwas verwirrt hatte mich,
als ich mir testweise den ACC vor und nach MOVC an ein LCD ausgegeben
hatte - ich meinte eindeutig zu erkennen, dass MOVC zum Wert, der aus
dem CODE-ROM geholt wurde noch eins addiert hat. Da ich die Routine
schon mit einem AT89S8252 länger benutze und bisher keine Probleme mit
der UART-Geschwindigkeit feststellte, glaubte ich schon an ein Problem
mit dem ..CC03. Das Problem ist seit dem radikalen Einkürzen auf
wesentliche Teile in einem Testprogramm nicht mehr existent. Leider kann
ich (nach vielen weiteren Änderungen) auch mit dem original Quelltext
das fehlerhafte Verhalten nicht mehr erzeugen. Vielleicht doch wieder
mal nur zu lange programmiert...
@Stephan: Dein Beispiel verstehe ich nicht. M.E. wird damit immer die
erste 30h der Tabelle zurückgegeben, ACC=0 per Definition! Was soll "MOV
B,#9h" bewirken? Spielt B auch in den "MOVC A,@a+dptr"-Befehl? Habe ich
da seit 8 Jahren was übersehen?
Vielen Dank nochmal für die Antworten.
So, die Ursache ist erkannt. Es war weder der MOVC-Befehl noch speziell
der AT89C51CC03 der Grund des Verhaltens.
Duch die Auslagerung der Initialisierungen der Register TMOD, TCON, TH1,
TL1 in verschiedene Unterprogramme kam es dazu, dass das Laden von TH1
und TL1 und Starten von Timer-1 VOR dem Setzen des Zählermodus (Register
TMOD, TCON) erfolgte. Das hatte zur Folge, dass TH1 und TL1 schon einmal
inkrementiert waren, als das Setzen des Modus erfolgte.
Merke: Beim Setzen der Zählerregister immer folgende Reihenfolge
einhalten:
1. TMOD, TCON
2. THx, TLx
3. Start des Zählers