Forum: Mikrocontroller und Digitale Elektronik Assembler 8051


von Lars K. (larsibaby)


Lesenswert?

Hallo,

ich habe da mal eine frage die für viele hier sicherlich leicht zu 
beantworten ist.
Und zwar handelt es sich um Timer.
ich habe mich zwar schon auf verschiedenen Seiten durchgelesen jedoch 
verstehe ich es nicht.
Vielleicht kann ja jemand ein einfache Beispiel hier posten zum Thema 
Timer.

Vielleicht in der Art:

Wenn P1.0 =1 starte Timer
Zeit =20 sek
wenn zeit abgelaufen dann P1.1 =1

Ich weiss nicht ob das mit den 20 sek. möglich ist


Danke
Gruß

Larsibaby

von Joe (Gast)


Lesenswert?

> Wenn P1.0 =1 starte Timer

jnb p1.0, $ ;warte bis P1.0 = 1
setb TR0    ;bei Verwendung von Timer0.

Das hilft dir noch nicht ;-))

Der Timer sollte die Betriebsart Timermodus 1, 16 BIT Timer eingestellt 
haben. Wann nun eine Sekunde erreicht ist bestimmt der Takt. 65536 = 
Timer0 Überlauf. Dieser benötigt entsprechend 65536 Maschinenzyklen.

Maschinenzyklus = CLOCK / 12, zumindestetens beim standard Typ.

Nun weißt du wie oft der Timer pro Sekunde überläuft. Bei 12 MHz 
entsprechen 20 Überläufe bei voreingestellten Timer = 1 Sekunde.

Du siehst, ein bischen Rechnen ist schon angesagt.

Laß den Timer diese Aufgabe im Interrupt erledigen und frage 
entsprechend auf Sekunde ab (siehe Beispiel Software RTC in der 
Codesammlung).

Nun meine Frage, Quarztakt, MC Typ ?

von Joe (Gast)


Lesenswert?

Hier ist es sehr schön erklärt:

http://www.8052.com/tutrtc.phtml

von Lars K. (larsibaby)


Lesenswert?

Weder noch,
ich mache gerade meinen Techniker und dieses Kapitel µC macht mir echt 
zuschaffen?

ich versuche gerade eine Ampelsteuerung zu programmieren die, wenn 
gestartet (P1.0) alle 20 sek. von grün auf rot schaltet.
In der ersten Stufe handelt es sich nur um 1 Ampel (grün & rot)
Sollte auf den ersten Blick einfach sein.
Die Ampel soll sich dann in einer Endlosschleife befinden und so langen 
umschalten bis P1.0 wieder 0 ist.
Das ist auch schon die ganze aufgabe :(

Mein Code bisher:

org 00h
  mov a,#0      ;lösche Inhalt AKku A
  mov p2,#0
  mov p1,#0

  jnb P1.0, start      ;wenn P1.0 =1 startet die Anlage
  setb tr0      ;starte Timer 0

Als erstes setze ich alles auf 0 ( macht man so sagte man mir)
Dann starte ich den Timer 0 wenn P1.0 =1 ist ( soweit ist alles klar )
Interrupt:
  setb EA       ;initialisiere Interrupt

Was ich noch nicht verstanden habe ist wie weise ich dem Timer eine zeit 
zu ? Also das ist mir echt ein Rätsel?

Wenn also bei 12 Hz 20 Überläufe 1sek. entspechen heißt das doch wenn 
ich 20 sek. haben möchte muss er 400 überlaufen (?) 20*20=400
Richtig?
Soweit so gut !

Danke

Lars

von Joe (Gast)


Lesenswert?

>  mov p1,#0

mov p1,#0FFh sollte da stehen ansonsten kann der PIN nicht abgefragt 
werden. Also den PIN 1 eins lassen und dann extern an Masse ziehen.

> muss er 400x überlaufen

so ist es.

> wie weise ich dem Timer eine zeit zu ?

Der Timer besteht aus einem HIGH sowie LOW Byte. Beispiel:
mov th0,#05h ; HIGHBYTE vorladen.
mov tl0,#10h ; LOWBYTE vorladen.

Auf der genannten Seite erledigt der preprozessor die Berechnung der 
Werte. In der ISR wird dann der Wert erneut geladen, du brauchst ja die 
genaue Sekunde und nicht irgendeinen Wert.

Alles klar ?

von Lars K. (larsibaby)


Lesenswert?

Aja, d.h. also der er die differenz von TH und TL bildet und das dann 
die zeit ist ? oder wie ?

das würde doch bedeuten das TH = 5  (Dezimal)
                            TL = 16 (Dezimal)
ergibt 11 Zyklen ? oder?
ca. 1 sek. wenn ich das richtig verstanden habe

wenn ich also 20 sek haben möchte muss TF0 20 mal 1 werden ?
dafür könnte ich dann einen zähler verwenden der nach 20 mal meine 
ausgängen schaltet








von Joe (Gast)


Lesenswert?

Also die Werte habe ich rein zufällig gewählt.

Zum Verständnis:
mov th0,#00h wobei h für hexadezimal steht
mov tl0,#00h

Timer HIGH & LOW Byte bilden ein 16 BIT Register. 16 BIT = 65536.

Der Timer wird von der System Clock, Clock/12 gespeist. Bei 12 MHz ist 
die Zeitbasis also 1 µSek. Der Timerüberlauf benötigt also genau 65536 
µSek. = 0.065536 mSekunden.

Schöner wäre es wenn der Timer also alle 0.05 mSek. überlaufen würde 
denn 0.05*20 = ?

Damit der Timer das auch macht wird er mit einem entsprechenden Wert 
vorgeladen. Formel zur Berechnung ist super erklärt (siehe Link).

Nun begriffen ? oder liegts am Englisch ?

von Lars K. (larsibaby)


Lesenswert?

Tue mir ein bissl schwer :( sorry !

aber jetzt nochmal langsam

clock / 12
11059200 / 12 = 921600
um aber eine gerade zahl zu haben wird der wert mit 0,05 multipliziert
ergibt 46080 diesen wert muss ich noch von 65536 abziehen
das ergibt dann 19456 diesen wert muss ich nun in TH und TL laden als 
hex versteht sich also 4C00 dann braucht der timer für einen überlauf 
genau 1/20 sek. er muss nun 20 überlaufen um 1 sek. zu erreichen .

ich hoffe das ich es jetzt richtig verstanden habe



von Joe (Gast)


Lesenswert?

So stimmt es, gut gemacht. Nun das Ganze zu einem sinnvollen Programm 
zusammenbauen. Die ISR liefert dir die genaue Sekunde.

Der Rest sollte einfach sein. Laß doch deinen Ausgang einfach mal per 
ISR im Sekundentakt ein/ausschalten. Dann bist du der Lösung schon sehr 
nahe.

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.