Hey Leute, ich versuche mich gerade in die Programmierung von Microcontrollern einzuarbeiten. Zur Zeit versuche ich einen Interrupt zu Programmieren (in C). Naja irgendwie will es nicht wie ich will, ich zeig euch einfach mal meine Zeilen: #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000UL #include <util/delay.h> int main(void) { DDRB=0xff; TIMSK|=(1<<TOIE0); TCNT0=0x00; sei(); while(1) { } } ISR(TIMER0_OVF_vect) { PORTB=0x01; reti(); } Naja das Programm soll einfach dazu dienen, damit ich sehe dass die ISR überhaupt aufgerufen wird. Ich hoffe ihr könnt mir sagen wo der Fehler ist. Achja vielleicht eine Frage neben bei, ich habe versucht im SREG das Bit I direkt zu setzen, sprich SREG|=(1<<I), aber der Compiler (Atmel Studio 6.1) kennt sowohl das I als auch das SREG nicht. Dachte vllt hat es einen Zusammenhang. Danke im Voraus
Alex K. schrieb: > Ich hoffe ihr könnt mir sagen wo der Fehler ist. Das reti() hat dort nichts verloren, und sorgt für einen Absturz (respektive Neustart) des Programms. Edit: Aber so weit kommt dein Programm ja erst gar nicht, da der Timer ja nie gestartet wird.
:
Bearbeitet durch User
Alex K. schrieb: > DDRB=0xff; > TIMSK|=(1<<TOIE0); > TCNT0=0x00; Diese Initialisierung ist unvollständig. Weder sagst du dem Timer, was er überhaupt machen soll, noch legst du fest, wie schnell er es machen soll und, last but not least, du startest den Timer noch nicht einmal... Lies' das verdammte Datenblatt und das Tutorial zur Timerprogrammierung, damit du wenigstens den Hauch einer Andeutung einer Ahnung davon bekommst, was du da eigentlich tust. > ISR(TIMER0_OVF_vect) > { > PORTB=0x01; > reti(); Das ist Blödsinn. Der C-Compiler fügt das reti schon ganz von alleine ein, wenn du eine ISR implementierst. Genau dafür steht das Macro ISR() ja (unter anderem). > Achja vielleicht eine Frage neben bei, ich habe versucht im SREG das Bit > I direkt zu setzen, sprich SREG|=(1<<I), aber der Compiler (Atmel Studio > 6.1) kennt sowohl das I als auch das SREG nicht. Dachte vllt hat es > einen Zusammenhang. Zum einen muß du das nicht so machen, das sei() genügt völlig. Zum anderen: Das Bit für das globaleInterruptflag heißt "SREG_I", nicht "I".
Alex K. schrieb: > int main(void) > { > > DDRB=0xff; > TIMSK|=(1<<TOIE0); > TCNT0=0x00; > sei(); > > while(1) > { > > } > > } > ISR(TIMER0_OVF_vect) > { > PORTB=0x01; > reti(); > } > > > Naja das Programm soll einfach dazu dienen, damit ich sehe dass die ISR > überhaupt aufgerufen wird. > > Ich hoffe ihr könnt mir sagen wo der Fehler ist. Der Timer läuft nicht. Guck dir im Datenblatt in der Beschreibung des TCCR0B-Registers die CS00 - CS02 Bits an. > Achja vielleicht eine Frage neben bei, ich habe versucht im SREG das Bit > I direkt zu setzen, sprich SREG|=(1<<I), aber der Compiler (Atmel Studio > 6.1) kennt sowohl das I als auch das SREG nicht. Dachte vllt hat es > einen Zusammenhang. Vergiss das. Davon hast du nie was gehört, gelesen oder gesehen. Genauso wie das reti(); in der ISR. Um beides kümmert sich der Compiler. mfg.
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.