
Det skabbar lite när man ska ta emot, speciellt när många bytes skickas på rad. Sägs ska funka bättre med två stopbitar.
Kod: Markera allt
.equ SPEED = 4 ; CPU Speed
.equ BAUD = 19200 ; Baudrate
; Initialize UART
ldi temp, ((SPEED * 1000000) / (16 * BAUD)) - 1
out UBRR, TEMP
ldi TEMP, (1<<RXCIE)+(1<<RXEN)+(1<<TXEN)
out UCR,TEMP
Kod: Markera allt
;---------------------------------------
; UART Recieve
UART_RXC:
; Push registers and sreg
push TEMP
in TEMP, SREG
push TEMP
; Recieve
in TEMP, UDR ; Get the serial input data
tst BUFPOS ; Test for 0
brne bufadd ; If not, fill into it
; Start fill buffer
mov BUFPOS, TEMP ; Recieve TEMP bytes..
ldi ZL, low(buffer) ; .. Save at this position
ldi ZH, high(buffer) ;
rjmp RXC_RETURN ; Return
bufadd:
st Z+, TEMP ; Save to buffer
dec BUFPOS ; Decrease buffer pointer
tst BUFPOS ; If buffer = 0
breq nisseapa ; If recieved everything, parse
rjmp RXC_RETURN
nisseapa:
ser PAR ; Parsa skiten om den här är satt. förut anropade jag rutinen direkt här, men jag kortade ner den och gjorde anropet utanför interrupten
; Pop registers and sreg
RXC_RETURN:
pop TEMP
out SREG, TEMP
pop TEMP
reti
Skilj på 'hårdvarunivån' (uarten, RS232 protokollet samt stoppbitens vara eller icke vara) och din egen protokollnivå (meddelandelängdbyten och själva meddelandet)Interruptrutinen är en enkel som först tar emot en byte (som anger storleken på paketet), sen fyller den en buffer med resterande bytes.
Om du kan skicka allt utom just bara 0xFF helt korrekt borde det inte vara fel på överföringen - annars skulle rimligtvis alla tecken / bytes bli fel.Skickar jag i block verkar det funka OK så länge jag inte skickar enbart 0xFF i blocket.
Låter mer som fel inställda kommunikationsparametrar.Skickar jag kontinuerligt så skabbar det lite. Och i värsta fall hänger UART:en sig medans resterande kod funkar lite halvt.
Kod: Markera allt
IDLE STAR D0 D1 D2 D3 D4 D5 D6 D7 STOP STAR D0
----+ +----+----+----+----+ +----+
| | | | |
+----+ +----+----+----+----+ +----+----
Se där.Och slutligen 1, 1.5 eller 2 stoppbitar.
Beror på vad det är för hårdvara / mjukvara som genererar och tar emot signalerna.Du tror inte att hårdvaran skulla ta hand om en sådan viktigt fuktion om den vad nödvändig?