8051 Timer0 initialisieren

Gast #5151209
Lesenswert?

Hallo, ich habe eine Frage zum Timer0 des Prozessors 8051 (24MHz).
Ich möchte diesen im Modus 2 (8 Bit- Auto Reload) mit t=1s betreiben.
Port 1.0 soll an und ausgeschaltet werden.
Dazu hatte ich folgenden Ansatz:

Timerfrequenz: 1/12 * 24MHz = 2000000
Timerperiode: 1/Timerfrequenz = 50ys
1s / 50ys = 20000 Befehlszyklen
ein 8 Bit Timer kann höchstens 2^8 =256 Zyklen machen, was zu klein ist, 
deshalb benutze ich eine Schleife und lade den Timer mit 56 vor, sodass 
ich eine Schleife mit 20.000 / 200 = 100 Durchläufen benötige. soweit 
die Theorie.

nun zu den Special-Function-Registern:
1
TCON: setb TR0  // TRO = 1
2
TMOD: setb M1
3
IEN0: setb EAL
4
      setb ET0
5

6
variablen im CODE-Segment:
7
mov a, #56
8
mov TH0, a
9
mov TH1, a  // Timer vorladen, sodass noch 200 Schritte benötigt werden
10

11
mov a, #100
12
mov count, a  // 100 Durchläufe
13
CLR P1.0
14

15

16
nun zur isr:
17

18
isr_timer0:
19
push psw
20
push acc
21
djnz count ,m1  ; Prüfen ob count_L nicht null ist, springe zu m1 wenn 0
22
mov count, #100  // count wieder mit 100 laden
23

24
jb P1.0, m2
25
setb P1.0
26
jmp m1
27

28
m2: clr P1.0  // einfach Port 1.0 ausschalten, hier nicht relevant
29
     
30
m1: 
31

32
pop    acc       ; Rückspeichern
33
pop    psw       ; Rückspeichern
34
reti


Ist das in der Theorie so richtig? Wird P1.0 so jede 1,6ms an und 
ausgeschaltet?

MfG Sven
#5151231
Lesenswert?

Sven schrieb:
> TMOD: setb M1

Das Bit M1 gibt es zwei mal im TMOD-Register

> mov TH0, a
> mov TH1, a  // Timer vorladen, sodass noch 200 Schritte benötigt werden

Was nun, Timer0 oder Timer1?
Du solltest TL0 auch laden, sonst stimmt der erste Durchlauf nicht. (ist 
aber meist unwichtig)

Sven schrieb:
> Ist das in der Theorie so richtig? Wird P1.0 so jede 1,6ms an und
> ausgeschaltet?

wolltest du nicht etwas im Sekundenbereich???
Gast #5151237
Lesenswert?

Route 6. schrieb:
> Das Bit M1 gibt es zwei mal im TMOD-Register
>
>> mov TH0, a
>> mov TH1, a  // Timer vorladen, sodass noch 200 Schritte benötigt werden
>
> Was nun, Timer0 oder Timer1?
> Du solltest TL0 auch laden, sonst stimmt der erste Durchlauf nicht. (ist
> aber meist unwichtig)

sorry, sollte heißen:

 mov TH0, a
 mov TL0, a

Route 6. schrieb:
> wolltest du nicht etwas im Sekundenbereich???

genau, wollte ich. Habe ich einen Fehler in der Berechnung?
Gast #5151266
Lesenswert?

Dein Code zum Initialisieren der SFR wird so nicht funktionieren. Z.B.

Sven schrieb:
> TMOD: setb M1

TMOD ist nicht Bit-adressierbar, M1 ist nicht eindeutig (mehrfach 
vorhanden für die verschiedenen Zähler).


Dein Konstrukt zum Toggeln von P1.0 dürfte zwar funktionieren, aber du 
könntest du einfacher haben:

Sven schrieb:
> jb P1.0, m2
> setb P1.0
> jmp m1
>
> m2: clr P1.0  // einfach Port 1.0 ausschalten, hier nicht relevant

macht das selbe wie
CPL P1.0
Gast #5151279
Lesenswert?

Sven schrieb:
> Könnte ich schreiben:
>
> mov a,b'00000010'
> ORL a,TMOD

schon besser, aber noch falsch ;-)

mov a,b'00000010'  ist die falsche Adressierung. Damit bekommst du den 
Inhalt von Adresse 2, nicht den Wert 2

 ORL a,TMOD damit wäre der Wert erst in a, noch nicht in tmod

funktionieren sollte

ORL TMOD,#2

Die 2 darfst du gern auch in hex oder binär schreiben, da kommt das 
Format evtl. auf den eigesetzten Assembler an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren