Hiho,
ich möchte an einen Pin ein möglichst nahes 32khz Signal mit einem
Amtega erzeugen. Der Atmega läuft mit einem 8 Mhz Quarzoszillator.
Wie fange ich am dümmsten die Rechnerrei an?!
8.000.000 Hz / 256 Int = 31.250 Hz
Das wäre ja bei einem 8Bit Int. jeder Interrupt oder sehe ich das
falsch?!
Nachfrage:
Wenn ich nun natürlich jeden Interrupt den Pin von 0 auf 1 wechsel...
dann habe ich ja qausi einen Takt von ~15khz. Oder zählt jeder Wechsel
als Takt?! Also 0 zu 1 oder 1 zu 1?!
Kann ich den Intervall in welchem der Interrupt auslößt, beim 8Bit Timer
ja 256, noch kürzen?!
8 bit Timer heist das Register des Timers is genau 8bit breit also zählt
der Timer von 0 bis 256 danach gibt es einen Interrupt wenn du den Timer
mit dem Systemtakt mitzählen lässt kommst du auf deine 31,5Khz. Es gibt
aber auch die Möglichkeit z.B. nur jeden 8. oder 64. Systemtakt zu
zählen. Was aber für dich interessant ist, ist das Timerregister mit
(256-250)=6 zuladen jetzt zählt der Timer nur noch bis 250 macht genau
32Khz. Das entsprechende Register heist zum Beispiel beim Atmega8 TCNT0
du musst nur noch dafür sorgen das es bei jedem Interrupt mit TCNT0=6
geladen wird.
Hi
>Was aber für dich interessant ist, ist das Timerregister mit>(256-250)=6 zuladen jetzt zählt der Timer nur noch bis 250 macht genau>32Khz.
Klar. Von hinten durch die Brust ins Auge.
MfG Spess
Hi
>Wenn schon denn schon, sind es 255 anstatt von 256, das wären neun bit.
Außerdem kommt noch hinzu, das eine Frequenz von 16kHz dabei
herauskommt.
MfG Spess
Hi
>So habe es nun so geregelt... Messen kann man es bestimmt nur mit einem>Oszi oder?!
Könntest du auch mal Controller und Programmiersprache bekanntgeben.
MfG Spess
TCCR0=1;//Prescaler auf 1 (2 == 4)(3 == 8) (4 == 64) etc.
4
TOIE0_bit=1;//TimerOverflow 0 einschalten
Im groben und ganzen wird das ein Programm welches einen MS5534C Sensor
(Barometer) abfragt. Diesen ~32khz Takt benötigt der Sensor für seine
Umrechnung. Der Rest wird über ein 3-Wire Serial gemacht (SCL,DIN,DOUT).
Hmm.. gute Frage... :D
Ich dachte nicht das man die Timer extra auf CTC schalten muß, ich
dachte mit dem OCR Bit setze ich ausschließlich den Interrupt
auslösenden Zähler von 255 runter auf 124?! Wie setze ich denn den CTC
Modus?!
Karl heinz Buchegger schrieb:
> Hols dir von Atmel. Ohne Datenblatt kommst du nicht weit.
Super, daher hatte ich es mir ja abgeleitet ;)
also... ich denke mal so ist es nun richtig oder:
Wobei ich nun noch am Rätsel bin ob ich nun auch noch COM01 setzen muß?!
Damit der Zähler zurückgesetzt wird?! Komm da im Datenblatt nicht so
ganz klar. :/
"Clear OC0 on compare match when up-counting. Set OC0 on compare
match when downcounting."
Jep, ich denke schon das ich was gelernt habe :D
Kleine Frage aber gleich hinterher... Wenn ich damit nahe an die 1khz
Grenze will, werde ich wohl oder übel ein Problem bekommen oder? Ich
Rechne mal:
8.000.000 hz / 8.000ctc = 1.000hz = 1khz
Jedoch hat der 16Bit Timer ja gerade mal 1.023 Zählintervalle... Kann
ich im CTC Mode ebenfalls einen Prescaler nutzen? Oder bleibt mir nur
eine möglichkeit den Counter bei 800 auslösen zu lassen, was dann ja
10khz sind und dann in dem Counter eine Schleife bis 1000
durchzuzählen?!
Mit einem Prescaler von 64 wäre das ja optimal:
8.000.000hz / 64ps = 125.000 / 125ctc = 1khz...
Wie würdet ihr das machen?
>Jedoch hat der 16Bit Timer ja gerade mal 1.023 Zählintervalle..
16²-1 ist 65535. Sollte also kein Problem sein.
Vorteiler gibt es aber trotzdem und können auch benutzt werden.
Sooo also im 16Bit lassen sich ja nun die Bits doch ein wenig anderst
setzen.. hab mich nun so durchs Datenblatt gewusselt und ich denke das
dürfte stimmen...
TIMSK = 0b00010010 - gehe ich doch mal stark davon aus?! So wie ich das
Datenblatt verstehe wird in TIMSK für alle drei Timer die Interruptmask
gesetzt.:
[OCIE2][TOIE2][TICIE1][*OCIE1A*][OCIE1B][TOIE1][*OCIE0*][TOIE0]
Achso.. ja ist mir nun auch eingeleuchtet :D
Nun laufen zwar die Timer, ich schätze mal alle beide - jedoch spinnt
nun mein LCD völlig verrückt... Da kommt nur noch Mist auf PORTD rauß.
Kann auch nicht schauen wie es Programmiert ist, da in MicroC die LCD
Bibliothek nicht einsehbar ist. :/
Solange nur einer von den beiden Timern läuft geht alles wunderbar, bei
beiden macht er Mist.
Werde mir es nun aber so umschreiben das ich von Timer0 einfach 320
Schritte zurückzähle - dann komme ich auch auf meine 100 Herz.
Jetzt habe ich einen Lichtblick gehabt. Sehe ich das richtig das der
Atmega Pins zur Verfügung stellt welche (Atmega16: OC0 = Pin A3..
etc...) beim Interrupt den Takt ausgeben?!
Kann ich dies umgehen?! Das ist auch der Grund warum mein LCD spinnt,
der liegt auf PortD, dort wo auch OC2 und OC1A/B liegt.
spess53 schrieb:
> Hi>>>Kann ich dies umgehen?!>> Dann erkläre mal, wozu diese Zeile:>>> TCCR1A = ((1<<COM1A0) | (1<<COM1A1)); //Comperator setzen>> da ist.>> Mfg Spess
Ach Spess wenn ich dich nicht hätte :D
Stimmt, sehr schön das man dies auf die Pins legen kann, hätte ich das
vorher gewusst, hätte ich meinen 32khz Clock ja direkt auf den OC0 Pin
legen können. Nun habe ich mir eh einen externen Rechteckgenerator mit
32,57khz gebaut, so das ich dies aus meinem Programm nehmen kann.