Hallo Ronald,
ich würd Dir gerne helfen ,aber so wie Du Dein Code schreibst, bekommt das kein Mensch zu lesen(nicht böse sein...), ich bin mir auch sicher, daß Du selber in einem Monat nicht mehr weißt, was Du geproggt hast....
Hier ein paar Beispiele, wie Du es besser machen könntest:
1. die Bedeutung von .org .def .equ kennenlernen
Code:
.include "m8def.inc"
;UART Konstanten
.equ CLOCK = 10000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK / (BAUD*16)-1
;DataPort
.equ DataPort = PORTB
.equ DataDDR = DDRB
.equ DataPin = PINB
;RamRingPuffer Einstellungen
.equ PUFFER = 0x0060
.equ PUFFER_END = PUFFER + 0x32
;Ringpufferinit
ldi XH,HIGH(PUFFER)
ldi XL,LOW(PUFFER)
ldi YH,HIGH(PUFFER)
ldi YL,LOW(PUFFER)
;Registerdefinieren
.def LCD_read = R1 ;Display Ausleseregister
.def Parameter_Counter = R2
.def Save_rueckspH = R3
.def Save_rueckspL = R4
.def Cursor_Status = R5
.def Zaehler1 = R6
.def tmp = R16 ;Arbeitsregister 1
.def tmp2 = R17 ;Arbeitsregister 2
.def tmp3 = R18 ;Arbeitsregister 3
.def Status = R19 ;Register fuer diverse Flags
.def DDRAM = R20 ;DDRAM Zaehler
So weißt man direkt, welcher Register für was ist, und welche Konstante was zu sagen hat.
2. Die Vektoren und die reset routine:
Code:
.org 0x0000
rjmp reset
.org URXCaddr
rjmp read
reset:
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
sbi EnableDDR,Enable
sbi RSDDR,RS
sbi RWDDR,RW
sbi BacklightDDR,Backlight
sbi KontrastDDR,Kontrast
ldi tmp,0x0F
out DataDDR,tmp
;UARTinit
ldi tmp,HIGH(UBRRVAL)
out UBRRH,tmp
ldi tmp,LOW(UBRRVAL)
out UBRRL,tmp
ldi tmp,(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0)
out UCSRC,tmp
ldi tmp,(1<<RXEN) | (1<<TXEN) | (1<<RXCIE)
out UCSRB,tmp
sei
loop:
rjmp loop
So, hier sieht man ja welche Bits bei welchen Registern gesetzt werden, auch nach Jahren gut zu lesen....
3. ISR:
Code:
read:
push tmp
in tmp,SREG
push tmp
in tmp,UDR
st X+,tmp
ldi tmp2,LOW(PUFFER_END)
ldi tmp,HIGH(PUFFER_END)
cp XL,tmp2
cpc XH,tmp
brlo read1
ldi XH,HIGH(PUFFER)
ldi XL,LOW(PUFFER)
read1:
pop tmp
out SREG,tmp
pop tmp
reti
Da brauchst Du kein cli mehr machen (sagte der Sprinter ja schon)
Diese Beispiele habe ich gerade per copy/paste eingefügt, es ist nicht vollständig, nur als Beispiel anzusehen, aber so werden die Interrupt auf jedem Fall ausgelöst
gute Nacht Sebastian
Lesezeichen