- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: ATmega8 ext. Interrupt

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Liquidator Beitrag anzeigen
    Hallo liebe Gemeinde,

    es handelt sich um ein Problem bei der Tasterabfrage per Interrupt. Ich möchte einen Tasterzustand auf INT1 abfragen und auf low level triggern.
    Hier der grundsätzliche Programmaufbau, mal eben eingetippt:

    Code:
    ISR(INT1_vect) {...}
    
    int main (void)
    {
    DDRD = 0xF7;              // PD3 als Eingang definiert
    PORTD |= (1<<PD3);     // Pullups aktiviert
    ...
    MCUCR &= ~((1<<ISC11)|(1<<ISC10);     // auf low-level Zustand getriggert
    GICR |= (1<<INT1);                              // INT1 aktiviert
    
    sei();
    
    while(1) {...}
    ...
    }
    Nach meinem Verständnis sollte doch, solange der low level- Zustand am Taster herrscht (und der herrscht immer, wenn der Taster nicht gedrückt ist) ständig der INterrupt ausgelöst werden und somit nur die ISR ausgeführt werden?
    Der Taster ist per Tiefpass entprellt und wechselt von HIGH auf LOW und umgekehrt in 500ns.

    Der eigentlich Fehler ist, dass der ext. Interrupt nie durchgeführt wird und ich nicht weiß, woran es noch liegen könnte.

    Ich verwende neben der Funktion auch die beiden Timer, deshalb dachte ich erstmal, dass es an dem im Kap."Errata" aufgeführten bug liegt...


    Grüße,
    Nik
    So, wie wärs wenn du einfach mal den ganzen anderen Rest von deinem Programm auskommentierst, so dass da nur noch genau das da steht. In der ISR toggelst du dann einfach einen PIN und hängst diesen ans Oszi.
    Und wenn dieses ganz einfach Programm dann mal läuft, sehen wir weiter.

    mfg

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Ich werf auch einfach mal Tasten-Prellen in den Raum. Einen Taster an einem externen Interrupt macht man eig nicht. Wenn du eh mehrere Timer schon in Verwendung hast, nutze doch irgend einen, der so etwa alle 10ms einen Interrupt auslöst. Und in diesem fragst du den Pin ab. Wenn er beim zweiten Interrupt immer noch gedrückt ist, hast du deinen Tastendruck. So ist die Vorgehensweise, wie ich sie kenne und auch erfolgreich nutze.

    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78
    Hallo liebe Gemeinde,

    als Erstes möchte ich mich bei oberallgeier bedanken für den tollen Einfall mit der Interruptkontroll-LEDs, ist bereits in einem anderen Projekt untergebracht worden und wird auch fortan auf Prototypen benutzt
    Allen anderen ebenfalls vielen Dank. Und nun meine Geschichte im Zeitraum "letzter Beitrag - #define Zeit_aktuell dd:mm:yyyy"

    Ich habe angefangen den kompletten Projektcode zu optimieren, vorerst ohne die Tasterfunktionen. Der Grundgedanke war in Richtung RTOS zu gehen, bzw. wenigstens einen Scheduler zu implementieren. D.h. der ganze Code wurde hinsichtlich einer quasiparallelen Signal- und Datenverarbeitung optimiert. Es wurden absolut alle delay_ms()-Funktionen entfernt und durch Abfragen des Systemtaktes eines der Timer synchronisiert. Alle großen Tasks wurden aufgeteilt und in einzelnen Funktionsprozeduren untergebracht.
    Nachdem der Code geschrumpft war und tatsächlich schneller funktionierte, versuchte ich mich weiterhin an meinen Lieblingstaster. Egal ob

    Code:
    ISR(INT1_vect) {...}
    oder

    Code:
    uint8_t capt_button(void) {
    
        if (PIND & (1<<PD3))
            return 1;
        else 
            return 0;
    }
    verwendet wurde, der Taster konnte AN, jedoch nicht mehr ausgeschaltet werden.
    Und DANN kam die Erleuchtung! Der von mir verwendete gegen +5V angeschlossene Taster durchlief einen passiven Tiefpass. Dadurch, dass der sich dort befindende Kondensator durch +5V aufgeladen wurde, jedoch nicht über den als Input definierten Pin entladen werden konnte, bliebt der Signalpegel nach dem ersten Betätigen stets auf HIGH. Ab da war es einfach: Der entsprechende Pin musste kurzzeitig als Output auf Masse gelegt werden. Et voilà!

    Also im Grunde folgende Einstellung, beispielhaft für den ganzen Port.

    Code:
    DDRD = 0xFF; // Alle Pins als Ausgänge
    PORTD= 0x00; // Alle Ausgänge auf Null ziehen
    Nun kann ich ohne Probleme verschiedene Druckzeiten abfangen und ggf. verschiedene Reaktionen auslösen etc.

    Es war zwar extrem zeitraubend, aber dafür konnte ich mal wieder viel auf diesem Weg lernen und bin nun dabei, ein Echtzeitsystem für 8-Bit zu schreiben. (sprich: Rad neuerfinden, um des Wissens willen.)

    Grüße,
    Nik
    Geändert von Liquidator (24.05.2015 um 20:09 Uhr)

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. ext. Quarz an ATmega8
    Von Zwerwelfliescher im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 14.03.2010, 18:31
  2. ext. Quarz an ATmega8
    Von Zwerwelfliescher im Forum AVR Hardwarethemen
    Antworten: 18
    Letzter Beitrag: 24.02.2010, 21:01
  3. Ext. Interrupt löst nur unregelmässig aus
    Von Murus im Forum AVR Hardwarethemen
    Antworten: 27
    Letzter Beitrag: 08.01.2007, 17:34
  4. Rücksprungposition nach einem ext.Interrupt
    Von lejcko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 27.01.2006, 16:21
  5. Verständnisfrage Counter mit ext. Interrupt
    Von m@rkus33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 23.12.2005, 08:13

Berechtigungen

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

LiFePO4 Speicher Test