mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt löst nicht aus


Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mein Interrupt will einfach nicht auslösen.
Arbeite mit dem Mega16 und Assembler.
Hab ich da noch irgendwas vergessen?

  ldi temp, 0b1000000
  out GICR, temp ; aktivate int1 in Generel Interrupt Control
  ldi temp, 0b00001000
  out MCUCR, temp ; INT1 bei fallender Flanke
        sei

marco

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie sehen denn deine Initialisierungen am Anfang deines Programmes aus?

Gruß
Chris

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stack?

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi marco, was mir da aufgefallen ist:

  ldi temp, 0b1000000
  out GICR, temp ; aktivate int1 in Generel Interrupt Control

Dein ldi hat nur 7 bits,
  ldi temp, 0b1000000
entspricht also
  ldi temp, 0b01000000
ist das so gewollt? eventuell hast du damit nämlich nicht den INT1
aktiviert sondern INT0....

Gruss, Malte

Autor: Alexander Niessen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke chris meint unter anderem auch die initialisierung der
sprungtabele für den (die) interrupt(s).
dem controller muss ja schliesslich gesagt werden wo er hinspringen
soll. (siehe avr-tutorial auf der page hier)

gruesse,
alex

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jepp. aber da er diese tabelle noch nicht nachgepostet hat hab ich noch
auf ne andere möglichkeit hingewiesen *g

gruss, malte

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Interrupt-Vektoren müssten so passen, oder?

rjmp Reset  ;Reset
reti    ;INT0
rjmp Menu  ;INT1
reti     ;Timer2 Compare
reti     ;Timer2 Overflow
reti     ;Timer1 Capture
reti     ;Timer1 Compare A
reti     ;Timer1 Compare B
reti     ;Timer1 Overflow
reti     ;Timer0 Overflow
reti     ;SPI Transfer Complete
reti     ;USART RX Complete
reti     ;USART Data Register Empty
reti     ;USART TX Complete
reti     ;ADC Conversation Complete
reti     ;EEPROM Ready
reti     ;Analog Comparator
reti     ;Two-wire serial interface
reti     ;INT2
reti     ;Timer0 Compare
reti     ;Store Program Memory ready

@carzy horse: der stack ist da.

@Malte: die 7 Bits hab ich auf 8 geändert, aber bringt nichts.
        ldi temp, 1<<int1    geht auch nicht

muss ich den interrupt denn noch in irgend einem anderen Register noch
freischalten?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie sieht deine Interruptroutine aus? Wenn dein Programm nicht allzu
lang ist, dan kannst du es in den Text komplett einfügen, wen nicht
schick es im Anhang.
Gruß
Chris

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interruptroutine funktioniert wenn ich sie testweise mittels rcall
als normale routine im Hauptprogramm aufrufe.
Das komplette Programm ist etwas länger (ca. 900 LOC).

Sonst noch irgend welche Ideen?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du dein Programm schon mal mit AVRStudio durchgetestet?

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht die Hardware aus? Werden saubere Pegel erzeugt? Den richtigen
Pin am Controller erwischt?

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin gerade dabei mit AVRStudio zu debuggen.
kommt irgendwie ganz komisches Zeug raus: sobald ich die Interrupts
einschalte (sei) springt er immer zum Timer2-Overflow, obwohl ich da
überhaupt nichts eingestellt hab??? Fehler im Studio?

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, habs jetzt.
die eigentliche Einsprungadresse für den INT1 (0x04)ist da, wo bei mir
Timer2-Overflow steht (s.o.).
Zwischen jeder Zeile müsste also eine Leerzeile eingefügt werden. Aber
wie schreib ich das ins Programm? nop? oder wie macht man das?

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Du kannst doch die Interruptadresse direkt ansprechen.
Wenn der entsprechende Interrupt eintrifft, dann schaut der Controller
genau in dieser Adresse nach, was dort steht

Zum Beispiel:

.CSEG
.ORG    $0000
    rjmp  Init   ;Beginn des eigentlichen Programms

.ORG    $0007
    rjmp  T0_OVF  ;Interruptroutine

.ORG    $0009
    rjmp  MIDI  ;eine weitere Interruptroutine

Die richtigen Adressen bekommst Du aus dem Datenblatt.
Genauso kannst Du auch mit .ESEG einzelne Segmente im Eeprom
beschreiben.

Gruß Jens-Erwin

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo noch mal,

ich habe gerade in der ...def.inc nachgesehen. Es müßte sogar gehen (es
geht auch so), daß Du am Anfang lediglich den entsprechenden Interrupt
mit dem Zusatz addr aufschreibst. Über die *.inc Datei weiß dann der
Assembler, wo die Interrupteinstiegsadresse ist. Zum Beispiel:


.include "2313def.inc"

.CSEG
.ORG    0x0000    ;Reset
    rjmp  Init         ;Beginn des Programms

.ORG            INT0addr
                rjmp     Oma     ;Interruptroutine bei Int0
                                 ;automatisch an der richtigen Adresse

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab die Zwischenräume mit reti´s aufgefüllt. Sieht jetzt so aus:

rjmp Reset    ;Reset
reti
reti      ;INT0
reti
rjmp Menu    ;INT1
reti
reti       ;Timer2 Compare
reti
reti      ;Timer2 Overflow
reti
reti       ;Timer1 Capture
reti
reti       ;Timer1 Compare A
reti
reti       ;Timer1 Compare B
reti
reti       ;Timer1 Overflow
reti
reti       ;Timer0 Overflow
reti
reti       ;SPI Transfer Complete
reti
reti       ;USART RX Complete
reti
reti       ;USART Data Register Empty
reti
reti       ;USART TX Complete
reti
reti       ;ADC Conversation Complete
reti
reti       ;EEPROM Ready
reti
reti       ;Analog Comparator
reti
reti       ;Two-wire serial interface
reti
reti       ;INT2
reti
reti       ;Timer0 Compare
reti
reti       ;Store Program Memory ready
reti

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da war doch was - die großen Megas haben eine andere Aufteilung der
Vektoren, damit anstelle des rjmp der längere jmp - Befehl reinpaßt.
Auf die einfachsten Dinge kommt man immer zu spät...

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie wäre es nun mit


.CSEG
.ORG     0x0000       ;Reset
         rjmp  Reset

.ORG     INT1addr
         rjmp     Menü


;Und hier das eigentliche Programm (Reset:)
;und dann eben Menü
Sieht doch etwas eleganter aus - oder?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder einfacher:

jmp reset
jmp int0
usw. :-)

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens-Erwin: ist in der Tat etwas eleganter. ich werd´s gleich ändern.

@crazy horse: wenn ich jeden interrupt nutzen würde, würde das gehen.
aber was ist, wenn zwischendurch reti´s rein müssen?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da müssen keine retis rein. Lass immer die komplette Sprungtabelle immer
drin, am besten per include, alle nichtbenutzten können dann auf
dasselbe reti führen.


ex0_int:
ex1_int:
t1_ov:    reti

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.