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
----------------------------------------
Hallo Oliver also ich habs nicht so mit asm aber.. .include "8515def.inc" fur einen Mega103 ?? Gruß Bernhard
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
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
ich denk, ich habs rausbekommen. im datenblatt steht EIMSK. ich hoffe mal es funktioniert jetzt. danke nochmal.
hmm, da scheiter ich wohl an meim englisch. ich bekomm die konfiguration und aktivierung von INT0 und INT1 einfach nicht hin.
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
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
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
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.
uups, hatte die letzten beiden beiträge nich gelesen. das mit dem jmp anstatt rjmp hatt ich dann aus dem datenblatt mitbekommen. trotzdem danke
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
weiss wirklich keiner rat. ich müsste das mit dem interrupt wirklich dringend lernen. helft doch nen armen irren. ;)
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
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.