Forum: Mikrocontroller und Digitale Elektronik 8051 Timer0 initialisieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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! :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.