- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Interrupt als Eingangsabfrage

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    142

    Interrupt als Eingangsabfrage

    Anzeige

    E-Bike
    Hallo.
    Aktuell beschäftige ich mich mit Interrupts als I/O-Eingangsabfrage/Einganbgsüberwachung.
    Hier habe ich beim ATTiny84 mehrere Möglichkeiten; INT0, PCINT0-11

    Wo ist denn der grundsätzliche Unterschied zw. INT0 und PCINT10, beides auf PB2 (Pin5) ?
    Wird doch beides mit MCUCR und GICR konfiguriert und eingeschaltet?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von frabe Beitrag anzeigen
    Wo ist denn der grundsätzliche Unterschied zw. INT0 und PCINT10, beides auf PB2 (Pin5) ?
    INT0 kann auf verschiedene Arten ausgelöst werden. zB steigende oder fallende Flanke und andere. Konfiguriert wird das im MCUCR mit den ISC00 und ISC01 Bits.

    PCINT10 wird bei steigender und bei fallender Flanke ausgelöst. Das kann nicht konfiguriert werden, sondern ist so festgelegt. Damit PCINT10 funktioniert, muß er im PCMSK1 Register mit dem PCINT10 Bit selektiert werden. Der I/O Pin kann dann über das PCIF1 Flag im GIFR Register den Pin Change Interrupt 1 auslösen. PCINT10 selbst hat keinen Interruptvektor sondern springt durch das Selektieren im PCMSK1 über den Pin Change Interrupt 1 (Interruptvektor 4) in die ISR.

    Beide, Pin Change Interrupt 1 und INT0, müssen im GIMSK Register zugelassen (enabled) werden.

    Wird doch beides mit MCUCR und GICR konfiguriert und eingeschaltet?
    Nein. Im MCUCR wird nur die Auslösebedingung für den INT0 festgelegt. Ein GICR gibt es im ATTiny84 nicht. Im GIFR wird nicht konfiguriert sondern eventuell die Interrupt Flags abgefragt oder gelöscht.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    142
    Danke für deine Ausführungen - muss ich erst einmal verarbeiten..."
    Mir scheint, bei Abfrage mehrerer I/O-Eingänge, die Nutzung der PCINT0-11 einfacher zu sein.

    PCINT10 wird bei steigender und bei fallender Flanke ausgelöst. Das kann nicht konfiguriert werden, sondern ist so festgelegt.
    Hmm? Das bedeutet, dass grundsätzlich 2 Interrupts bei einem Tastendruck kommen? Der 2te müsste irgendwie abgefangen/ingnoriert werden.

    PCINT10 selbst hat keinen Interruptvektor sondern springt durch das Selektieren im PCMSK1 über den Pin Change Interrupt 1 (Interruptvektor 4) in die ISR.
    ...ist mir gerade zu hoch.
    Laut Datenblatt stehen nur PCINT0 und PCINT1 als Interrupt-Vektor zur Verfügung.
    Ist es das was du meinst?
    Datenblatt-Ungenauigkeit oder PCINT2-11 über einen "Umwege" zu einer Interruptauslösung?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von frabe Beitrag anzeigen
    Hmm? Das bedeutet, dass grundsätzlich 2 Interrupts bei einem Tastendruck kommen? Der 2te müsste irgendwie abgefangen/ingnoriert werden.
    Es sind noch mehr. Jedes Prellen erzeugt weitere und je älter der Taster wird, desto mehr. Daher wird das gerne anders gemacht. Es gibt einen zentralen Timerinterrupt, z.B. alle 10ms, und da werden alle Tasten abgefragt. Da wird dann entprellt und falls man möchte zwischen langem und kurzen Tastendruck unterschieden. In diesem Interrupt kann man dann auch alle weiteren regelmäßigen Dinge machen, mit dem ADC die Spannung oder eine Temperatur überwachen, einen Drehenkoder auswerten und diverse SW-Timer z.B. für blinkende LEDs erzeugen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    142
    Jedes Prellen erzeugt weitere und je älter der Taster wird, desto mehr.
    Natürlich entprellte Tasten und Schalteingänge vorausgesetzt.

    Es gibt einen zentralen Timerinterrupt
    Wie passend, damit habe ich mich letzte Woche beschäftigt.

    ADC die Spannung
    ADC-Spannungsingänge werte ich via Bit-Schwellwert in einer Variable aus. Allerdings erst nach gezielter Werteabfrage.
    Auf Interrupts bin ich hier noch gar nicht gekommen...
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von frabe Beitrag anzeigen
    Natürlich entprellte Tasten und Schalteingänge vorausgesetzt.
    Warum Tasten entprellen, wenn man einen µC hat der das erledigen kann.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    142
    Software-Entprellung...allerdigs erst nach Abfrage.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von frabe Beitrag anzeigen
    Das bedeutet, dass grundsätzlich 2 Interrupts bei einem Tastendruck kommen? Der 2te müsste irgendwie abgefangen/ingnoriert werden.
    Je nach Programm. Klebwax hatte darauf ja schon geantwortet. Wenn der zweite Interrupt ignoriert werden soll: Man weiß ja normal, welche Flanke ausgewertet werden soll. In der, durch irgendeine der beiden Flanken ausgelösten ISR (es ist ja die gleiche ISR) fragt man zB das PIN-Register Bit des entsprechenden PINs ab um den Pegel des PINs zu bestimmen. Ist es gesetzt war es die steigende Flanke. Ist es rückgesetzt war es die fallende Flanke und man kann entsprechende Aktionen vorsehen.

    Laut Datenblatt stehen nur PCINT0 und PCINT1 als Interrupt-Vektor zur Verfügung. Ist es das was du meinst?
    Ja, für alle zwölf PCINT stehen nur zwei Interruptvektoren zur Verfügung. Mich hatten zu Anfang auch die Namen verwirrt. Man darf nicht die, in der Interruptvektor Tabelle genannten Sourcenamen mit den Namen am I/O Pin bzw Bitnamen in den PCMSK Registern verwechseln/vermischen. Es gibt nur zwei Interruptvektoren für alle zwölf PCINT-auslösefähigen PINs im ATtiny84. Das sind die PCINT0 und PCINT1 Interrupts.

    Welche von den zwölf Pins einen PCINT auslösen können bestimmt man durch Setzten des entsprechenden Bits in den PCMSK Registern. Ist dort kein Bit gesetzt, findet auch kein PCINT0 oder PCINT1 statt. Die Interrupts PCINT0 bzw PCINT1 sind den PCMSK Registern fest zugeordnet. Laut Datenblatt können PA0 bis PA7 Pins mit ihren PCINT0 bis PCINT7 Bits im PCMSK0 Register nur den PCINT0 Interrupt auslösen. Die andern Pins mit ihren Bits im PCMSK1 nur den PCINT1.

    Es können also durch Setzen mehrerer Bits in einem PCMSK Register mehrere PINs den gleichen Interrupt auslösen. Welcher Pin das war, könnte man dann in der ISR zB durch Zustandsabfragen der in Frage kommenden PINs feststellen.

    Datenblatt-Ungenauigkeit oder PCINT2-11 über einen "Umwege" zu einer Interruptauslösung?
    Datenblatt Ungenauigkeit würd ich das nicht nennen, eher unglückliche Namensgebung. Umweg? Naja, ist halt so vom Hersteller entworfen. Wenn man die richtige Anwendung noch dafür erfindet oder sogar schon hat, wär man für diese Lösung bestimmt noch dankbar

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Pinchanges verwende Ich im Prinzip nicht so gerne.
    Eben weil man im Nachgang feststellen muss welcher Eingang denn nun den Interrupt getriggert hat und welche Flanke es war.

    Ich lass eigentlich bei jedem Projekt einen Timer mitlaufen.
    In seinem Timer Overflow Interrupt lasse ich dann einfach einen oder mehere Countdown Zähler runterzählen.

    Die Anfangswerte werden im Hauptprogramm gesetzt und erst wenn der Counter wieder 0 erreicht hat wird nachgeschaut ob sich was geändert hat.

    Beispiel:
    Im Hauptprogramm wurde festgestellt, das eine Taste ihren Zustand geändert hat.
    Dann wird der zugehörige Countdown Zähler mit einem Wert vorbelegt.

    Die Timer Overflow Interrupt routine zählt diesen Zähler dann runter.

    Wenn der wieder 0 erreicht hat wird geguckt, ob sich der Tastendruck bestätigt hat ( = Aktion auslösen ), oder ob die Taste nur geprellt hat.
    Die entprell Zeiten lassen sich somit einfach durch verändern des Countdown Initial Wertes einstellen.

    In der gleichen Timer Overflow Interrupt Routine lassen sich dann auch noch weitere Counter für andere Aufgaben realisieren.
    Z.B. einen Countdowncounter für ein Display refresh usw.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    142
    Nur mal so zum Verständnis;
    Diese Methode verbindet eine Timer-Interruptabfrage aller Eingänge kombiniert mit einer Entprellung >>> Toll!

    Ich stelle mir das ALS ANFÄNGER so vor;
    1. Zustand aller aktiven I/O-Eingänge wird in Variablen gespeichert.
    2. Timer löst nach 10ms einen Timer-Interrupt aus
    3. Wieder werden alle Eingangszustände ab gefragt und nmit den gespeicherten verglichen
    4.1. keine Statusänderung, wird ab 2. wiederholt
    4.2. Statusänderung erkannt
    5. der betroffene Eingang wird noch 5-10 mal im 10ms Takt abgefragt
    6. bestätigt sich die Statusänderung, wird eine entsprechende Variable (Eingang X==1) weiter verarbeitet

    Das war übrigens mein gestriger Gedanke, eine "Listenabfrage" mit dem INT0, bis die verlockung winkte, dass jeder Eingang seinen eigenen Interrupt hat.
    Dann war mein erster Gedanke doch nicht sooooo schlecht.

    - - - Aktualisiert - - -

    Zur Verdeutlichung meiner möglichen Abfrage-Struktur;

    // PORTs setzen

    //Gesamtes Register auslesen
    uint8_t ZustandPA = PORTA;
    uint8_t ZustandPB = PORTB;

    //einzelne PORTs auslesen
    uint8_t ZustandPA4 = PORT & (1<<PA4);
    uint8_t ZustandPB5 = PORT & (1<<PB5);
    // beliebig erweiterbar

    //INT0 oder TIM1_COMPA_vect Interrupt wird ausgelöst ...

    if ((PORTA != ZustandPA) || (PORTB != (ZustandPB)); // wenn sich irgend etwas an den Eingängen verändert
    {
    if ((PINA & (1<<PA4)) != ZustandPA4; {...mach was...} // wenn ungleich, dann mach was
    if ((PINB & (1<<PB5)) != ZustandPB5; {...mach was...} // wenn ungleich, dann mach was
    // beliebig erweiterbar
    }
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. PVD-Interrupt
    Von kmrish im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 3
    Letzter Beitrag: 19.07.2011, 12:32
  2. Anfänger-Problem mit Eingangsabfrage
    Von fuxx im Forum C - Programmierung (GCC u.a.)
    Antworten: 14
    Letzter Beitrag: 05.08.2009, 11:27
  3. Interrupt
    Von Exodus im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 09.06.2006, 08:10
  4. Interrupt waehrend Interrupt
    Von thomas05 im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 08.11.2005, 07:13
  5. interrupt
    Von dark emporer im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 16.05.2005, 20:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test