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