mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit MOVC beim AT89C51CC03


Autor: HolgerT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
                   :
                   :
083D 7400    =1     MOV     A,#pcSerialSpeed
             =1     ;in A steht jetzt die gewünschte Baudrate (codiert)
             =1     ;verrechnen mit CPU-Freq
083F 540F    =1     ANL     A,#00001111B        ;nur Zahlen zwischen 0..F
0841 900846  =1     MOV     DPTR,#SerBaudTable  ;Tabellenanfang setzen
0844 93      =1     MOVC    A,@A+DPTR           ;jetzt umcodieren
0845 22      =1     RET
             =1
0846         =1  SerBaudTable:          ;11,0592 MHz / SMOD =1
0846 FA      =1       DB      256-6     ;0 - default 9600 Baud ;
0847 00      =1       DB      0         ;1 - reserviert, 0=Keine Aenderung
0848 00      =1       DB      0         ;2 - reserviert, 0=Keine Aenderung
0849 00      =1       DB      0         ;3 - reserviert, 0=Keine Aenderung
084A 40      =1       DB      256-192   ;4 - 300
084B A0      =1       DB      256-96    ;5 - 600
084C D0      =1       DB      256-48    ;6 - 1200
084D E8      =1       DB      256-24    ;7 - 2400
084E F4      =1       DB      256-12    ;8 - 4800
084F FA      =1       DB      256-6     ;9 - 9600
0850 FC      =1       DB      256-4     ;10 - 14400
0851 FD      =1       DB      256-3     ;11 - 19200
0852 FE      =1       DB      256-2     ;12 - 28800
0853 00      =1       DB      0         ;13 - 38400 0=nicht moeglich mit 11MHz
0854 FF      =1       DB      256-1     ;14 - 57600
0855 00      =1       DB      0         ;15 - 115200 0=nicht moeglich mit 11MHz

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HolgerT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HolgerT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.