achso, das sei habe ich noch dazu gefügt (allerdings noch nicht im obigen quelltext), ronald
Druckbare Version
achso, das sei habe ich noch dazu gefügt (allerdings noch nicht im obigen quelltext), ronald
Kennt dein Assembler diese Notation von Binärkonstanten? Die kenn ich nur von einigen Versionen von GCC.
habe es auch mit 0x86 (b10000110) probiert, aber bin-konst. geht zumind. beim laden zu arbeitsreg
danke
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 O:)
gute Nacht Sebastian
hallo,
also mit sbi setzt man wirklich nur ein bit und nicht den ganzen port bzw register.
vielen dank trotzdem für die infos, aber bei einem so kleinen programm, war ich zu faul, erst die register usw. umzubennen.
ich wollte nur das grundlegende testen, dass der uart int beim empfang von daten auslöst. aber bei größeren progs mache ich das natürllich auch.
danke, ronald
Hat hier jemand was anderes behauptet, oder wie ist diese Aussage gemeint?Zitat:
also mit sbi setzt man wirklich nur ein bit und nicht den ganzen port bzw register.
Dann wundere Dich nicht, wenn hier ein paar Leute zu faul sind Dein Programm zu lesen...Zitat:
aber bei einem so kleinen programm, war ich zu faul, erst die register usw. umzubennen.
Gruß Sebastian