Forum: Compiler & IDEs Interrupt INT1 will nicht


von o19o (Gast)


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

von Fritz Ganter (Gast)


Lesenswert?

//sei ();

Du hast die Interrupts nicht aktiviert.

von o19o (Gast)


Lesenswert?

Das hab ich aber auch schon gemacht, ist halt noch ein teil drin ein
teil auskommentiert. War nur mal so eine Version.

von Fritz Ganter (Gast)


Lesenswert?

Sollte es nicht GIMSK = 1<<INT1 heissen?

MCUCSR sollte auch gesetzt werden.

von OldBug (Gast)


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...

von proXon (Gast)


Lesenswert?

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 ;)

von Herbert Kaiser (Gast)


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

von Christof Krüger (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.