Forum: Mikrocontroller und Digitale Elektronik Drehencoder an einem MC (Mega2560)


von Der G. (jonnyk)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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

von Der G. (jonnyk)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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

von Der G. (jonnyk)


Lesenswert?

>>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
Noch kein Account? Hier anmelden.