Forum: Mikrocontroller und Digitale Elektronik 8051 Timer0 initialisieren


von Sven (Gast)


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

von Route_66 H. (route_66)


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???

von Sven (Gast)


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?

von Route_66 H. (route_66)


Lesenswert?

Sven schrieb:
> Wird P1.0 so jede 1,6ms

???

von Sven (Gast)


Lesenswert?

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.

von Mario M. (thelonging)


Lesenswert?

Sven schrieb:
> Habe ich einen Fehler in der Berechnung?

2 MHz entsprechen 500 ns und nicht 50 us.

von Achim S. (Gast)


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

von Sven (Gast)


Lesenswert?

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 ?

von Achim S. (Gast)


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.

von Sven (Gast)


Lesenswert?

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! :)

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.