-         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Interrupt als Eingangsabfrage

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    07.06.2019
    Beiträge
    73
    Anzeige

    Hallo - die lange Wartezeit da ua. Urlaub und Krankheit dazwischen kam.

    Habe jetzt mal ein kleines C-Prog (ATtiny84) mit Eingabe-Interrupt versucht.
    Funktioniert nicht - LED ist dauerhaft aus.
    Könnt ihr mir auf die schnelle Helfen?

    int main(void)
    {
    ...
    //Interrupt-Routine wird defeniert
    GIMSK = (1<<PCIE0); // Bank0 wird eingeschaltet (PA0-PA7) // BANK1 beinhaltet PB0-PB3
    PCMSK0 = (1<<PCINT4)|(1<<PCINT5); // PCINT4(PA4) und PCINT5(PA5) könnte Interrupt auslösen
    sei(); // Interrupt´s werden gestartet und laufen im Hintergrund

    while(1) // alternativ SLEEP-Mode
    ...
    }

    ISR (PCINT0_vect) // Interrupt, aus Bank0, wird ausgelöst
    {
    //vorerst ohne Tastenentprellung und altem Tastenzustands-Vergleich
    if ((PINA & (1<<PINA4)) == 1) // wenn EIN-Taster=1
    {
    LEDein;
    }
    if ((PINA & (1<<PINA5)) == 1) // wenn AUS-Taster=1
    {
    LEDaus;
    }}
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.546
    Blog-Einträge
    127
    Zitat Zitat von frabe Beitrag anzeigen
    if ((PINA & (1<<PINA4)) == 1)
    Hallo,
    Du vergleichst die bitweise Verknüfung mit 1. Kann aber nur eins werden, wenn PA0 (PINA0) = 1 und (1<<PINA4) gleich 1 ist. (1<<PINA4) ist aber niemals 1 sondern 16.

    In C bin ich nicht so fit aber vermutlich könnte es so klappen:
    if ((PINA & (1<<PINA4)) == (1<<PINA4))

    Gruß
    Searcher

    PS Code ließt sich besser wenn in Code Tags eingeschlossen: [CODE ]if ((PINA & (1<<PINA4)) == (1<<PINA4))[/CODE ] Ohne die Leerzeichen in den Klammern wird das
    Code:
    if ((PINA & (1<<PINA4)) == (1<<PINA4))
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    31
    Beiträge
    4.817
    Eine if Abfrage ist automatisch eine Abfrage auf ungleich 0.

    Somit reicht es wenn du PINA und PINA4 mittels "und" verknüpfst.

    Code:
    if (PINA & (1<<PA4))
    PINA ist der gesamte Port
    PA4 (und die anderen Bezeichnungen) ist in den Libs definiert (PA4 => 4)
    Der Ausdruck "(1<<PA4)" bedeutet also das du die "1" um 4 Stellen nach links schiebst => 0001 0000
    Das ergibt dann:
    als Beispiel wenn PINA = 0xff
    Code:
     PINA:    1111 1111
      PA4:  & 0001 0000
    -------------------
    Ergebnis: 0001 0000
    If wird somit ausgeführt weil das Ergebnis nicht "0" ist, sondern 16.

    Für solche Dinge ist der Simulator nicht schlecht geeignet. Du kannst es Schritt für Schritt abarbeiten lassen (oder mit Debugger) und schauen was passiert.

    MfG Hannes

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    07.06.2019
    Beiträge
    73
    Dank euch vielmals für eure Mühe.

    Leider war keiner der folgenden plausiblen Versuche erfolgreich;
    Code:
    if ((PINA & (1<<PA4)) != 0)
    if ((PINA & (1<<PA4)) == 16)
    if (PINA & (1<<PA4))
    Daher vermute ich den Fehler innerhalb Interrupt-Einstellung;
    Code:
    GIMSK = (1<<PCIE0); // Bank0 wird eingeschaltet (PA0-PA7) // BANK1 beinhaltet PB0-PB3
    PCMSK0 = (1<<PCINT4)|(1<<PCINT5); // PCINT4(PA4) und PCINT5(PA5) könnte Interrupt auslösen
    sei(); // Interrupt´s werden gestartet und laufen im Hintergrund
    //...
    
    ISR (PCINT0_vect) // Interrupt, aus Bank0, wird ausgelöst
    {
    //tu was
    }
    Seht ihr hier ein Fehler?
    Vor allem bin ich mir mit dem GIMSK-Register sehr unsicher.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    31
    Beiträge
    4.817
    Ich habe mir die Register nicht angeschaut, kann ich erst wenn ich wieder Zuhause bin.

    Aber was mir noch einfällt, wie hast du die Tasten angeschlossen? Gegen + oder 0V?
    Du fragst ab ob der Eingang high ist, meist werden aber Pullups verwendet und wenn die Taste gedrückt wird ist es dann low.
    Dann hast du folgendes Problem.
    Keine Taste gedrückt: Es werden beide If ausgeführt, zuerst ein und gleich darauf aus.
    Eine Taste gedrückt: Die jeweilige If Abfrage wird übersprungen, wenn du aber heruntergehst wird sofort wieder abgeschalten (siehe keine Taste gedrückt) .

    MfG Hannes

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    07.06.2019
    Beiträge
    73
    Ich verwende Taster/Schalter, die auf Vcc liegen, mit Pulldown-Widerständen.
    Dh., beim Tasten/Schalten, liegt am Schaltausgang Vcc an.
    Daher mein Gedankenfehler;
    Code:
    if ((PINA & (1<<PA4)) == 1)
    - - - Aktualisiert - - -

    OH-MANN ... blöder als man(n) denken kann... (ich brauche H I T Z E F R E I !)

    Code:
    LEDein; // Falsch!
    LEDaus; // Falsch!
    kann nicht ohne Klammer funktionieren;
    Code:
    LEDein();  // Richtig!
    LEDaus();  // Richtig!
    funktioniert ausgezeichnet!
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    31
    Beiträge
    4.817
    Hauptsache ist ja das es funktioniert, mir ist es aber auch nicht aufgefallen.

    MfG Hannes

Seite 2 von 2 ErsteErste 12

Ä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. [ERLEDIGT] 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
  •