kann mir jemand sagen wie man einen Interruptgesteuerten Zimer für den Atmega schreibt er soll alle 3 sec auslösen. 16MHz gesteckt. Danke Schreibe in WinAVR
Hast du dir schon mal das AVR-GCC Tutorial angeschaut? Dort gibt es einen Abschnitt über Timer. Was genau verstehst du denn daran nicht? Im Grunde ist das ganz simpel: Der Timer wird mit einem Vorteiler an den 'Quarz' abgehängt. Dann zählt der ganz von alleine. Wenn der Timer seinen Endstand erreicht hat, löst er einen Overflow-Interrupt aus und fängt wieder bei 0 an. Es liegt jetzt an dir den Vorteiler so einzustellen, dass du eine Zeitbasis im Overflow Interrupt bekommst mit der du weiter arbeiten kannst. Wenn du zb. das ganze so einstellst, dass alle 1ms ein Overflow auftritt, dann zählst du ganz einfach im Overflow Interrupt eine globale Variable hoch. Da der Overflow alle 1ms kommt ist also genau dann, wenn dieser Zähler 1000 erreicht hat, 1 Sekunde vergangen.
Kann mir einer mal ein beispiel geben. Im Tutorial sind zwar schön die register beschrieben aber ohne Beispiele. Wenn ich im Forum suche und ein Beispiel übertrage dann stürzt mein Atmega ab.
POste docj mal dein Programm. Dann können wir es durchgehen und dir den Fehler zeigen. Dabei lernst du viel mehr als wenn du nur fertige Programme auf den Controller brennst.
Aber was solls, hier ist ein Beispiel: #include <avr/io.h> #include <avr/interrupt.h> volatile unsigned int Counter; ISR( TIMER0_OVF_vect ) // alle 0.000128 Sekunden / 8 Mhz { Counter++; if( Counter == 10000 ) { PORTB = ~PORTB; Counter = 0; } } int main() { Counter = 0; DDRB = 0xFF; TCCR0 = ( 1 << CS02 ) | ( 1 << CS00 ); // Teiler: 1024 TIMSK = ( 1 << TOIE0 ); // Overflow Interrupt einschalten sei(); // Interrupt generell zulassen while( 1 ) ; }
was hat das DDRB zu sagen an Port B hängt mein Display. Mit diesm Code tut sich nichts. ich möcht erreichen das ein Bild 3 secunden auf dem Display erscheint und dann verschwindet und dann das nächste. Deshalb der Timer wenn 3 sekunden vergangen Timer soll abgeschalten werden(keine Interrupt auslösung)neues bild laden und timer einschalten.
DDRB = 0xFF; schalte alle PINS an PORTB auf Ausgang >Mit diesm Code tut sich nichts Wenn du das Beispiel der Timerbenutzung einfach übernommen und getestet hast, dürften die Ausgänge deines Display's an PORTB nicht sehr glücklich darüber sein. Ausgang auf Ausgang und der eine Ausgang invertiert ständig , da wird es interesant welcher Treiber eher aufgibt. (das Display könnte kaputt sein) >wenn 3 sekunden vergangen Timer soll abgeschalten werden(keine >Interrupt auslösung)neues bild laden und timer einschalten Du hast doch kapiert was du machen musst, du hast ein Bsp. wie man den Timer benutzt. Warum schreibst DU nicht deine Anwendung?
Weil der Timer Interrupt nicht auslöst. Das DDRB habe ich nicht verwendet zum Glück. Wie schalte ich den Timer aus so etwa TIMSK |= ( 1 << TOIE0 ); // Overflow Interrupt einschalten
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.