mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe! Timer!


Autor: mr-unbekannt (Gast)
Datum:

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

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für Frequenzen? Rechteck? Sinus? In welchem Frequenzbereich?

 - Michael

Autor: guru (Gast)
Datum:

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

Autor: mr-unbekannt (Gast)
Datum:

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

Autor: fnah (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Und da das so ist, ist auch ein Blick hier rein hilfreich
http://www.mikrocontroller.net/articles/AVR-Tutori...


Autor: let (Gast)
Datum:

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

Autor: mr-unbekannt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie würde das diskret lauten?

ich versuchs mal:
#ifndef F_CPU
#define F_CPU 4000000UL     /* Quarz mit 4 Mhz  */
#endif
#include <util/delay.h> // Wartefunktionen
#include <avr/io.h>     // IO Definitionen

int main(void)
{

DDRD = 0x00;
DDRB = 0xFF;         
PORTD = 0xFF;
TCCR1A = (1<<COM1A0) | (1<<CS00);   // Toggeln und Prescaler auf 1
OCR1A = 0x125;            // im Dezimalen 293 Hz


   
while(1)
  {   
  
  }
return 0; 
}


stimmt das?

Danke

Autor: johnny.m (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: mr-unbekannt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe ja alle PORTB auf Ausgang gesetzt:

so der (hoffentlich richtige) code:
DDRD = 0x00;
DDRB = 0xFF;         
PORTD = 0xFF;
TCCR1A = (1<<WGM12) | (1<<COM1A0) | (1<<CS00); // CTC-Mode + Toggeln und Prescaler auf 1
OCR1A = 0x1AAA;      // im Dezimalen 6826

danke

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> TCCR1A = (1<<WGM12) | (1<<COM1A0) | (1<<CS00);
Das stimmt so nicht! WGM12 ist im TCCR1B...

Autor: Branko Golubovic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
johnny.m wrote:
> TCCR1A = (1<<COM1A0) | (1<<CS00);   // Toggeln und Prescaler auf 1
? CS00 ist Prescaler-bit für Timer0 und befindet sich nicht ins TCCR1A.
TCCR1A hat:
Bit7    Bit6   Bit5   Bit4  - - Bit1   Bit0
COM1A1 COM1A0 COM1B1 COM1B0 – – WGM11 WGM10
und
TCCR1B:
Bit7   Bit6 -  Bit4 Bit3  Bit2 Bit1 Bit0
ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10

Also richtig ist:
TCCR1A = (1<<COM1A0);  // Toggeln(Datenblatt, Seite 108)
TCCR1B = (1<<CS10);    //Timer1 Prescaler auf 1 (Datenblatt, Seite 111)
// WGM Modus setzen
//z.B. Mode-10,PWM Phase-Correct (Datenblatt, Seite 110)
TCCR1B|=(1<<WGM13);
TCCR1A|=(1<<WGM11);
// ICR1 Register mit TOP-Wert laden
ICR1=2000; //TOP-Wert
// PWM-Frequenz=F_CPU/(2*Prescaler*TOP)->1000Hz(Datenblatt Seite 103)
OC1A=1000; // PWM-50-50%

Branko

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps, da hatte ich auch nicht richtig hingesehen... Danke, Branko!

Autor: mr-unbekannt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
int main(void)
{

DDRD = 0x00;
DDRB = 0xFF;         
PORTD = 0xFF;
TCCR1A |= (1<<COM1A0);  // Toggeln(Datenblatt, Seite 108)
TCCR1B |= (1<<CS10);    // Timer1 Prescaler auf 1 (Datenblatt, Seite 111)
TCCR1B |= (1<<WGM12);   // CTC Modus setzen
OCR1A = 6826;        // Frequenz=F_CPU/(2*Prescaler*OCR1A)

   
while(1)
  {   
  
  }
return 0; 
}

der code muss aber stimmen ;-)

danke

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.