www.mikrocontroller.net

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


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.