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
> 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 ?
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
> 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 ?
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
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 ?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.