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
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???
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?
Route 6. schrieb:> Sven schrieb:>> Wird P1.0 so jede 1,6ms>> ???
da habe ich 2 Sachen vertauscht. Der Port sollte jede Sekunde aktiviert
/ deaktiviert werden.
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
Achim S. schrieb:> TMOD ist nicht Bit-adressierbar, M1 ist nicht eindeutig (mehrfach> vorhanden für die verschiedenen Zähler).
Könnte ich schreiben:
mov a,b'00000010'
ORL a,TMOD
?
so würde ich das bit ja setzten, ohne das TMOD register zu verändern,
oder ?
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.
Achim S. schrieb:> 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.
stimmt, da habe ich nicht richtig nachgedacht. Vielen Dank! :)