Hallo in die Runde,
ich hab da ein kleines Problem mit dem Timer am tiny24.
Erstmal möchte ich den Timer einfach laufen lassen, den Wert auslesen
und vergleichen. Der Tiny läuft auf 8Mhz.
1 | TIMSK1 = (1<<ICIE1 )|(1<<TOIE1);
|
2 |
|
3 | TCCR1B = (1<<CS11)|(1<<CS10)|(1<<ICES1); //vorteiler 64, Positive Flanke
|
1 | while(1)
|
2 | {
|
3 | if (TCNT1 <= 360)
|
4 | {
|
5 | PORTA &= ~(1<<PA3);
|
6 | }
|
7 | else
|
8 | {
|
9 | PORTA |= (1<<PA3);
|
10 | }
|
11 | }
|
OK jetzt rechne mal nach und möchte mit dem wert "360", die Länge der
negativen "Pulsbreite" einstellen. 8Mhz/64 = 125000 Timerticks/s = 125
Timerticks/ms. In einer [ms] zählt der Timer1 also 125 mal hoch, wenn
ich jetzt 25ms eine negative breite haben will, 25ms*(125 Timerticks/ms)
= 3125. OK jetzt arbeite ich gerade aber mit dem Wert "360" und mein
Oszi zeigt -Breite = 22,72ms an.
Lasse ich den 64er Vorteiler weg, und lasse ihn auf 8Mhz laufen, so habe
ich eine -Breite von 63µs, rechnerisch sind es 45µs die Stop Uhr im AVR
Studio zeigt 16,25µs für einen Programmdurchlauf an und somit sind wir
doch bei den ~63µs.
Das verstehe ich ja noch, aber warum ist mit 64er Vorteile der Wert so
weit weg? Ich möchte eigentlich nur ein 0-100Hz Signal auswerten, sehr
unelegant aber so habe ich das schon mal erfolgreich gemacht...
1 | ISR(TIMER1_CAPT_vect)
|
2 | {
|
3 | if (TCNT1 <= 360)
|
4 | {
|
5 | PORTA &= ~(1<<PA3);
|
6 | }
|
7 | else
|
8 | {
|
9 | PORTA |= (1<<PA3);
|
10 | }
|
11 |
|
12 | TCNT1= 0;
|
13 |
|
14 |
|
15 | }
|
Das Funktioniert auch soweit... schreibe ich aber
1 | unsigned short tticks;
|
2 |
|
3 | ISR(TIMER1_CAPT_vect)
|
4 | { tticks = TCNT1;
|
5 | TCNT1=0;
|
6 | }
|
und vergleiche den werte in tticks in meiner main, wie oben.
Funktioniert es nicht...
Ich versuche das noch eleganter zu lösen in dem ich mir die Werte aus
ICR1 hole, aber was rechne ich mit 64 Vorteiler falsch?
lg Malte