Forum: Mikrocontroller und Digitale Elektronik Timer1 Frequenz direkt am OC1A ausgeben


von Micha R. (michaavr)


Lesenswert?

Hallo,

ich möchte den Timer 1 so einstellen, daß ich mit Compare1A=<Wert> eine 
Bestimmte Ausgangsfrequenz erhalte.



Mein Problem ist nun, wie kann ich die Ausgangsfrequenz am OC1A-Pin 
direkt ausgeben? Ich möchte den Pin nicht Toggeln lassen, da dies die 
Ausgangsfrequenz wieder halbiert. Gibt es ein Register, welches ich 
beschreiben kann, daß die Frequenz an ORC1A ausgegeben wird?

Das ganze soll ohne Aufruf einer Interruptroutine funktionieren. Geht 
das?
Ich denke hierbei an die Register COM1A1, COM1A0, FOC1A, WGM10 und 
WGM11.
Hier mal mein Ansatz:

' Test OC1A

' Mit Timer n wird ein Trägersignal erzeugt und auf OC1A ausgegeben

$regfile = "m8def.dat".dat "
$Crystal = 3686400
$hwstack = 10
$swstack = 20
$framesize = 40

config timer1 = timer , PRESCALE = 1024 , clear timer = 1
compare1a = 1800
start timer1
enable timer1
enable interrupts

config portb.1 = output
'portb.1 = 1
tccr2.foc1a = 0

on compare1a test
enable compare1a

do
   !NOP
loop

end

Test:
   portb.1 = 0
   waitms 10
   portb.1 = 1
Return

ich habe hier einen Compare1A-Interrupt verwendet, der wegfallen soll. 
Es dient hier nur mal zu kontrollzwecken, ob die Frequenz stimmt. Hier 
F=2Hz

Kann mir jemand helfen?

von Michael U. (Gast)


Lesenswert?

Hallo,

das verstehe isg jetzt nicht...

Richtig ist, bei Toggle die "halbe Frequenz rauskommt. Besser gesagt, 
der Comparewert legt die halbe Periodendauer fest.

Due muß also Compare mit dem Wert für die halbe Periodendauer der 
Ausgangsfrequenz laden, wo ist da das Problem?

Gruß aus Berlin
Michael

von Micha R. (michaavr)


Lesenswert?

ja das ist mir schon klar. aber geht das den nicht ohne Toggeln?

Bei einem Quarz von b.B. 1 MHz mit Prescaler 1 könnte so direkt 1MHz aim 
OC1A liegen. Durch das Toggeln aber nur 500kHz.

Ich habe oben ein paar Register angegeben, kann man nicht diese 
irgendwie verwenden, um das zu erreichen?

von Rahul D. (rahul)


Lesenswert?

>Ich habe oben ein paar Register angegeben, kann man nicht diese
>irgendwie verwenden, um das zu erreichen?

Vielleicht hilft ein Blick ins Datenblatt des Mega8:
Nein, man kann nur maximal die halbe Oszillatorfrequenz ausgeben (Seite 
86ff im vollständigen Datenblatt sollte die Erklärung geben).


von Micha R. (michaavr)


Lesenswert?

Ja das Datenblatt liefert die Erklärung. Danke!

Leider ist das in Englisch.

Ich wollte nur den Tip, ob das denn überhaupt geht oder nicht, und 
wissen, welches Register zuständig ist, die Timer1-Frequent auf den Pin 
OC1A durchzuschalten.

nicht mehr, und auch nicht weniger.

von fnah (Gast)


Lesenswert?

>Leider ist das in Englisch.
falsches hobby.

von MR (Gast)


Lesenswert?

http://bascom-forum.de/index.php/topic,10.msg11.html#msg11
in diesem beispiel kommt auch nur die halbe frequenz raus kannste aber 
einfach umstellen.und jeden port verwenden.

Config Timer1 = Timer, Prescale = 64

Const Timervorgabe = 7936

von Micha R. (michaavr)


Lesenswert?

Ich bin kein Schritt weiter!

Geht es nun oder geht es nicht?

von fnah (Gast)


Lesenswert?

>Ich bin kein Schritt weiter!

>Geht es nun oder geht es nicht?

>>Nein, man kann nur maximal die halbe Oszillatorfrequenz ausgeben

wer lesen kann, ist klar im vorteil.

von Micha R. (michaavr)


Lesenswert?

Vielen Dank,
das war jetzt mal eine klare Aussage!

Mehr wollte ich doch gar nicht wissen. Oder doch?

Jetzt muß ich mal etwas ausholen.

Grundidee per Serieller Schnittstelle und IR eine Verbindung aufbauen.
Der SendRC5 sendet ja nur 11 Bit. Ich hatte nun die Idee, mit dem Timer 
1 eine Trägerfrequenz von 36kHz auf OC1A auszugeben und diese mit dem 
TxD-Signal zu modulieren. Also wenn TxD auf Low geht, wird das Signal am 
OC1A auf die Sende-Diode gegeben. Der Ruhezustand von TxD ist ja High.

Wenn ich nun empfangen will, wollte ich das Trägersignal vom OC1A-Pin 
abschalten. Deswegen die Frage, ob die Frequenz am OC1A per Software Ein 
und ausgeschaltet werden kann.

Also nochmal die letzte Frage:
Welches Register muß ich wie ändern, um dies zu erreichen?


von MR (Gast)


Lesenswert?


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.