-
        

Ergebnis 1 bis 8 von 8

Thema: Interrupt Problemchen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    36
    Beiträge
    131

    Interrupt Problemchen

    Anzeige

    Ich möchte gerne mittels Taster, der an PortD2 angeschlossen ist, einen Interrupt auslöst.

    Atmega32
    Taster ist mittels GROUND verbunden, was heisst, das er den Pin PORTD2 auf Masse zieht.

    Code:
    ISR (INT0_vect)
    {
    
    	//Interrupt deaktivieren
    	cli(); 
    
    	lcd_clear();
    	lcd_home();
    	lcd_out("Taster wurde");
    	second_row();
    	lcd_out("gedrückt!");
    	delay_3();
    	delay_1();
    	
    	//Interrupt aktivieren
    	sei(); 
    }
    Dies ist meine ISR: Sie soll einfach den Text ans Display ausgeben.

    Main
    Code:
    int main(void)
    {
    
    sei();
    lcd_clear();
    lcd_home();
    lcd_out("waiting...");
    delay_3();
    }
    Ist irgendetwas falsch an meinem Code?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.11.2004
    Ort
    München
    Alter
    30
    Beiträge
    447
    Hallo,
    Du musst die Interrupt Register so einstellen, dass der Interrupt auch passiert wenn du willst.

    z.B.:
    Code:
    	GIMSK |= (1 << INT0);
    	MCUCR |= (1 << ISC00);
    MfG Alex

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo semicolon,
    du solltest im main() auch noch eine Endlosschleife spendieren.
    Dabei natürlich die Interrupt-Enable-Funktion von PasstScho mit einbauen.

    z.B.:
    Code:
    int main(void)
    {
       GIMSK |= (1 << INT0);
       MCUCR |= (1 << ISC00);
    
       sei();
    
       while (1)
       {
          lcd_clear();
          lcd_home();
          lcd_out("waiting...");
          delay_3();
       }
    }
    Wenn dein delay_3() ca 3 Sekunden Pause macht, dann solltest du mit dem Tastendruch zwischen den "waiting..."-Ausgabe auch mal die Ausgabe aus deiner Interruptfunktion ins Display bekommen.

    Kleiner Tipp:
    Interrupt-Funktionen IMMER schnell halten. Soll heissen: Keine delay's einbauen.
    Lieber Asuro programieren als arbeiten gehen.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    In der ISR brauchst du kein cli zu machen, Interrupts werden durch die Hardware während Ausführung der ISR deaktiviert.
    Das sei am Ende ermöglicht geschachtelte Interrupts! Das willst du sicher nicht. Wirf das raus.
    Disclaimer: none. Sue me.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Zitat Zitat von SprinterSB
    In der ISR brauchst du kein cli zu machen, ...
    Eine Frage hierzu: Ich kenne die AVR-Programmierung nur durch den ASURO. In der dortigen C-Entwicklungsumgebung wird ein angepasster GCC als Compiler genutzt.
    Um damit eine ISR zu schreiben gibt es zwei Varianten um eine ISR einzuleiten:

    1: SIGNAL (Interrupt-Name)
    Das ist die Regel bei den mir bekannten ASURO-Sourcen. Hier werden tatsächlich innerhalb der ISR keine weiteren Interrupt behandelt. Erst nachdem eine ISR fertig ist, prüft die CPU ob eine weitere ISR aufgerufen werden muss.

    2: INTERRUPT (Interrupt-Name)
    Hier können laut Doku auch innerhalb der ISR-Funktion noch weitere Interrupts kommen, und werden auch sofort bearbeitet solange der zweite Interrupt eine höhere Proiorität hat. (Prio. ist durch die Hardware festgelegt.)
    P.S.: Ich hoffe, dass es INTERRUPT (..) heisst, bin aber 100%-sicher, das es diese Variante gibt.

    Nun zur Frage:
    semicolon nutzt zur ISR-Einleitung ISR (INT0_vect). Ist hier eine andere Compiler-Variante im Spiel? Und wenn ja, gibt es eventuell auch hier die beiden oben aufgeführten Möglichkeiten? Was macht dann aber ISR() genau? (mit/ohne unterbrechbarkeit)

    @semicolon
    Ich bin nur neugierig. Dieser Eintrag hat nicht allzuviel mit deiner Aufgabenstellung zu tun.
    Lieber Asuro programieren als arbeiten gehen.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    SIGNAL/INTERRUPT wird vom "alten" GCC verwendet
    ISR vom "neuen" (ca. seit Anfang 2006)

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    BTW: Auch der "alte" GCC wird weiterentwickelt, auch nach der Release des "neuen".

    Das ISR in GCC 4.x entspricht dem SIGNAL in der 3.x.
    Syntactic sugar, mehr nicht.

    Das Analogon zu INTERRUPT muss man händisch mit Attributen codieren. Einfach ins Precompile schauen und das signal-Attribut durch ein interrupt-Attribut austauschen. Ausserdem steht's in RN-Wissen unter avr-gcc.
    Disclaimer: none. Sue me.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Danke für die Info.
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

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