PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servus - keine Probleme mit Timer´n



MrQu
27.07.2005, 10:04
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

michaelb
27.07.2005, 11:50
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

PicNick
27.07.2005, 12:12
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.

MrQu
27.07.2005, 20:48
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

izaseba
27.07.2005, 21:31
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

Dino Dieter
27.07.2005, 22:17
Hallo


Versuch mal so


$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

Ist nicht getestet, sollte aber schon so gehen.

Gruß
Dieter

MrQu
28.07.2005, 05:53
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

PicNick
28.07.2005, 07:20
@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.

MrQu
30.07.2005, 13:13
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