Interrupt INT1 will nicht

Gast #100862
Ich will ja nicht jammer, aber der Interrupt will einfach nicht
funktionieren. Hier mal mal Sourceode zum gucken:

#define CPU_CLOCK  8000000     // Frequenz in Hertz, ggf ändern
#define UART_BAUD_RATE 9600   // Wir versuchen mal mit 9600 Baud

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#include "lcd.c"

#define RPM_PORT   PORTA
#define RPM_PIN   7
#define RPM_PINS  PINA


int main(void)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("Starte \n200sx Timer...");

DDR(RPM_PORT) |= _BV(RPM_PIN);          // RPM_PIN als Eingang schalten

//enable_external_int ((1<<INT0));
//sei ();                    // Interrupts aktivieren

DDRA |=0;
GIMSK = 1<<INT1;                // Interrupt von INT0 enablen
MCUCR = 1<<ISC10 | 1<<ISC11;           // Interrupt on rising edge

    for (;;) {

        if( RPM_PINS & (1<<RPM_PIN) ) {
      lcd_puts("Taste");
    }
    }

}

SIGNAL (SIG_INTERRUPT0)
{
    lcd_puts("TasteX");
  outp (0xFF, DDRB);
  outp (0xCF, PINB);
}


Ich wäre um hilfe sehr dankbar
Gast
Bin mir jetzt nicht ganz sicher, aber ich denke, das hier sollte
geklammert werden:

>GIMSK = 1<<INT1;                // Interrupt von INT0 enablen
>MCUCR = 1<<ISC10 | 1<<ISC11;           // Interrupt on rising edge

So:

GIMSK = (1 << INT1);                 // Interrupt von INT0 enablen
MCUCR = (1 << ISC10) | (1 << ISC11); // Interrupt on rising edge

Und natürlich sei(); nicht vergessen...
Gast
GIMSK = 1<<INT1;                // Interrupt von INT0 enablen

SIGNAL (SIG_INTERRUPT0)

was denn jetzt eigentlich INT0 oder INT1 oder beides oder wie??

entscheide dich am besten mal für eine variante ;)
Gast
Hatte das gleiche Problem, wichtig sind die Rücksprungadressen für den
Interrupt am Anfang des Programms wie schon beschrieben.

ldi R17, 0b11000000  ;
out GIMSK, R17        ;Externer Interrupt0 und 1

  ldi R17, 0b00010000   ;Bit1
  out MCUCR, R17        ;Externer Interrupt bei fallender Flanke

  sei                   ;Interrupts generell aktivieren


Hier ist INT0 und INT1 aktiviert. 0b10000000 für INT und 0b01000000 für
INT0.
Beim setzen des MCUCR habe ich auch Probleme, die Daten stimmen nicht
mit denen des Datenblattes überein. aber es läuft so für beide
Interrupts.
Es wäre interessant wenn mir jemand sagen könnte warum. Für INT0 lt.
Datenblatt sollte es 0b00000010 sein, ist aber 0b00000100. Warum,
darüber rätsel ich auch noch.
Der Code wie oben läuft auf jeden Fall für INT0 und INT1, der Int wird
eingeleitet mit der Fallenden Flanke.

Viel Spaß beim ausprobieren
Gast
Mal etwas Allgemeines:
Wenn man ASM programmiert muss man aufpassen, dass man die
Interrupt-Sprungtabelle richtig anlegt. Hatte mal statt jmp-Befehlen
rjmp benutzt, was nicht funktionierte. Das Problem lag daran, dass der
Opcode von rjmp nut 16 Bit breit war, während jmp ganze 32Bit breit
ist. Somit ist mein JMP für den Interrupt "nach oben gerutscht" und
es wurde irgendwo in meine main-routine eingesprungen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.