Interrupt INT1 will nicht

Gast #100862
Lesenswert?
• ▲
▼
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 #100866
Lesenswert?
• ▲
▼
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 #100868
Lesenswert?
• ▲
▼
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 #100869
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren