PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taktfrequenz ereignisgesteuert ausgeben..



dl1akp
25.07.2007, 11:59
Hallo Leute,

brauche mal einen kleinen Anstoß.

Ich erzeuge per Timer-Interrupt eine Rechteckfrequenz von ca. 1000 Hz.

Diese möchte ich auf einen Ausgang legen, Das funktioniert gut.

Allerdings soll diese Frequenz bei Anspringen eines Unterprogrammes (Bedingung erfüllt). für z.B. 200msek anliegen, dann ausgehen.

Anwendung: Die 1000Hz (Ton) sollen bei bestimmten Bedingungen z.B. piep-piep oder piep-piep-piep machen.

Ich kriegs aber nicht hin. Gibt es dafür eine (vielleicht ganz einfache) Lösung??

Danke im Voraus.
Tschau, ANdreas

hackgreti
25.07.2007, 12:32
Poste einmal dein Programm.

Ich hab das gleiche einmal bei einem Infrarotsender benötigt, wo ich die richtige Frequenz gebraucht habe, und gleichzeitig sollte alles immer für 50ms ein und für 50ms aus sein. Das hat damals funktioniert.

Ich hab nur nicht mehr meinen Code im Kopf oder auf der Platte.

Sauerbruch
25.07.2007, 15:51
Hallo Andreas,

wenn das initiale Piepsen den Start des eigentlichen Unterprogrammes aufhalten darf (d.h. das Unterprogramm auch mit ein paar Piepsern Verzögerung starten kann), würde ich den Interrupt des betreffenden Timers periodisch ein- und ausschalten. Ohne Interrupt kein Piepston:



Do
disable timer1 'Ton aus
...
...
GOSUB Subprogramm
Loop


Subprogramm:
enable Timer1 'Ton startet
waitms 200
disable Timer1 'Ton stoppt nach 200ms
(kann mehrfach wiederholt werden für mehrere Pieptöne...)
...
...
Return


Willst Du damit vielleicht CW-Zeichen ausgeben? =P~

Gruß,

Daniel
(DL6MCL)

izaseba
25.07.2007, 17:40
Sowas erschlägt man am besten in dem eigentlichem Timerinterrupt mit hilfe von zwei Variablen und zwar etwa so:

Variablen :
A = 200 (200 ms Tondauer und Pause)
B = 6 (Anzahl der Pieper*2) also 3 Pieper werden ausgegeben

In der ISR:


Wenn B = gerade Zahl (man kann hier Bit 0 auswerten)
Toogle Pin (hier Dein Pieperpin)
sonst Pin = 0

A=A-1

Wenn A = 0
A=200
B=B-1
Wenn B = 0
Timer aus
Pin = 0


Starten tust Du das in einer Unterfunktion, die sieht so aus:


A=200
B = 6 (Für 3 Pieper)
Timer start


Sorry für diese Pseudocode, es sollte aber ziemlich leicht zu implementieren sein ;-)

Gruß Sebastian

P.S.
Das ganze klappt wenn Du wirklich jede mS (1000Hz) einen Interrupt auslöst.
Das ergibt aber eine Frequenz von 500 Hz...
Wenn Du alle 500 µs einen Interrupt hast mußt Du A = 400 verwenden

dl1akp
26.07.2007, 13:29
Danke an Daniel, DL6MCL,

so gehts perfekt. Ist übrigens, um CW-Zeichen zu erzeugen.

Tschau, Andreas (DL1AKP)

Sauerbruch
26.07.2007, 14:47
Ist übrigens, um CW-Zeichen zu erzeugen.

Ja, ja - CW... ist auch nach 25 Jahren immer noch meine Lieblings-Betriebsart (auch wenn ich aus Zeitmangel nur alle Jubeljahre mal on the air bin).

Was hast Du denn für ein interessantes Projekt in Arbeit, wenn ich mal ganz neugierig fragen darf?

Daniel