Forum: Mikrocontroller und Digitale Elektronik Problem mit MOVC beim AT89C51CC03


von HolgerT (Gast)


Lesenswert?

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
7
0841 900846  =1     MOV     DPTR,#SerBaudTable  ;Tabellenanfang setzen
8
0844 93      =1     MOVC    A,@A+DPTR           ;jetzt umcodieren
9
0845 22      =1     RET
10
             =1
11
0846         =1  SerBaudTable:          ;11,0592 MHz / SMOD =1
12
0846 FA      =1       DB      256-6     ;0 - default 9600 Baud ;
13
0847 00      =1       DB      0         ;1 - reserviert, 0=Keine Aenderung
14
0848 00      =1       DB      0         ;2 - reserviert, 0=Keine Aenderung
15
0849 00      =1       DB      0         ;3 - reserviert, 0=Keine Aenderung
16
084A 40      =1       DB      256-192   ;4 - 300
17
084B A0      =1       DB      256-96    ;5 - 600
18
084C D0      =1       DB      256-48    ;6 - 1200
19
084D E8      =1       DB      256-24    ;7 - 2400
20
084E F4      =1       DB      256-12    ;8 - 4800
21
084F FA      =1       DB      256-6     ;9 - 9600
22
0850 FC      =1       DB      256-4     ;10 - 14400
23
0851 FD      =1       DB      256-3     ;11 - 19200
24
0852 FE      =1       DB      256-2     ;12 - 28800
25
0853 00      =1       DB      0         ;13 - 38400 0=nicht moeglich mit 11MHz
26
0854 FF      =1       DB      256-1     ;14 - 57600
27
0855 00      =1       DB      0         ;15 - 115200 0=nicht moeglich mit 11MHz

von Peter D. (peda)


Lesenswert?

Das Programm sieht o.k. aus.
Der Fehler wird daher in dem Code sein, den wir nicht sehen.


Peter


P.S.:
Mit T2 kannst Du die Baudrate feiner einstellen.

von Stephan (Gast)


Lesenswert?

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

von HolgerT (Gast)


Lesenswert?

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

von HolgerT (Gast)


Lesenswert?

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

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.