Forum: Mikrocontroller und Digitale Elektronik interrupt tutorial


von Oliver (Gast)


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

von BernhardT (Gast)


Lesenswert?

Hallo Oliver
also ich habs nicht so mit asm aber..
.include "8515def.inc"  fur einen Mega103 ??
Gruß Bernhard

von Oliver (Gast)


Lesenswert?

wie bekomm ich denn raus, welche xxxxdef.inc ich für den Mega103 nehme?

von BernhardT (Gast)


Lesenswert?

Such das include Verzeichnis wo die Datei  8515def.inc steht.
Ich weis nicht ob das vieleicht Mega103dev.inc,  ATMega103dev.inc oder 
anders heist (hab' eben kein Zugriff aufs Studio)
Gruß Bernhard

von Oliver (Gast)


Lesenswert?

erstmal danke BernhardT.

es gibt eine m103def.inc
die wirds wohl sein

allerdings gibt es jetzt eine fehlermeldung in folgender zeile.

out GIMSK, temp

->INTERUP2.ASM(46) : error : Undefined variable referenced

von Oliver (Gast)


Lesenswert?

ich denk, ich habs rausbekommen.
im datenblatt steht EIMSK.

ich hoffe mal es funktioniert jetzt.
danke nochmal.

von Frankl (Gast)


Lesenswert?

Lese doch einfach mal das Datasheet vom m103.

von Oliver (Gast)


Lesenswert?

hmm, da scheiter ich wohl an meim englisch.

ich bekomm die konfiguration und aktivierung von INT0 und INT1 einfach 
nicht hin.

von BernhardT (Gast)


Lesenswert?

Oliver, das mit dem engl. ist bitter.
Sicher sind die Interupt Vektoren auch anders als beim 8515. Vielleicht 
hilft dir auch ein Blick in die m103def.inc, ich glaube da sind die 
Interupts der Reihe nach aufgelistet und die Registerbezeichnungen 
müssen auch alle drin stehen.
Gruß Bernhard

von mikki merten (Gast)


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

von mikki merten (Gast)


Lesenswert?

Der letzte Absatz war leider falsch
richtig
oder auch
        rjmp main      ; Reset Handler
        nop
        rjmp EXT_INT0  ; IRQ0 Handler
        nop
        rjmp EXT_INT1  ; IRQ1 Handler
        nop

von Oliver (Gast)


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.

von Oliver (Gast)


Lesenswert?

uups, hatte die letzten beiden beiträge nich gelesen.
das mit dem jmp anstatt rjmp hatt ich dann aus dem datenblatt 
mitbekommen.

trotzdem danke

von Oliver (Gast)


Lesenswert?

dazu wäre noch zu sagen

EICR ist Interrupt Control
ISC7 ist 1 0 gesetzt (interrupt bei fallender flanke)
ISC6 ist 1 0 gesetzt (interrupt bei fallender flanke)

EIMSK ist Interrupt Mask
jeweil bei INT7 und INT6 ist ein Bit gesetzt, der rest 0

von Oliver (Gast)


Lesenswert?

weiss wirklich keiner rat.
ich müsste das mit dem interrupt wirklich dringend lernen.

helft doch nen armen irren. ;)

von Bernhard T (Gast)


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

von Oliver (Gast)


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.

von Oliver (Gast)


Lesenswert?

wo steht eigentlich, daß diese internetvektoren durch PortD beeinflusst 
werden.
zumindest wird das bei dem tutorial so vorausgesetzt.
vielleicht ist das ja anders beim Mega103.

oder ist das immer gleich?
und wenn nicht, unter welchen stichpunkten müsst ich im datenblatt 
suchen?

von Oliver (Gast)


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

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.