www.mikrocontroller.net

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


Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht 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).


Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fnah (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leider ist das in Englisch.
falsches hobby.

Autor: MR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin kein Schritt weiter!

Geht es nun oder geht es nicht?

Autor: fnah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht 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?


Autor: MR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.