Hi Eric!
Ich finde es ersteinmal sehr schön, dass Du die ASM-Sprache auserwählt hast! *g*
Da Du Dich ja nicht quelen (bzw. quälen) sollst, werde ich Dir helfen! :o)
Als erstes ein kleiner Tipp!
Ich bezeichne die Register immer mit Namen, damit ich sie besser auseinander halten kann, was ganz besonders wichtig bei großen Programmen ist!
Das erste Register nennt man meistens temp, temporäres Register, da es meistens das Hauptarbeitsregister ist.
Du kannst z.B. das Register r16 in temp umbenennen, indem Du folgende Zeile unter die Includes einfügst:Der Befehl wird allerdings nur zur Leserlichkeit genutzt, er wird deshalb nicht im Speicher des AVRs abgelegt!
Nutzt Du eigentlich das AVR-Studio von ATMEL?
Wenn ja, dann brauchst Du nur
Code:
.include "2313def.inc"
einfügen, es liegt in dem Programm bereits vor!
Die Zeile mit dem .org ist nicht ganz richtig, da hat sich ein kleiner Fehler eingeschummelt!
Es muss wie folgt heißen:Den ersten Interrupt bezeichnet man meistens als "reset", das ist aber kein Fehler!
Der IRQ0-Handler ist richtig, würde ich allerdings anders benennen, da es ein weig zu lang ist (für meinen Geschmack), kannst Du aber auch so lassen!
Nun kommst das fehlerhafte Label! ;o)
Für gewöhnlich initalisiert man als erstes den Stack, der beim 2313 ist allerdings so klein, dass man nicht in LOW- und HIGH-Byte unterteilen muss:
Code:
ldi temp , RAMEND
out SP , temp
Dann musst Du erst die Ports des AVR einrichten (Eingang oder Ausgang?) und dann die Interrupts aktivieren:
Code:
ldi temp, 0b00001010
out MCUCR, temp
ldi temp, 0b11000000
out GIMSK, temp
sei
Nur alle Interrupts global zu aktivieren reicht nicht aus, Du musst auch noch vorher die externen Interrupts einstellen!
Nun hast Du bei dem nächsten Block noch den Fehler gemacht, dass Du die Konstante 4 versucht hast dierekt in PORTD zu laden, dass musst Du allerdings über einen Umweg machen:
Code:
ldi temp , 4
out PORTD , temp
Den selben Fehler hast Du dann auch noch in der Interruptroutine gemacht:
Code:
ldi temp, 5
out PORTD , temp
reti
Lesezeichen