Hallo!
Gestern und heute habe ich nur verbracht, um gute Tutorials für Timer zu
finden (In C). Habe aber nichts gefunden.
Mein Projekt wäre, mit einem Tiny2313 (4Mhz) in C ein Programm zu
schreiben, das Frequenzen mithilfe des Timers ausgibt.
Ich verstehe überhaupt nicht wie das Funktionieren soll?!?
muss ich den Prescaler auf 1024 stellen?
und was muss ich vorladen?
bitte um Hilfe
DAnke
Für Rechteck, also PWM, kannst du ja die PWM Funktionen des Timers
nutzen.
Um einfach nur einen Takt zubekommen, den du weiterverarbeiten kannst,
Prescaler einstellen und Timeroverflow Interrupt aktivieren bzw.
generell die Interrupts. Was du mit vorladen meinst, ist glaube ich das
beschreiben des TCNT0, damit der Zähler mit weniger Schritten als 256
überläuft, also der Takt schneller wird.
Also, das Signal braucht nur ein Rechteck sein (Ein Pin soll toggeln)
Die Frequenzen sollen im Hörbereich sein, ich hänge dann einfach einen
Lautsprechen an den Ausgang.
vielen dank
>Gestern und heute habe ich nur verbracht, um gute Tutorials für Timer zu>finden (In C). Habe aber nichts gefunden.>...>muss ich den Prescaler auf 1024 stellen?>und was muss ich vorladen?
timer haben mit C rein gar nichts zu tun. die informationen, die du
suchst, findest du im datenblatt zum controller.
wie man das dann in C umsetzt findet sich hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
Dann siehe dir mal insbesondere den Abschnitt zum
'Output compare match' (Timer 1) an.
Kurz: Timer1 in den CTC Modus, Compare Output mode auf
'Toggle OC1A', gewünschten Wert für die Ausgabefrequenz
in das Compare Match Register (OCR1A) und den Prescaler auf 1.
Nur den Lautsprecher bitte nicht ohne Vorwiderstand an den
Controller.
- Michael
> TCCR1A = (1<<COM1A0) | (1<<CS00); // Toggeln und Prescaler auf 1> OCR1A = 0x125; // im Dezimalen 293 Hz
Wie kommst Du da auf 293 Hz??? 4 MHz / 293 = 13652 Hz! Das ist ein
bisschen mehr als das was Du vermutlich willst...
johnny.m wrote:
>> TCCR1A = (1<<COM1A0) | (1<<CS00); // Toggeln und Prescaler auf 1>> OCR1A = 0x125; // im Dezimalen 293 Hz> Wie kommst Du da auf 293 Hz??? 4 MHz / 293 = 13652 Hz! Das ist ein> bisschen mehr als das was Du vermutlich willst...
Genau genommen
4000000 293 2 = 6825 Hz
/ 2 deshalb, weil der den Pin ja toggelt und für einen kompletten
Wellenzug sind 2 Toggle-Vorgänge notwendig.
6kHz sind aber immer noch ziemlich hoch.
Aber das ganze Setup des Times stimmt nicht. Was da
programmiert wurde, ist ein Timer der mit vollen
4 Mhz jeweils bis 65536 zählt. Und wenn der Timerwert
den Wert 293 erreicht hat, dann wird das OC1A Bit
getoggelt.
D.h. das Bit toggeln wird mit einer Frequenz von
knapp 30Hz durchgeführt.
4000000 65536 2 = 30.5
Noch mal: Der CTC Modus ist dafür bestens geeignet.
Nur muss man den aber auch einschalten.
@Karl Heinz:
Richtig. Aber da er den Timer nicht im CTC-Modus betreibt, stimmt auch
das nicht. So wie es oben konfiguriert ist, tritt das Compare-Ereignis
mit 61,04 Hz auf, da der Timer beim Compare-Ereignis nicht zurückgesetzt
wird... Hatte ich grad übersehen.
@mr-unbekannt:
Du musst, wenn Du ein vernünftiges Signal haben willst, schon den
CTC-Modus des Timers aktivieren, indem Du die WGM-Bits in den
Steuerregistern entsprechend setzt.
johnny.m wrote:
> @Karl Heinz:> Richtig. Aber da er den Timer nicht im CTC-Modus betreibt, stimmt auch> das nicht. So wie es oben konfiguriert ist, tritt das Compare-Ereignis> mit 61,04 Hz auf, da der Timer beim Compare-Ereignis nicht zurückgesetzt> wird... Hatte ich grad übersehen.>> @mr-unbekannt:> Du musst, wenn Du ein vernünftiges Signal haben willst, schon den> CTC-Modus des Timers aktivieren, indem Du die WGM-Bits in den> Steuerregistern entsprechend setzt.
Da haben sich unsere Korrekturen überschnitten :-)
Ich hab kein Datenblatt vom Tiny2313 da:
Den OC1A Pin auf Ausgang setzen nicht vergessen.
Im Datenblatt nachsehen, welcher Pin das ist.
So, danke für die Antworten!
Ich will eigentlich nur den OCR1A Ausgang (PB3) toggeln lassen, dass ich
eine Frequenz von 293 Hz bekomme.
Ich gehe in den CTC -Mode, Lade OCR1A0 mit dem Wert 6826d vor, daraus
ergibt sich die Frequenz = F_CPU/(2*Prescaler*OCR1A0)
So, der Code
1
intmain(void)
2
{
3
4
DDRD=0x00;
5
DDRB=0xFF;
6
PORTD=0xFF;
7
TCCR1A|=(1<<COM1A0);// Toggeln(Datenblatt, Seite 108)
8
TCCR1B|=(1<<CS10);// Timer1 Prescaler auf 1 (Datenblatt, Seite 111)