- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 59

Thema: Interrupt-Abfrage >>> Routine vereinfachen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Hallo.
    Habe wieder einwenig Zeit zu experimentieren.

    Bei meinem derzeitigen Schritt geht es darum, innerhalb der while(1), oder eines ISR bestimmte Pin ein- oder auszuschalten.

    Folgender Versuch klappt nicht - PA5 bleibt dauerhaft im Eingangs-Modus.
    Code:
    LEDgn_ein();
     DDRA &= ~(1<<PA5); // Eingang!
      _delay_ms(1000);
    LEDgn_aus();
     DDRA |= (1<<PA5);  //Ausgang, somit kein Eingang?
      _delay_ms(1000);
    Aber warum?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Wie kommst du darauf dass es nicht funktioniert?! Misst du mit einem Messgerät? Hast du in PORTA denn auch PA5 gesetzt?

    Nur weil du den Pin aus Ausgang stellst gibt er nicht automatisch ein High Signal aus, du musst auch das PA5 im PORTA setzen, damit er den Ausgang high setzt.

    Das DDR bestimmt nur ob dein Pin aktiv (5V mit PA5 in PORTA oder GND ohne PA5) oder passiv (High-Z oder Pull Up wenn PORTA gesetzt ist) ist
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Zitat Zitat von Ceos Beitrag anzeigen
    Wie kommst du darauf dass es nicht funktioniert?!
    Soll:
    Sobald LED/gn kann PA5 als Eingang, Taster über einen Timer-ISR eine LED/rt schalten.
    Solang LED/gn ausgeschaltet ist, kann auf Taster PA5 rumgetippt werden > nichts passiert.
    Ist:
    Taster an PA5 kann jederzeit steuern. Also dauerhaft als ein Eingang konfiguriert.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Sorry das ist etwas zu kurzsilbig, ich versteh der Satz gerade nicht mal

    Der ISR und auch das PIN Register funktionieren unabhängig vom DDR Register!
    Observe that, if enabled, theinterrupts will trigger even if the INT0 or PCINT[5:0] pins are configured as outputs
    du musst den Interrupt also schon aus/blindschalten und dann den Pin über das PORT Register entsprechend setze.

    Der Taster an einem auf output geschalteten Pin bedeutet natürlich auch ein Kurzschluss, ist also generell nicht empfehlenswert!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    @ceos
    Bei meinem Timer-Interrupt werden innerhalb des ISR die Eingänge PA4, PA5 abgefragt.
    Im main() werden für gewöhnlich die DDR einmalig als Ein- oder Ausgänge konfiguriert.
    Nun möchte ich aber innerhalb der while(1) jeden einzelnen Eingang nach Bedarf "Stumm" schalten, so dass im ISR, if((PINA & (1<<PINA5)) != 0) //1=tu was, ins "leere" läuft.
    Daher meine Idee, den entsprechenden Pin, "mal eben" als Ausgang zu konfigurieren.

    @021aet04
    5V==High==1
    Kurzschluss auf der Ausgangsleitung? Wenn der uC/Out==low==0, uC-intern direkt mit dem Gnd verbunden ist, ist das tatsächlich möglich.
    Geändert von frabe (14.08.2019 um 14:22 Uhr)
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    wie aus der Doku zitiert, das geht leider nciht, du kannst also nur den
    PCMSK0 umkonfigurieren um deine ISR zu blockieren. Zusätzlich solltest du alelrdings in deinen Abfragen auch den Pin ausmaskieren, sonst löst er trotzdem aus, wenn du beide Taster drückst.

    Du musst also alles maskieren
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Zitat Zitat von Ceos Beitrag anzeigen
    PCMSK0 umkonfigurieren um deine ISR zu blockieren.
    PCMSK0 = (1<<PCINT4)|(1<<PCINT5);
    konfiguriere ich nur beim PortChange-Interrupt, nicht aber beim Timer-Interrupt.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Bei solchen Dingen musst du aufpassen. Du kannst einen Kurzschluss erzeugen.

    Wie sieht deine Schaltung aus?

    Der Programmteil ist in Ordnung und sollte so funktioieren. Es kann sein das du es noch irgendwo anders änderst (ungewollt). Was macht "LEDgn_ein();" bzw "LEDgn_aus();" genau (Led ein/ausschalten ist klar, wie sieht aber die Funktion aus).

    Ich würde das aber etwas anders lösen. Du hast einmal das Eingangsbit von PA5 und einmal ein "Merkerbit" mit dem du das einlesen "freigibst". Diese beiden Bits verknüpfst du mit einem "Und".

    MfG Hannes

Ähnliche Themen

  1. [ERLEDIGT] Interrupt Routine
    Von Saturas077 im Forum Assembler-Programmierung
    Antworten: 8
    Letzter Beitrag: 23.04.2014, 12:46
  2. Codebeispiel für Lesen von RC5 Code mit Interrupt-Routine
    Von -tomas- im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 25.05.2011, 12:54
  3. Interrupt Routine
    Von luvat im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 4
    Letzter Beitrag: 16.03.2008, 20:54
  4. Interrupt in ISR-Routine freigeben
    Von dj5am im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 10.08.2007, 08:44
  5. uart interrupt routine
    Von Computerkora im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 25.11.2006, 13:45

Berechtigungen

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

12V Akku bauen