Bist Du sicher, daß das Telegramm bei kurzer/schnell wiederholter Tastenbetätigung überhaupt korrekt gesendet wird?
Übrigens ist es etwas umständlich, den Code auf'm Mobile zu lesen (zu bekommen) - warum stellst Du den nicht als ASM-Block rein?
CodeBox Assembler
.include "m8def.inc"
.org 0x000
rjmp MAIN ; Reset Handler
.org INT0addr
rjmp int0_handler
.org INT1addr
rjmp int1_handler
.org URXCaddr
rjmp UART
MAIN:
.def midi_byte = r16
.def temp0 = r17
.def bite1 = r20 //wird gebraucht um kruzfristig den inhalt der einkommenden messages zu speichern und temp0 frei zu haben
.def temp1 = r25
.equ F_CPU = 16000000
.equ BAUD = 31250
// Berechnungen so gesehen auf http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
.error "Systematischer Fehler der Baudrate gr�sser 1 Prozent und damit zu hoch!"
.endif
//**********Stackpointer initialisieren**********
ldi temp0, HIGH(RAMEND)
out SPH, temp0
ldi temp0, LOW(RAMEND)
out SPL, temp0
//**********uart konfigurieren**********
ldi temp0, HIGH(UBRR_VAL)
out UBRRH, temp0
ldi temp0, LOW(UBRR_VAL)
out UBRRL, temp0
ldi temp0, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0) //Frame format auf 8 bit setzten.
out UCSRC, temp0
sbi UCSRB, RXCIE
sbi UCSRB, RXEN
//**********INTX initialisieren**********
ldi temp0, (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11) //INT1 und INT0 auf steigende flanke konfigurieren
out MCUCR, temp0
ldi temp0, (1<<INT0) | (1<<INT1) //INT0 aktivieren
out GICR, temp0
//**********Ports konfigurieren**********
ldi temp0, 0xFF //PORTB = ausgang, da hier die pins getoggelt werden
out DDRB, temp0 //genau genommen w�re es korrekt DDRB mit 0b00111111 zu laden, da die beiden oberen bits ja vom oszillator beansprucht werden...
ldi temp0, 0b10111111 //PORTD = ausgang, au�er pin6
out DDRD, temp0 //offenbar MUSS f�r die aktivierung von int0 und int1 die beiden pins (PD2 & PD3) als AUSGANG konfiguriert werden
//PD1 ist die "error"-led. 000000X0
//**********Register initialisieren**********
ldi temp0, 0b11111110 //Eine LED leuchtet, wenn startbereit
out PORTB, temp0
ldi temp0, 0b00000000 //evtl. nicht n�tig
ldi temp0, 0b00000000 //evtl. nicht n�tig
mov midi_byte, temp0
//**********Ram initialisieren**********
ldi zl, 0x6C //ich initialisiere das hier auf 0x6C initialisiere, da das hier nur ein Testprogramm zur analyse der
ldi zh, 0x00 //ankommenden bytes ist. im eigentlichen programm brauche ich die ersten 12 bytes im speicher f�r
//f�r andere dinge. deshalb... aber eigentlich willk�rlich.
ldi xl, 0x6C
ldi xh, 0x00
ldi yl, 0x60
ldi yh, 0x00
//**********main loop**********
sei
loop0:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
rjmp loop0
error: //schaltet die "error"-led an
in temp0, PIND
cbr temp0, 0b00001000 //vielleicht ist es schlau das hier zu machen, da vielleicht wegen dem taster noch das eine bit gesetzt ist. auf der anderen seite: ich gebe es ja nur auf den selben port aus. sollte keinen unterschied machen...
sbr temp0, 0b00000010
out PORTD, temp0
ret
midi_byte_ausgeben:
mov temp0, midi_byte //die obersten zwei bits muss ich an PORTD ausgeben, da an PB6 und PB7 zeug vom oszillator h�ngt
lsr temp0
lsr temp0
andi temp0, 0b00110000
out PORTD, temp0
ldi temp1, 0b00111111 //aber die unteren 6 bit gehen an PORTB.
mov temp0, midi_byte
eor temp0, temp1 //da die LEDs aber auf dem STK500 invertiert sind, muss ich das hier auch negieren
out PORTB, temp0
ret
UART:
in bite1, UDR //empfangenes Byte auslesen
st z+, bite1 //empfangenes byte auf den speicher schreiben
reti
int0_handler: //hier wird der z-pointer zur�ck gesetzt und die "error"-led ausgeschaltet
ldi temp0, 0
out PORTD, temp0 //Alle LEDs aus!
mov zh, temp0 //zur�ck setzten
ldi temp0, 0x6C
mov zl, temp0
rcall speicher_frei_raeumen
ldi temp0, 0b11111110
out PORTB, temp0
reti
int1_handler:
ld midi_byte, x+
rcall midi_byte_ausgeben
cp xl, zl
brlo x_ist_noch_niedriger_als_z //branche if same or higher -> wenn der x-pointer den z-pointer �berholt,
rcall error //dann schalte "error"-led an
speicher_frei_raeumen: //und initialisiere den x-pointer wieder mit dem anfangswert
//man kann dann erneut durch steppen..
ldi xh, 0
ldi xl, 0x6C //eigentlich ist es kooler, wenn ich z garnicht nulle, dann k�nnen neue bytes drauf geschrieben werden und man kann von neuem durch-skippen
x_ist_noch_niedriger_als_z: //wenn x niedriger als z, dann raus
nop //nopt ist hier nur verzierung
reti
Deine Taster sind im Plan unkonventionell verdrahtet, der UART gar nicht angeschlossen. Wwarum machst Du Dir das mit der Error-LED so schwer? Das PORT-Register ist direct bit accessible -> SBI/CBI