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
So weißt man direkt, welcher Register für was ist, und welche Konstante was zu sagen hat.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
2. Die Vektoren und die reset routine:
So, hier sieht man ja welche Bits bei welchen Registern gesetzt werden, auch nach Jahren gut zu lesen....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
3. ISR:
Da brauchst Du kein cli mehr machen (sagte der Sprinter ja schon)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
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







Zitieren
Lesezeichen