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
wie sehen denn deine Initialisierungen am Anfang deines Programmes aus? Gruß Chris
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
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
jepp. aber da er diese tabelle noch nicht nachgepostet hat hab ich noch auf ne andere möglichkeit hingewiesen *g gruss, malte
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?
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
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?
Wie sieht die Hardware aus? Werden saubere Pegel erzeugt? Den richtigen Pin am Controller erwischt?
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?
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?
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
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
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
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...
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?
@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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.