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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.