Hi MrQu,
ich hab zwar nicht so viel Ahnung von Timern aber würde mal deinen Titel ändern denn da steht du hast keine Probleme mit Timern ich denk es soll kleine Probleme heißen!
Gruß Michi
Ein Servus an Euch, **
habe ein paar Fragen und Probleme mit den Von und Zu Timern *grins*
Ich benutze den ATtiny26L und betreibe ihn mit folgenden Einstellungen:
- Spannung 3,3V
- Takt intern 1 MHz
- Rev.-Spannung intern 2,56V
- Resetschaltung extern
Ich möchte einen Timer nutzen um alle 1,5 Sec. einen Ausgang auf PortA für ca. 0,5 Sec. einzuschalten (Timer 0)
Ich möchte den zweiten Timer nutzen um alle 30 Sec. zwei Ausgänge auf PortA für ca. 500 uSec. einzuschalten. (Timer 1)
Diese zwei Ausgänge sind ein Taktsignal für eine andere Elektronik.
Der sonstige Programmablauf den die CPU erledigen soll, soll durch diese Timerzugriffe nicht beeinträchtigt werden.
Frage 1:
Das mit Timer 0 habe ich eigendlich hin bekommen, nur diese langen Zeiten von 1,5 Sec. und 0,5 Sec. bekomme ich nicht hin UND wenn ich den Ausgang für 0,5 Sec einschalte dann bleibt der sonstige Programmablauf mit stehen.
Frage 2:
Den Timer 1 bekomme ich garnicht zum laufen, habe ihn genauso programmiert wie Timer 0 - der will einfach nicht.
Könnt Ihr mir helfen?????
Danke!
Gruß MrQu
Hi MrQu,
ich hab zwar nicht so viel Ahnung von Timern aber würde mal deinen Titel ändern denn da steht du hast keine Probleme mit Timern ich denk es soll kleine Probleme heißen!
Gruß Michi
Ich würde das nur mit einem Timer machen, dann hast du Zeit, auch mit dem zweiten Freundschaft zu schliessen
Deine kleinste Event-Zeit ist 0.5 mS, daß wäre dann Timer0 prescale 8 und preload 194.
In der Timer-Interrupt routine mußt du dich um zwei Abläufe kümmern:
1.5 Switch
zwei Zustände:
1 mit einem Zähler bis 3000 zählen, dann ist 1.5 sec rum,
Schalter ein, auf Zustand 2 gehen
2 mit einem Zähler bis 1000 zählen, dann ist 0.5 sec rum,
Schalter aus, auf Zustand 1 gehen
30 Switch
Im grunde das Gleiche, andere Zahlen halt.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Wenn ich in der Interrupt-Schleiffe was rechnen lasse, dann hällt doch der Rest des eigendlichen Programmes an - oder???
Das heisst doch das eigendliche Programm zwischen DO und LOOP bleibt so lange stehen - ODER???
Habe unten mal das Musterprogramm angehängt wie ich es jetzt gemacht habe, kannst du mir das zum testen so umschreiben wie du es gemeint hast
- oder
es mir nochmal erklären.
danke
mfg MrQu
Hallo, was picknick meint ist sicher daß Du in der interruptroutine zu einem Zähler, der außerhalb der routine liegt, immer eine eins addierst.
Das vergleichen machst Du dann im Hauptprogramm .
ODer sehe ich das falsch?
Gruß Sebastian
Hallo
Versuch mal so
Ist nicht getestet, sollte aber schon so gehen.Code:$regfile = "At26def.dat" ' CPU = ATtiny26L (externe Reset-Beschaltung) $crystal = 1000000 ' Takt = interner RC mit 1 MHz Dim Status As Byte Dim B As Word Dim C As Word C = 3000 Const Timer_reload = 193 Const An = 0 Const Aus = 1 Config Portb = Output Portb = &B00000000 Config Timer0 = Timer , Prescale = 8 On Timer0 Led Enable Timer0 Enable Interrupts Do If B = C Then '1,5 Sekunden vorbei 3000 * 500 µs = 1,5 s If Portb.1 = Aus Then 'war die LED vorher aus Portb.1 = An 'dann einschalten C = C + 1000 'Zeit für ausschalten einstellen Else Portb.1 = Aus C = C + 3000 'Und Neue Zeit Berechnen End If End If Loop End 'Interrupt Routine Timer0 'wird ca alle 504 µs aufgerufen Led: Timer0 = Timer_reload 'Timer neu einstellen B = B + 1 'Variable b zählt die 0,5 ms Schritte 'Variable wird alle Return
Gruß
Dieter
He Ihr seit ja fixxxxxx *freu*
Werde das heute nach der Arbeit gleich mal testen.
Klingt logisch was Ihr sagt, zur zählen im interrapt, interrapt ergebnis extern abfragen und extern ausführen - so ist der normale programmablauf eigendlich nicht unterbrochen.
Danke - bis später
mfg MrQu
@izaseba: Ja, alles im Interrupt, selbst bei den 500 uS hat er ja
500 x quartz - cyclen zeit. die zählervariablen und state-flags sind permanente variablen, die aber alleine dem Timer gehören (klassenmäßig gesehn)
In der Hauptroutine tät ich in der richtung garnix, was'n auch.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Hallo
hier mein Lösungsweg - kukst du unten.
Stimmt der so???
Ich meine habs getestet und es geht.
Frage -
habe ich den Timer0 richtig programmiert das die LED 0,8 Sec. OFF ist und dann für 1 Sec. ON ist - oder habe ich nen Rechen- / Denkfehler.
Optisch beim testen kommt es hin.
Gruß MrQu
Lesezeichen