Forum: Compiler & IDEs kleine timer frage


von r4m0n (Gast)


Lesenswert?

Hallo Leute,

Kann mir einer sagen ob und was ich bei unten stehendem Code falsch 
gemacht haben könnte?
- Habe in AVR-Studio den Timer auf 1.000.000hz gestellt
- Prescaler auf 64 ergibt für den 16bit TCNT1 nen Wert von 15624.
- sprich der timer soll bei 1sek. 1hz. reagieren.

1. Frage: meine Led bei PC5 blinkt schneller als ich für 1sek.
   vermuten wurde. sieht für mich eher nach 500ms aus?!

2. Frage: kann es sein das der Timer beim Atmega8 NUR für PB2 gilt?
   also dort wo auch tatsächlich der Timer liegt?


#include <avr/io.h>

int main (void)
{
   DDRB |= (1 << PB2); // Set Motor as output
   DDRC |= (1 << PC5); // Set LED as output

   TCCR1B |= (1 << CS10) | (1 << CS11) ; // Set up timer with
                                         // a prescaler of 64

   for (;;)
   {
      // TCNT1 as 16bit can only count to 65535!
      if (TCNT1 >= 15624) //15624 is 1 count of the actual
                          //clock at 1Mhz = 1ms
      {
         PORTB ^= (1 << PB2); // Toggle Motor
         PORTC ^= (1 << PC5); // Toggle LED

         TCNT1 = 0; // Reset timer value
      }
   }
}

Bin Euch für jede Antwort dankbar...


Gruß
R.

von Rolf Magnus (Gast)


Lesenswert?

r4m0n schrieb:

> - Habe in AVR-Studio den Timer auf 1.000.000hz gestellt

Wie?

> - Prescaler auf 64 ergibt für den 16bit TCNT1 nen Wert von 15624.
> - sprich der timer soll bei 1sek. 1hz. reagieren.
>
> 1. Frage: meine Led bei PC5 blinkt schneller als ich für 1sek.
>    vermuten wurde. sieht für mich eher nach 500ms aus?!

Dann ist anscheinend dein Prozessortakt falsch. Das Programm sieht 
soweit gut aus.

> 2. Frage: kann es sein das der Timer beim Atmega8 NUR für PB2 gilt?
>    also dort wo auch tatsächlich der Timer liegt?

Ich verstehe nicht, was du damit meinst.

von r4m0n (Gast)


Lesenswert?

Hallo Rolf,

zu 1. Habe den Timer im AVR Studio unter "project configuration" auf 
1000000hz gestellt. War eigentlich der Meinung das würde soweit 
reichen!? Oder muss ich den noch explizit im Code selbst mit angeben?

zu 2. Hat sich erledigt. Habe da etwas falsch verstanden und mit dem PWM 
durcheinandergebracht der laut Datenblatt nicht auf jedem Pin zu belegen 
ist.

Gruß.

von Karl H. (kbuchegg)


Lesenswert?

r4m0n schrieb:
> Hallo Rolf,
>
> zu 1. Habe den Timer im AVR Studio unter "project configuration" auf
> 1000000hz gestellt.

Du stellst nicht den 'Timer' auf 1 Mhz sondern du teilst dem AVR_Studio 
mit, mit welcher Taktfrequenz der komplette Prozessor läuft.
Und du kannst dort nichts in dem Sinne einstellen, dass ein anderer 
Zahlenwert dort etwas magisch verändern würde. Dieses Feld ist ein 
Informationsfeld für den Compiler. D.h. dort wird eingetragen, was Sache 
ist und nicht ich stelle dort ein was ich haben möchte.

In einem gewissen Sinne stellst du dort ein: Meine Uhr macht 60 mal Tick 
in der Minute. Aber selbst wenn du dort 80 eintragen würdest, macht 
deine wirkliche Uhr immer noch 60 mal tick. Der Unterschied: Dein 
Compiler/Programm glaubt dir das du eine seltsame Uhr hast, die wirklich 
80 mal in der Minute tick macht und rechnet dann mit falschen Werten.

von Oliver (Gast)


Lesenswert?

Wenn dein Programm die LED mit 2Hz blinken lässt, läuft der Prozessor 
mit 2MHz. Warum er das tut, musst du rausfinden.

Läuft er mit dem internen Oszillator, schau dir die Fuses an 
(CKSEL3..0), läuft er mit einer externen Taktquelle, schau nach, was da 
drauf steht.

Oliver

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.