Hallo Leute ich habe da mal ne Frage, Ihr kennt euch sicherlich mit Externen Interrupts aus... Ich habe jetzt einen Drehencoder an den Pins PINE6 und 7 angeschlossen. Interrupst habe ich auch schon Programiert. Läuft alles einwand frei bis auf einen Bug. Es wird immer nur ein Interrupt aufgerufen egal in welche richtung ich den Drehencoder drehe. Wodran kann es Liegen? Hier mein Code: ISR (INT6_vect) { char i[2]; i[0]=1; i[1]='\0'; uart_putvar_PC (i); } ISR (INT7_vect) { char i[2]; i[0]=5; i[1]='\0'; uart_putvar_PC (i); } void initialisierung(void) { //Die Schnitstellen initialisieren USART_Init_PC(115200); //Zum PC USART_Init_DP(115200); //Zum Display //Die interrupt PULL -UP einschalten PORTE = 0xFF; //Ausgabe Herzlichwillkommen am PC; uart_puts_PC ("Herzlich Willkommen\r\n"); //Register für die interrupts setzen SREG |= (1<<WDIF); //Globale interrupts erlauben TCNT1 |= 0x000F; //Timer1 Capture für externe interrupts setzen EICRB |= (1<<ISC41)|(1<<ISC40)|(1<<ISC70)|(1<<ISC61); //Timer zustände Initialisieren EICRB &=~(1<<ISC71)|(1<<ISC60); EIMSK |= (1<<INT4)|(1<<INT7)|(1<<INT6); //Interupt pins 4,6,7 erlauben } int main(void) { //Schnittstellen und Interrupts initialisieren initialisierung(); while(1); } Es wird immer nur ne 1 ausgagaben. Achso und noch was: Wenn ich nähmilich den Interrupt 6 auskommentiere und der ENCODER drehe dann gibt mir der MC ein "Herzlich willkommen" aus obwohl er das nur in der initialisierungs routine tun sollte???? Bedanke mich in vorraus und hoffe dass mir jemand helfen kann.
@Der Grosse (jonnyk) >Ihr kennt euch sicherlich mit Externen Interrupts aus... Ein wenig. >Ich habe jetzt einen Drehencoder an den Pins PINE6 und 7 angeschlossen. Drehgeber werden anders ausgewertet, siehe Artikel. >Läuft alles einwand frei bis auf einen Bug. Es wird immer nur ein >Interrupt aufgerufen egal in welche richtung ich den Drehencoder drehe. >Wodran kann es Liegen? ohne d. > //Register für die interrupts setzen > SREG |= (1<<WDIF); //Globale interrupts erlauben Böse, böse. Das macht man in C nciht so. Dafür gibt es sei(); Und das gehört ans ENDE der Initialisierung. MFG Falk
Gut das ist ja alles mit ständigem Polling verbunden. Ich möchte aber gerne über interrupts es machen. Problem ist das bei mir immer nur einer aufgerufen wird wie kann ich es unterbinden. Im datenblat vom MC stand dass eine flanke min. 50 us (oder ns) sein muss um den interrupt auszulösen. D.h. wenn ein interrupt 50 us schneller kommt als der andere dann muss er auch zuerst ausgeführt werden richtig? Wieso geht es dann nicht? würde mich freuen wenn einer eine antwort darauf hat.
@Der Grosse (jonnyk) >Gut das ist ja alles mit ständigem Polling verbunden. Da wird gar ncihts gepollt, sonder per Timerinterrupt eingelsen und verarbeitet. >Im datenblat vom MC stand dass eine flanke min. 50 us (oder ns) sein >muss um den interrupt auszulösen. Stimmt nicht. Das ist die minimal LOW Zeit eines Levelsensitiven Interrupts zum Aufwachen, siehe Seep Mode. >D.h. wenn ein interrupt 50 us schneller kommt als der andere dann muss >er auch zuerst ausgeführt werden richtig? Nein. MFG Falk
>>Im datenblat vom MC stand dass eine flanke min. 50 us (oder ns) sein >>muss um den interrupt auszulösen. >Stimmt nicht. Das ist die minimal LOW Zeit eines Levelsensitiven >Interrupts zum Aufwachen, siehe Seep Mode. Hier Steht es: Table 15-2. Asynchronous External Interrupt Characteristics Symbol Parameter Condition Min Typ Max Units tINT Minimum pulse width for asynchronous 50 ns external interrupt Seite 140 Datenblatt vom MEGA 256 >>Gut das ist ja alles mit ständigem Polling verbunden. >Da wird gar ncihts gepollt, sonder per Timerinterrupt eingelsen und >verarbeitet. Im end effeckt ist es nichts anderes als polling. wenn der Timer einen überlauf macht dann gucke ich nach den Pegeln und verarbeite es. wenn ich Polle dann gucke ich auch in bestimmten abständen nach und verarbeite es. Wie ist den der Neustart zu erklären wenn ich den Interrupt 6 auskommentiere? Die Pins haben doch mehrere funktionen kann es irgend was damit zutun haben?(fuses oder so? ) PIN 7 = (CLKO/ICP3/INT7) PE7 PIN 6 = (T3/INT6) PE6 Danke Falk dass du als einziger gedult mit mir hast...
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.