Forum

Einloggen | Registrieren | RSS  

Tootall(R)

08.03.2009,
17:14
 

Probleme mit Timer0 beim AT89S8253 (Computertechnik)

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

Der Gast

08.03.2009,
18:07

@ Tootall

Probleme mit Timer0 beim AT89S8253

Was funktioniert denn nicht so genau?
-> Beschreiben ;)


Eine PWM sollte auch viel einfacher gehen:
Du konfigurierst den Output Compare Match so das er
100 mal in der Sekunde anspringt und dann stellst
du den Timer so ein das er den passenden
Pin einfach nur Inventiert.. voila 50Hz PWM
mit 50:50 Tastverhältnis in Hardware.

Tootall(R)

08.03.2009,
18:43

@ Der Gast

Probleme mit Timer0 beim AT89S8253

Hi ;-)
PWM = PulsweitenMODULATION
Das soll eine Motorsteuerung sein ich muß von 0-100% alles anfahren.

http://de.wikipedia.org/wiki/Pulsweitenmodulation

» Was funktioniert denn nicht so genau?
» -> Beschreiben ;)
»
»
» Eine PWM sollte auch viel einfacher gehen:
» Du konfigurierst den Output Compare Match so das er
» 100 mal in der Sekunde anspringt und dann stellst
» du den Timer so ein das er den passenden
» Pin einfach nur Inventiert.. voila 50Hz PWM
» mit 50:50 Tastverhältnis in Hardware.

Der Gast

08.03.2009,
18:57

@ Tootall

Probleme mit Timer0 beim AT89S8253

Nun gut hätte ja eine fixe sein können =)

Aber was eine Pulswellenmodulation macht weiß ich ;)

Tootall(R)

08.03.2009,
19:10

@ Der Gast

Probleme mit Timer0 beim AT89S8253

;-)



» Nun gut hätte ja eine fixe sein können =)
»
» Aber was eine Pulswellenmodulation macht weiß ich ;)

AKA

01.04.2009,
20:15

@ Tootall

Probleme mit Timer0 beim AT89S8253

» PWM_2_ENDE:
»
» RETI
» END

Um einen Interrupt auszulösen, was du ja scheinbar vorhast musst du allerding auch vor der entsprechenden Interruptroutine das code segment mit cseg at ... angeben

je nachdem musst du evtl deine routine im code speicher weiter nach oben legen da du sonst overlay bekommst

cseg at 08H //z.b. findet sich im datenblatt
PWM_2_ENDE:
// interruptfunktion
RETI

Warum programmierst du das ding eigendlich nicht in C??
compiler gibt es genügend anständige und du brauchst dir keine gedanken um den stack machen

hoffe geholfen zu haben
10100111001