interrupt tutorial

Gast #23644
Lesenswert?

guten tag.
ich weiss nicht ob die frage vielleicht zu simple ist, aber ich 
verzweifle bald.

ich befinde mich gerade beim durcharbeiten des tutorial auf dieser 
seite.
und zwar bin ich beim interrupt angelangt.

da ich mit dem ATmega103 arbeite (STK 300), hab ich ins datenblatt 
gekuckt, und folgende änderungen am programm vorgenommen.

trotz alle leuchtet keine diode auf, wenn ich besagten schalter drücke.

-----------------------------------------------
.def temp = r16
.include "8515def.inc"

        rjmp main         ; Reset Handler
        rjmp EXT_INT0   ; IRQ0 Handler
        rjmp EXT_INT1   ; IRQ1 Handler
  reti    ; IRQ2 Handler
  reti    ; IRQ3 Handler
  reti    ; IRQ4 Handler
  reti    ; IRQ5 Handler
  reti    ; IRQ6 Handler
  reti    ; IRQ7 Handler
  reti    ; Timer2 Compare Handler
  reti    ; Timer2 Overflow Handler
  reti    ; Timer1 Capture Handler
  reti    ; Timer1 CompareA Handler
  reti    ; Timer1 CompareB Handler
  reti    ; Timer1 Overflow Handler
  reti    ; Timer0 Compare Handler
  reti    ; Timer0 Overflow Handler
  reti    ; SPI Transfer Complete Handler
  reti    ; UART RX Complete Handler
  reti    ; UDR Empty Handler
  reti    ; UART TX Complete Handler
  reti    ; ADC Conversion Complete Handler
  reti    ; EEPROM Ready Handler
  reti    ; Analog Comparator Handler

main:                   ; hier beginnt das Hauptprogramm

         ldi temp, high(RAMEND)  ; Stackpointer nie vergessen!
         out SPH, temp
         ldi temp, low(RAMEND)
         out SPL, temp

         ldi temp, 0x00
         out DDRD, temp

         ldi temp, 0xFF
         out DDRB, temp

         ldi temp, 0b00001010  ;INT0 und INT1 konfigurieren
         out MCUCR, temp

         ldi temp, 0b11000000  ;INT0 und INT1 aktivieren
         out GIMSK, temp

         sei              ;Interrupts allgemein aktivieren

loop:    rjmp loop             ;eine leere Endlosschleife

EXT_INT0:
         sbi PORTB, 0
         reti

EXT_INT1:
         cbi PORTB, 0
         reti
----------------------------------------
Gast #23653
Lesenswert?

Der Fehler ist recht simpel. Bei allen AVR mit mehr als 8K Flash sind 
die Interupt Vektoren 2 Worte breit um auch den kompletten 
Programmspeichen adressieren zu können.Daher:
Falsch !!!
        rjmp main     ; Reset Handler
        rjmp EXT_INT0 ; IRQ0 Handler
        rjmp EXT_INT1 ; IRQ1 Handler
Richtig:
        jmp main      ; Reset Handler
        jmp EXT_INT0  ; IRQ0 Handler
        jmp EXT_INT1  ; IRQ1 Handler
oder auch
        jmp main      ; Reset Handler
        nop
        jmp EXT_INT0  ; IRQ0 Handler
        nop
        jmp EXT_INT1  ; IRQ1 Handler
        nop
Gast #23655
Lesenswert?

ok, ich dachte ich hatte eine lösung gefunden.
dafür habe ich mit IRQ6 und IRQ7 gearbeitet,
da ich nur INT7 bis INT4 im EICR-Register (welches das macht, was das 
MCUCR-Register im programm des tutorials macht)konfigurieren kann. laut 
datenblatt.

ich habe nun

  jmp EXT_INT6   ; IRQ6 Handler
  jmp EXT_INT7   ; IRQ7 Handler

ergänzt, alles ander "reti"

und im hauptprogramm

  ldi temp, 0b10100000
      out EICR, temp

        ldi temp, 0b11000000
        out EIMSK, temp

im EIMSK-Register ist damit INT7 und INT6 aktiviert.
und im EICR-Register (deckungsgleich mit dem GIMSK-Register im 
Tutorial)wird ein interrupt erzeugt bei fallender flanke.

so, laut Studio setzt er die Bits an richtige stelle, wie geplant.
(im interruptflagregister setzt er INT7 und INT6 auf 0 und INT5 und INT4 
auf 1 -> zugegebenermaßen weiss ich nicht, was das bedeutet.)

so, alle LEDs sind an, nix funktioniert.
Gast #23659
Lesenswert?

Hallo Oliver,
ich würde mich ja hinsetzen und deinen Code über den Simulator jagen, um 
rauszufinden woran das liegt (bei sowas lehrn ich am besten ). Geht aber 
nicht, weil der Simulator externe Interupts nicht unterstützt.
Bemühe doch bitte mal die Suchfunktion hier auf dieser Seite, ich glaub 
mit externem INT haben sich schon ne Menge Leute rumgeärgert.
Gruß Bernhard
Gast #23660
Lesenswert?

hmm, mir ist eigentlich egal ob das ganze mit externen oder internen 
interrupt gelöst wird.

ich würd nur wirklich gern überhaupt was interruptmäßiges zum laufen 
bringen, um das ganz mal ordentlich nachvollziehn zu können.

also, ich bin für alle verbesserungsvorschläge am programm offen und 
dankbar.

aber jetzt werd ich mir erstmal ein paar bier reipfeifen, is ja nich 
auszuhalten das ganze zeugs.
morgen gehts dann wieder frisch ans werk. :)

PS: die suchfunktion hab ich natürlich schon bemüht.
Gast #23662
Lesenswert?

geschafft

ok, falls es irgendwann jemanden mit dem gleichen problem geben sollte, 
schreibe ich mein funktionierendes programm nochmal hin.
alle LED sind an, und mit schalter PD0 schaltet man PB0 aus und mit PD1 
wieder an.
also ganz genauso wie im tutorial, nur halt für den ATMega103.

danke für die hilfe

---------------------------------------
.def temp = r16
.include "m103def.inc"

        jmp main       ; Reset Handler
  jmp EXT_INT0   ; IRQ0 Handler
  jmp EXT_INT1   ; IRQ1 Handler
  reti    ; IRQ2 Handler
  nop
  reti    ; IRQ3 Handler
  nop
  reti    ; IRQ4 Handler
  nop
  reti    ; IRQ5 Handler
  nop
  reti    ; IRQ6 Handler
  nop
  reti    ; IRQ7 Handler
  nop
  reti    ; Timer2 Compare Handler
  nop
  reti    ; Timer2 Overflow Handler
  nop
  reti    ; Timer1 Capture Handler
  nop
  reti    ; Timer1 CompareA Handler
  nop
  reti    ; Timer1 CompareB Handler
  nop
  reti    ; Timer1 Overflow Handler
  nop
  reti    ; Timer0 Compare Handler
  nop
  reti    ; Timer0 Overflow Handler
  nop
  reti    ; SPI Transfer Complete Handler
  nop
  reti    ; UART RX Complete Handler
  nop
  reti    ; UDR Empty Handler
  nop
  reti    ; UART TX Complete Handler
  nop
  reti    ; ADC Conversion Complete Handler
  nop
  reti    ; EEPROM Ready Handler
  nop
  reti    ; Analog Comparator Handler
  nop

main:                         ; hier beginnt das Hauptprogramm

        ldi   temp,high(RAMEND); Stackpointer nie vergessen!
        out   SPH,temp
        ldi   temp,low(RAMEND)
        out   SPL,temp

  ldi   temp,0x00
        out   DDRD,temp

        ldi   temp,0xFF
        out   DDRB,temp

        ldi   temp,0b00000011    ;INT1 und INT0 aktivieren
        out   EIMSK,temp

         sei                     ;Interrupts allgemein aktivieren

loop:
  rjmp loop         ;eine leere Endlosschleife

EXT_INT0:
        sbi   PORTB,0
        reti
  nop

EXT_INT1:
        cbi   PORTB,0
        reti
  nop
---------------------------------------

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