Forum: Mikrocontroller und Digitale Elektronik Taktgeber mit Atmega 8


von Lois (Gast)


Lesenswert?

Hallo!

Ich möchte mir gerne einen Rechteckgenerator bauen. Über ein Display 
möchte ich von 1Hz bis 5Khz einstellen können (sprung mit 1Hz)

Ich habe soweit alles fertig und es funktioniert eigentlich recht gut. 
Habe aber fette Probleme mit dem Timer! Wie berechnet man den Reloadwert 
um auf 1Hz zu kommen bzw. auf 5Khz. Macht man sowas überhaupt mit dem 
Reload wert oder gibt es da eine andere Lösung. Zuzeit habe ich das 
Problem dass ich nur min. auf 90Hz komme. Aber das Hauptproblem ist das 
der Anstig nicht Linear ist, im oberen Bereich ist der Sprung schon 
mehrere Khz.

Könnt ihr mir bitte weiter helfen...

Danke!

von Ralf G. (ralg)


Lesenswert?

Lois schrieb:
> Macht man sowas überhaupt mit dem Reload wert

Ich würd's mal so machen. Exakt jede Frequenz wirst du allerdings nicht 
treffen.

Erstmal grobe Bereiche festlegen für den Vorteiler. Und die 'Feinheiten' 
über den Timer-Startwert.

von Karl H. (kbuchegg)


Lesenswert?

> Macht man sowas überhaupt mit dem Reload wert oder gibt es
> da eine andere Lösung.

Ich denke du bist auf der Suche nach dem CTC-Modus des Timers. Aber um 
etwas rechnen wirst du nicht rumkommen.

FAQ
ganz unten, letztes Kapitel - Timer

von spess53 (Gast)


Lesenswert?

Hi

> Macht man sowas überhaupt mit dem Reload wert

Nein, mit CTC.

>Zuzeit habe ich das
>Problem dass ich nur min. auf 90Hz komme. Aber das Hauptproblem ist das
>der Anstig nicht Linear ist, im oberen Bereich ist der Sprung schon
>mehrere Khz.

Hängt von dem verwendeten Timer, Präscaler und der Taktfrequenz deines 
Controllers ab. Bei 20MHz sind im Bereich um die 5kHz Abstufungen von 
2..3 Hz mit einem 16Bit-Timer möglich.

MfG Spess

von Lois (Gast)


Lesenswert?

Danke!

Ich setzte und Lösche das bit im Timer ==> PINA.0=!PINA.0;

In Zukunft würde ich auch gerne einstellen wie viele Pulse ausgegeben 
werden.

von Karl H. (kbuchegg)


Lesenswert?

> Ich setzte und Lösche das bit im Timer ==> PINA.0=!PINA.0;

Du löscht es nicht 'im Timer' sondern in der zugehörigen ISR (Interrupt 
Service Routine)

> In Zukunft würde ich auch gerne einstellen wie viele Pulse
>  ausgegeben werden.

Niemand hindert dich daran, in besagter ISR mitzuzählen, wieviele Pulse 
schon generiert wurden und bei einer bestimmten Anzahl den Timer 
abzuschalten.

von Lois (Gast)


Lesenswert?

Der Timer läuft jetzt mit 10Khz, habe das Problem das ich im unteren 
Bereich recht genau bin und um so höher der Sprung größer wird=
1
unsigend int counter;
2
unsigned int freq=50; //100Hz
3
4
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
5
{
6
TCNT1H=0xFD;TCNT1L=184; // läuft nun mit 10Khz
7
8
if (counter==freq)
9
{
10
if (toggle) {toggle=0;PORTA.0=0;} else {toggle=1;PORTA.0=1;}
11
counter=1;
12
} else counter++;
13
14
}
Ich komme nicht drauf wie es gemacht wird das ich wirklich in 1Hz 
Schritten. Wie wird das Gemacht, wird immer der Reloadwert neu berechnet 
?

Danke für eure Hilfe!

von Karl H. (kbuchegg)


Lesenswert?

> TCNT1H=0xFD;TCNT1L=184; // läuft nun mit 10Khz

wie entstehen diese Werte?
Wo hast du sie her? Wie hast du sie berechnet


Und ja: Du wärest besser bedient, wenn du den CTC Modus nehmen würdest, 
wie jetzt schon 2 mal erwähnt wurde. Dann passiert der Reload nämlich 
automatisch und ohne den Zeitversatz vom Auslösen des Overflows bis dann 
endlich in der ISR die neuen Werte zugewiesen werden.

Hast du den Link in der FAQ gelesen (komplett), den ich dir gegeben 
habe?

Und ja: Solange du daran klebst, dass deine ISR mit einer bestimmten 
Frequenz aufgerufen werden muss, so lange wirst du nicht weiter kommen.
Du MUSST aus der gewünschten Frequenz dir den Vorteiler des Timers und 
den CTC-Compare Match Wert ausrechnen (und mgl. den Wert für einen 
Software-Teiler in der ISR). Das ist keine Raketentechnik und wenn dir 
prinzipiell klar ist, wie du deine jetzigen Werte berechnet hast, sollte 
es auch nicht schwierig sein mit einem allgemeinen Schema hochzukommen.

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.