Hi; Ich bin Anfänger beim Programmieren in Mikrocontroller.Ich habe ein Programm geschrieben,das die Sekunden zählt. Also mein Quarz taktet mit 3686400 HZ und als Vorteiler 64. #include <avr/io.h> #include <avr/interrupt.h> #define ZEAHL F_CPU/(64*256) //interruptzähler volatile uint16_t takt = ZEAHL , sekunde = 0; void setup (void) { TCCR0 |= ( 1<<CS10 )|( 1<<CS00 ); //counter0,Prescaler CK/64 TIMSK |= ( 1<<TOIE0 ); // enable counter0 overflow interrupt TCNT0 = 0; // Counter0 auf Null setzen takt = ZEAHL; sekunde = 0; } int main (void) { setup(); DDRC |= (1<<PC1); sei(); for (;;) {} } ISR(TIMER0_OVF_vect) { takt--; if (takt==0) // nach 225 durchlaufen ist eine Sekunde vorgegangen { takt = ZEAHL; sekunde++; if (sekunde == 20) { PORTC |=(1<<PC1); } } } Der Timer läuft,aber der zählt die Sekunden nicht richtig. Hier Z.B wollte ich nach 20 Sekunden PINC1 auf 1 setzen aber der macht schon nach ungefähr 5 Sekunden. Wie kann ich jetz ZEAHL rechnen damit das Programm die Sekunden genau zählt. Gehe ich die Rechnung durch: Frequenz 3686400 HZ Vorteiler 64 Timer 0, also 8 Bit Timer Nach 225 Interrupts wird erhöht. 3686400 / 64 Vorteiler 14400 14400 / 256 weil 8 Bit Timer 225, paar zerquetschte 225 / 225 weil 225 Overflows 1 das heisst ZEAHL = 225 Habe ich das richtig verstanden oder falsch??? Danke für eure Hilfe im Voraus.
> TCCR0 |= ( 1<<CS10 )|( 1<<CS00 ); //counter0,Prescaler CK/64
Nun, CS10 gehört zu Timer 1 und nicht zu Timer 0. Es liegt auch im
entsprechenden Register an der selben Stelle wie CS00, weshalb der
Ausdruck da oben nur CS00 setzt. Versuch es mal mit CS01 anstelle von
CS10...
Mich wundert allerdings ein bisschen, dass Du nur einen Faktor von 4
bekommst. Habe jetzt allerdings noch nicht ins Datenblatt geschaut, da
Du nicht erwähnst, um welchen Controller es sich genau handelt (das
hätte in den Betreff gehört!)
Cherkaoui Erratib wrote:
> 3686400 / 64 Vorteiler 14400
Das solltest Du noch mal nachrechnen! Das stimmt nämlich schon nicht...
Wenn ich das sehe, kommt mir fast der Verdacht, dass das mit dem CS10
nur beim Code-Abtippen passiert ist und dass im Originalcode tatsächlich
CS01 steht. Der Rechenfehler da oben gibt nämlich exakt einen Faktor 4!
Mit dem falschen CS-Bit wäre es allein dadurch schon ein Faktor 64...
ich habe mich ja verrechnet
3686400/64= 57600
aber sonst stimmt das mit ZEAHL = 3686400/64/256=225
Der Atmega8 ist im Einzatz.
>Nun, CS10 gehört zu Timer 1 und nicht zu Timer 0
das war nur Tippfehler.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.