Also ich verstehs echt nicht mehr ... Ich habe folgenden Code: #include <avr/io.h> #include <avr/interrupt.h> // sei() #include <avr/signal.h> // SIGNAL #define XTAL 1000000 int main(void) { /* configure all portD bits as input */ DDRD = 0x00; // configure all PortB bits as output DDRC = 0xff; PORTC = 0xff; //sei(); while(1); return 0; } SIGNAL (SIG_INTERRUPT0) { PORTB = 0xff; } Nun sollte doch nachdem ich den AVR mittels winavr/avrdude programmiert habe, der Port C auf High Pegel sein .. oder ? Interessanterweise ist er das aber nicht .. weiss vielleicht jemand was ich falsch mache ?
oh :) es handelt sich um einen vollkommen neuen Atmega8. Das erste Problem konnte ich lösen ... wahrscheinlich hatte der programmer was ... denn obwohl avrdude meinte "successful" hab ichs mal mit meinem anderen adapter und ponyprog probiert und siehe da, es ging ... aber jetzt funktioniert noch die sache mit dem interrupt nicht .. ich schau wohl nochmal schnell ins tutorial hier :)
> denn obwohl avrdude meinte "successful" hab ichs > mal mit meinem anderen adapter und ponyprog probiert und siehe da, > es ging ... Du solltest nach jedem Brennvorgang die geschriebenen Daten verifizieren.
hmm . .tut das avrdude nicht von haus aus ? könnte schwören dass dort was mit Verifying stand. zurück zu meinem jetzigen Problem: Ich würde gerne einen externen Interrupt nutzen, habe aber das Problem, dass er anscheinend nicht wirklich ausgelöst wird. Weiss zufällig jemand woran das liegen könnte ? Die Initialisierung müsste ja so passen, oder ? int main(void) { /* configure all portD bits as input */ DDRD = 0x00; // configure all PortB bits as output DDRC = 0xff; PORTC = 0x00; //configure the external interrupt GICR |= (1<<INT0); MCUCR &= ~(1<<ISC01); MCUCR |= (1<<ISC00); // enable interrupts sei(); while(1); return 0; } SIGNAL (SIG_INTERRUPT0) { PORTC = 0xff; }
gibt wohl doch ein problem :( ich nutze jetzt den PORTB (war mit PORTC auch net anders). es kommt mir vor, als würde sofort nach dem Einschalten ein IRQ auftreten, und auch danach in sehr kurzen abständen (10ms?). Ich habe eine LED angehängt und die scheint zeitweise zu flackern (für ein paar Sekunden) dann leuchtet sie wieder durchgehend (auch wieder ein paar Sekunden). der Code ist folgender: #include <avr/io.h> #include <avr/interrupt.h> // sei() #include <avr/signal.h> // SIGNAL #define XTAL 1000000 int ab = 0x00; int main(void) { // configure all PortB bits as output DDRB = 0xff; PORTB = 0x00; //configure the external interrupt GICR |= (1<<INT0); MCUCR |= (1<<ISC00) | (1<<ISC01); // enable interrupts sei(); while(1); return 0; } SIGNAL (SIG_INTERRUPT0) { if (ab == 0x00) { PORTB = 0xff; ab = 0xff; } else { PORTB = 0x00; ab = 0x00; } } Nun zur eigentlichen Frage: warum ist das so? Ein IRQ sollte doch erst bei Überschreiten eines gewissen Pegels auftreten .. oder? - Mein Multimeter zeigt eigentlich schöne 0,00V (Low) und 4,3V (High) an. Das Ganze hängt an einem FT245 - kann hier das Problem liegen?
Ich habe heute an einem aehnlichen Problem gearbeitet. Bei mir laeuft es jetzt. Ich verstehe diesen Teil Deines Programms nicht: //configure the external interrupt GICR |= (1<<INT0); MCUCR |= (1<<ISC00) | (1<<ISC01); Ich weiss nicht, was Du z.B. mit 1<<INT0 machst. Bei mir sieht das so aus und es funktioniert: // Konfiguration des Interrupts // Der externe Interrupt INT0 liegt an PD2 (Pin4 des Atmega8) // INT0 soll bei fallender Flanke ausloesen, weil an Pin4 ein Pullup- // widerstand nach Vdd und ein Taster nach GND geschaltet sind. MCUCR = 0x02 ; // INT0 aktivieren GIMSK = 0b01000000 ; // PD2 of Datadirection Register D to input DDRD = 0b11111011 ; Ich habe das ganze aber nur auf dem Simulator getestet, da ich noch keine Hardware habe.
Also bei Deinem Code sollte eigentlich bei einer steigenden Flanke an INT0 ein Interrupt ausgelöst werden. Vielleicht ist das Signal nicht sauber, oder der USB-Chip gibt tatsächlich diese INT-Signale aus.
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.