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)


Bewertung
0 lesenswert
nicht 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:
TCON: setb TR0  // TRO = 1
TMOD: setb M1
IEN0: setb EAL
      setb ET0

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

mov a, #100
mov count, a  // 100 Durchläufe
CLR P1.0


nun zur isr:

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

jb P1.0, m2
setb P1.0
jmp m1

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

pop    acc       ; Rückspeichern
pop    psw       ; Rückspeichern
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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

???

von Sven (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Sven schrieb:
> Habe ich einen Fehler in der Berechnung?

2 MHz entsprechen 500 ns und nicht 50 us.

von Achim S. (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.