Hallo Zusammen, ich benutze ein ATmega32 /STK600. Ich möchte anhand der Timer2 (8bits timer) meine LEDs bei 1HZ umschlaten. Aber der nichts. Die LEDs bleiben standig an. Außerdem, habe ich auch nicht richtig verstanden, was der ich der Werte für die OCR2 für den vergleich mit den TCNT2 einstellen soll. Meine Rechnungen 8000000/1024= 7,8KHZ 7800/256= 30 Overflows/s. Wie komme ich auf 1Hz? wie kann da mich weiterhelfen? hier der code: #include <avr/io.h> #include <util/delay.h> #include <inttypes.h> #include <avr/interrupt.h> ISR(TIMER2_COMP_vect) { PORTB^=0xFF;//bitweise XOR } //bei 1hz void main (void) { DDRB = 0xFF; // Set D as output port // Clear Timer on compare match / Timer Clock = system clock / 1024 TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20); //WGM21 control the counting sequence of the counter // (CL_2.0) TIFR = OCF2; // compare match occurs between Timer/counter2 und data in OCR2 // (CL_2.1) TIMSK = 1<<OCIE2; // Enable Timer 2 Output Compare Match Event Interrupt OCR2 = 0x03; // Set Output Compare Value to 10 (Compare with the Timer/Counter to generate Wave forms) sei(); while(1); } Danke Axel
Hallo Du zählst eine Variable hoch. Wenn diese bei 30 angekommen ist, dann ist eine Sekunde rum. Die Variable wird auf 0 gesetzt und das Spiel beginnt von neuem. Gruß Joachim
Hi Joachim, Joachim schrieb: > Wenn diese bei 30 angekommen ist, > dann ist eine Sekunde rum. wieso bei 30. Wie kommst du darauf dass, bei 30 ist ein Sekunde rum? danke
Hallo Ich bin von 30 Overflows pro Sekunde ausgegangen. Wenn sich der Interrupt 30 mal pro Sekunde meldet, sollte nach 30 Interrupts die Sekunde um sein. Gruß Joachim
Axel schrieb: > Hi Joachim, > > Joachim schrieb: >> Wenn diese bei 30 angekommen ist, >> dann ist eine Sekunde rum. > > wieso bei 30. Weil deine ISR 30 mal in der Sekunde aufgerufen wird. Hast du doch selber ausgerechnet > Meine Rechnungen 8000000/1024= 7,8KHZ > 7800/256= 30 Overflows/s. > Wie kommst du darauf dass, bei 30 ist ein Sekunde rum? Wenn ein Vorgang 30 mal in der Sekunde passiert, muss man nur 30 mal das Erscheinen des Vorgangs abwarten um zu wissen, das 1 Sekunde rum ist. oder anders ausgedrückt, wenn du weißt das der ganz große Zeiger deiner Uhr jede Sekunde um 1 vorrückt, dann zählst du 60 Vorrückungen um 1 Minute abzustoppen.
Hallo, die funktion sollte so aussehen: void main() { ---------- -------------- ------------ sei(); while(1) if (counter==30) PORTB =0xff; if (counter>60) { counter=0; PORTB =0x00; } counter++;} } aber ist es auch möglicht mit dem OCR2 und ASSR einzustellen?
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.