www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik interrupt tutorial


Autor: Oliver (Gast)
Datum:

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

Autor: BernhardT (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: BernhardT (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denk, ich habs rausbekommen.
im datenblatt steht EIMSK.

ich hoffe mal es funktioniert jetzt.
danke nochmal.

Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lese doch einfach mal das Datasheet vom m103.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, da scheiter ich wohl an meim englisch.

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

Autor: BernhardT (Gast)
Datum:

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

Autor: mikki merten (Gast)
Datum:

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

Autor: mikki merten (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weiss wirklich keiner rat.
ich müsste das mit dem interrupt wirklich dringend lernen.

helft doch nen armen irren. ;)

Autor: Bernhard T (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

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.