Forum: Mikrocontroller und Digitale Elektronik Probleme mit Timer0 beim AT89S8253


von TOOTALL (Gast)


Lesenswert?

Hi und einen schönen Abend euch allen !

Ich Habe ein Problem mit meinem µC (AT89S8253) Ich versuche den Timer0 
zum Laufen zu bringen!
Ich will mit dem Timer eine PWM mit 50Hz machen, all das was im Timer0 
steht habe ich mal unten eingefügt.
Was muss ich dabei alles beachten (vielleicht habe ich ja was vergessen 
IE, TMOD, TCON, TH0, TL0 ich habe echt keine Idee mehr warum das nicht 
geht).

; Flag löschen
CLR TF0 ; Überlaufflag für Timer 0 löschen

;----------------------------------------------------------------------- 
---------------
; PWM2
;----------------------------------------------------------------------- 
---------------
; Erhöhe den Wert PWM_2_CNT um 1
MOV R0, #PWM_2_CNT ;Schreibe die Adresse für PWM_2_CNT nach R0
MOV A , @R0 ;Schreibe den Wert aus Adresse R0 nach A
INC A ;Erhöhe den wert in A um 1
MOV @R0, A ;Schreibe den Wert aus A an die Speicherstelle die in R0 
liegt


; Vergleiche den Wert PWM_2_CNT mit PWM_1_SCHALTGRENZE
; Wenn PWM_2_CNT = PWM_2_SCHALTGRENZE, dann Portpin auf LOW setzen
; Sonst HIGH
MOV R0 , A ;Schreibe den Wert aus A nach R0
MOV R1 , #PWM_2_SCHALTGRENZE_ISR ;Schreibe die Adresse für 
PWM_1_SCHALTGRENZE nach R1
MOV A , @R1 ;Schreibe den Wert aus Adresse R1 nach A
CLR C ;Vor der Subtrahktion den Überlauf für negative Ergebnisse Löschen
SUBB A , R0 ;Subtrahiere von A R0 (PWM_2_CNT - PWM_2_SCHALTGRENZE
JC PORTPIN_PWM_2_AUF_LOW ;Sprige wenn C gesetzt ist (PWM_2_CNT > 
PWM_2_SCHALTGRENZE)
JZ PORTPIN_PWM_2_AUF_LOW ;Sprige wenn A Null ist (PWM_2_CNT = 
PWM_2_SCHALTGRENZE)
SETB P3.4 ;Setze Pin P3.4 (Ausgabe PWM2 an P3.4)
SJMP ENDE_VERGLEICH_PWM2 ;Springe zu ENDE_VERGLEICH_PWM2
PORTPIN_PWM_2_AUF_LOW:
CLR P3.4
ENDE_VERGLEICH_PWM2:

; Vergleiche den Wert PWM_2_CNT mit PWM_2_MAX
; Wenn PWM_2_CNT = PWM_2_MAX, dann PWM_2_CNT auf Null setzen
MOV R1 , #PWM_2_MAX ;Schreibe die Adresse für PWM_2_MAX nach R1
MOV A , @R1 ;Schreibe den Wert aus Adresse R1 nach A
CLR C ; Carry löschen
SUBB A , R0 ; Sind die Werte in A und R0 glerich -> PWM_1_CNT 
zurücksetzen
JNC ZURUECKSETZEN_VON_PWM_2_CNT ; Der Wert PWM_2_CNT ist gleich dem 
Maximum PWM_2_MAX oder grösser
JZ ZURUECKSETZEN_VON_PWM_2_CNT ; Der Wert PWM_2_CNT ist gleich dem 
Maximum PWM_2_MAX
SJMP PWM_2_ENDE

ZURUECKSETZEN_VON_PWM_2_CNT:
MOV R0 , #PWM_2_CNT ; Lade die Adresse von PWM_2_CNT in R0 und ...
MOV @R0, #00H ; schreibe an diese Adresse den Wert 0

JNB Neue_PWM_Daten, PWM_2_ENDE ; Springt wenn noch kein neuer Wert 
geladen ist

MOV R0 , #PWM_1_SCHALTGRENZE ; Schreibe die Adresse für 
PWM_1_SCHALTGRENZE nach R0
MOV A , @R0 ; Schreibe den wert aus PWM_1_SCHALTGRENZE nach A
MOV R0 , #PWM_1_SCHALTGRENZE_ISR ; Schreibe die Adresse für 
PWM_1_SCHALTGRENZE_ISR nach R0
MOV @R0 , A ; Schreibe den wert aus PWM_1_SCHALTGRENZE nach 
PWM_1_SCHALTGRENZE_ISR
MOV R0 , #PWM_2_SCHALTGRENZE ; Schreibe die Adresse für 
PWM_2_SCHALTGRENZE nach R0
MOV A , @R0 ; Schreibe den wert aus PWM_2_SCHALTGRENZE nach A
MOV R0 , #PWM_2_SCHALTGRENZE_ISR ; Schreibe die Adresse für 
PWM_2_SCHALTGRENZE_ISR nach R0
MOV @R0 , A ; Schreibe den wert aus PWM_2_SCHALTGRENZE nach 
PWM_2_SCHALTGRENZE_ISR

CLR Neue_PWM_Daten ; Nachladen beendet

PWM_2_ENDE:

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