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.