Forum: Mikrocontroller und Digitale Elektronik brauche Hilfe für Timer Programmierung :-)


von Ertan M. (drbrain)


Lesenswert?

Hallo zusammen ich habe ein riesen Problem und einige Fragen zu meinem
Assembler Programm. Programmfunktion Uhr mit Überlauferkennung

1)Frage

worin liegt der Unterschied zwischen den Befehelen mov a,xx und mov
a,#xx
was bewirkt dieses Raute Zeichen bei der Zuweisung ?
diese Frage stelle ich nicht umsonst weil ich im Unterprogramm
LCD_Zeitausgabe (s.u) keine LCD Ausgabe bekomme wenn die den Akkumulator
mit mov a,#xx fülle folgendes wird dann auf dem Display gezeigt
[124:125:126] und ohne dieses Rautezeichen bekomme ich das ewünschte
Ergebnis.


2)Frage
wenn ich meine Zeitvariablen mit anderen Werten initialisiere z.B.
mov Minuten,#10
mov Stunden,#5
mov Sekunden,#1

startet die Uhr immer noch bei 00:00:00 wieso ?
was muss ich machen um die mit den vorinitialisierten Werten die Uhr
starten zu lassen ?


3)Frage
wenn ich meinen Controllerboard resete dauert es ungefähr 5 Sek bis die
Uhr anfängt loszulaufen wieso ?
jedoch wenn ich nach dem init:
[main: sjmp main] reinmache läuft die Uhr bei reset sofort los !


4) Überlauferkennung funktioniert jetzt auch nicht mehr :-(



include c51ed2.inc

Extern Code
initLCD,loeschen,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorp 
os,cursoran,cursoraus
Extern Code
textaus,zifferaus,hexaus,dezaus,dualaus,dualaus1,dualaus2,charaus
Extern Code
definierezeichen,loeschzeile3,loeschzeile4,textzeile3,textzeile4


Stunden  equ 07ch  ; Variablen im Internen RAM anglegen direkt unter dem
SFR Register
Minuten  equ 07dh  ; Speicherbereich geht von 00h 007FH
Sekunden equ 07Eh
Zaehler  equ 07Fh

; Konstanten definieren
Takt equ 12000000 ; Systemtakt 12 Mhz. s.Datenblatt
Perioden equ 12   ; 12 Perioden auf 6 Zyklen verteilt
TMR_SEC equ Takt/Perioden ; benötigte Zeit um ein Befehl ausführen zu
können Maschinenzyklus
Nachladewert equ 15536 ; Timer Nachladewert Autoreload

org 000h


lcall initLCD              ; LCD wird initialisiert
lcall loeschen             ; LCD Display wird gelöscht

ljmp init

org 001bh                  ; Einsprugsadresse für ISR Timer1 Überlauf
push acc                   ; Akkumulator wird im Stack gesichert
push psw                   ; Programm Status Word wird im Stack
gesichert
CLR TR1                    ; Timer1 wird (TCON Register) abgeschalten um
nachladen zu können s.u
mov TH1,#High Nachladewert ; High Byte von Timer1 wird geladen
mov TL1,#Low  Nachladewert ; Low  Byte von Timer1 wird geladen
Setb TR1                   ; Timer1 wird wieder gestartet da der Low und
High Register nachgeladen wurde

DJNZ Zaehler,Exit          ; Springt zu Exit wenn der Zaehler ungleich 0
ist
mov Zaehler,#20            ; Zaehler wird wieder nachgeladen da 1
Sekunden erreicht wurde Rechnung: 50000 Zaehlung = 0.05 Sekunden *20 =
Sekunde ist
inc Sekunden               ; erhöht den Inhalt von Sekunden um Wert 1
mov a,#Sekunden            ; kopiert den Inhalt von Sekunden in den
Akkumulator
CJNE a,#60,Exit            ; vergleicht den Inhalt von von Akkumulator
mit der Konstanten 60 und verzweigt bei ungleichheit
mov Sekunden,#0            ; der Inhalt von Sekunden wird auf 0 gesetzt
da 60 Sekunden vergangen sind
inc Minuten                ; erhöht den Inhalt von Minuten um den Wert 1
mov a,#Minuten             ; kopiert den Inhalt von Minuten in den
Akkumulator
CJNE a,#60,Exit            ; vergleicht den Inhalt von von Akkumulator
mit der Konstanten 60 und verzweigt bei ungleichheit

mov Minuten,#0             ; der Inhalt von Minuten wird auf 0 gesetzt
da 60 Minute vergangen sind
inc Stunden                ; erhöht den Inhalt von Stunden um den Wert 1
da 60 Minuten vergangen sind
mov a,#Stunden             ; kopiert den Inhalt von Stunden in den
Akkumulator
CJNE a,#24,Exit            ; vergleicht den Inhalt von Akkumulator mit
der Konstante 24 und verzweigt bei ungleichheit
mov Stunden,#0             ; setzt den Wert von Stunden 0, da 24 Stunden
vergangen sind.
Exit:
call LCD_Zeitausgabe       ;
pop psw                    ; Programm Status Word wird wieder vom Stak
hergestellt
pop acc                    ; Akkumulator wird wieder vom Stack
hergestellt
reti                       ; Interrupt Service Routine wird wieder
verlassen


init:
mov TH1,#High Nachladewert ; High Byte von Timer1 wird geladen
mov TL1,#Low  Nachladewert ; Low  Byte von Timer1 wird geladen
mov TMOD,#00010000b        ; Timer 1 im Modus 1 {16 Bit Timer ohne Auto
Reload wird aktiviert}
Setb TR1                   ; Timer1 wird aktiviert bzw. gestartet
mov Stunden,#0             ; Variable Stunden im internen RAM wird
initialisiert  s.o
mov Minuten,#0             ; Variable Minuten im internen RAM wird
initialisiert  s.o
mov Sekunden,#0            ; Variable Sekungen im internen RAM wird
initialisiert s.o
mov Zaehler,#20            ; Variable Zaehler im internen RAM wird
initialisiert s.o
Setb ET1                   ; Timer1 Überlauf wird aktiviert
Setb EA                    ; Globale Freigabe für die Interrupts im IEN0
Interrupt Enable Register



;main:

;sjmp main

LCD_Zeitausgabe:
push acc
push psw
mov dptr,#text            ; Datenpointer auf doppelpunkt
mov a,#00                 ; Akkumulator wird auf 1 gesetzt
lcall cursorpos           ; Cursorposition LCD wird auf 0 gesetzt
mov a,Stunden             ; in den Akkumulator wird der Inhalt von
Stunden geschrieben
lcall dezaus              ; Stunden wird auf dem Display angezeigt
mov a,#04                 ; Akkumulator wird auf 5 gesetzt
lcall cursorpos           ; Cursorposition wird auf 05
lcall textaus             ; Doppelpunkt wird eingefügt
mov a,Minuten             ; in den Akkumulator wird der Inhalt von
Minute geschrieben
lcall dezaus
mov a,#9                  ; Akkumulator wird auf 10 gesetzt
lcall cursorpos
lcall textaus             ; doppelpunkt wird auf Position ausgegeben
mov a,Sekunden            ; in den Akkumulator wird der Inhalt von
Sekunden geschrieben
lcall dezaus              ; Stunden wird auf dem Display angezeigt
text:  db ':',0
pop psw
pop acc
ret


end.

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.