www.mikrocontroller.net

Forum: Compiler & IDEs Interrupt INT1 will nicht


Autor: o19o (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//sei ();

Du hast die Interrupts nicht aktiviert.

Autor: o19o (Gast)
Datum:

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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte es nicht GIMSK = 1<<INT1 heissen?

MCUCSR sollte auch gesetzt werden.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: proXon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Herbert Kaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.