Hallo Spezialisten Habe da ein Problem mit der ISR. Wenn ich das Programm simuliere im AVR Studio 4.12 und WIN-AVR, wird immer beim Timeroverflow zum Programmbeginn bei Main gesprungen. Die ISR wird also nicht ausgeführt. Beim Test auf dem STK500 tut sich auch nichts, außer daß die LED's leuchten. µC -> ATtiny2313 Was ist, mache ich falsch? Weiß jemand etwas? Schonmal vielen Dank #include <avr/io.h> #include <avr/interrupt.h> volatile int8_t enc_delta=0; // -128 ... 127 int main( void ) { // rotary switch connection DDRD &= ~(_BV(PD0) | _BV(PD1)); // set to input PORTD |=(_BV(PD0) | _BV(PD1)); // enable pull up TCCR0B = 0x01;//1<<CS01; //divide by 8 * 256 TIMSK = 1<<TOIE0; //enable timer interrupt DDRB = 0xFF; sei(); for(;;) // main loop PORTB = enc_delta; } ISR(TIMER0_OVF_vect) { static uint8_t last_state = 0,last_cnt = 0; uint8_t new_state; new_state=PIND & (_BV(PIND1) | _BV(PIND0)); if ((new_state^last_cnt)==(_BV(PIND1) | _BV(PIND0)) ) { if ((new_state ^ last_state)==_BV(PIND1)) enc_delta+=1; else enc_delta-=1; last_cnt=new_state; } last_state=new_state; }
Hast du mal einen Blick auf das Compilat geworfen? Ist da überhaupt der ISR-Vector eingetragen?
Funktioniert problemlos bei mir. OK, das Ersetzen des rotary encoders mit den Tasten des STK500 ist bissel gewöhnungsbedürftig. ;-) Du benutzt die neue Interruptvektor-Syntax, hast du eine hinreichend aktuelle toolchain dafür (avr-libc >= 1.4.x)?
Guten Morgen Vielen Dank für die schnellen Antworten. ein rotary encoder ist schon angeschlossen. Einer mit 00/11 von Conrad. Das Problem ist nur, daß die ISR nicht ausgeführt wird. Auch nicht wenn in der ISR etwas ganz einfaches steht. Z.B.: enc_delta = 0xAA und sonst nichts. Unten stehende Warnungen werden noch ausgegeben. ../test999.c:11: warning: return type defaults to `int' ../test999.c: In function `ISR': ../test999.c:25: warning: control reaches end of non-void function P.S.: Wie stelle ich fest welche Vers. die Lib. hat? Danke
Anfänger wrote: > Unten stehende Warnungen werden noch ausgegeben. > > > ../test999.c:11: warning: return type defaults to `int' > ../test999.c: In function `ISR': > ../test999.c:25: warning: control reaches end of non-void function Das heist der Compiler hat deine Funktion nicht als ISR erkannt. Eine ISR hat korrekterweise keinen return type und wenn alles richtig läuft, dann weiss der Compiler das auch. Zieh die ISR mal vor das main. Überprüfe akribisch jeden einzelnen Buchstaben der Interruptbezeichnung. ( Am besten schaust du in die io2313.h hinein, suchst dir dort das #define dafür und kopierst den Namen mittels Cut&Paste in dein Programm. )
Habe jetzt die Include Dateien mit den ioxxx.h von WinAvr 4.11 genommen. Damit funktioniert es. Keine Warnungen mehr. Die LED's zählen nun schön auf und ab. Ich bin begeistert. Herr Karl heinz GROßEN DANK für den Tipp. Auch an die Anderen die geantwortet haben. Wieder was gelernt. Klasse Forum.
> Habe jetzt die Include Dateien mit den ioxxx.h von WinAvr 4.11 genommen. Schlechte Lösung. Bitte installier' dir die komplette toolchain, zumindest jedoch eine in sich konsistente Bibliothek. Die gibt's auch als binary distribution unter http://download.savannah.gnu.org/releases/avr/ Kann man prinzipiell über die existierende (z. B. von WinAVR) drüber installieren. Ein Headerfile steht nicht im luftleeren Raum, es hat immer einen Bezug zur Bibliothek, zu der es gehört.
Aha.. Was sind die .sig dateien? Kann die mit nichts öffnen. Habe jetzt einen Ordner mit Namen "avr-libc-bin-1.4.5" wwohin damit? Entschuldigung wenn ich so viel frage.
Anfänger wrote: > Was sind die .sig dateien? Kryptographische Signaturen. Damit sind die Archive unterschrieben. > Kann die mit nichts öffnen. GnuPG. > Habe jetzt einen Ordner mit Namen "avr-libc-bin-1.4.5" wwohin damit? Dahin, wo die bisherige Bibliothek installiert war. C:/WinAVR vermutlich. Also nur die Dateien aus den Unterverzeichnissen dorthin schaffen, da bleibt dann wohl ein leeres Verzeichnis avr-libc-bin-1.4.5 übrig am Ende.
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.