Ukladanie stringu z USART

Ahojte,
na zachytenie znaku co prisiel na Rx pouzivam prerusenie kde znak ulozim do W a nasledne do nejakej premennej (MOVF RCREG,W).
Ako sa postupuje ked chcem zachytit viacero znakov a dalej s nimy pracovat?
Povedzme ze by som chcel riadit chod procesora string prikazmi cez USART.
Pouzitie napr. 20 pracovnych registrov na odchyt 20 znakov mi pride ako divocina a do EEPROM to predpokladam nebude stihat zapisovat (nemam odskusane). Este mi napada moznost vetvit ten program stylom IF prvy znak = ‘nieco’ then goto niekde kde bude dalsi if druhy znak = ‘nieco’ then goto atd… ale to by som po par prikazoch prisiel k zaveru ze som sa zamotal. Nepodarilo sa mi najst na nete (v kratkom case) nejake konkretne ani teoreticke riesenie pre assembler, tak ak ma niekto nejaky tip, tak vopred vdaka.
Moj PIC je 16F690.

Buď potřebuješ buffer na uložení celého přikazu a případných parametrů, který plníš a po přijetí ukončovacího znaku vyhodnotíš celý naráz a nebo to parsuješ po jednotlivých znacích stylem stavový automat. Ani jedno Ti v PIC assembleru nezávidím (jsem si to sám vyzkoušel). Zkus to v C,kód bude přehlednější. Paměti to má na takovou práci dost.

Uz dlhsiu dobu premyslam, ze kde cca je ta hranica kedy to vzdat z assemblerom a prejst na C… Mas nejaky dobry tip kde zacat? S C-ckom mam skusenosti iba pre windows .exe, pre PIC som programy v C nikdy nepisal. Nejaky dobry studijny material? Dik.

Céčko jako céčko. Pokud umíš napsat konsolovou aplikaci pro win, nastuduješ akorát drobné rozdíly které jsou závislé na platformě pro kterou překládáš a typu kompilátoru který použíješ.

Moc divočina v asm to není. Pár řádků. Přijímám data s GPS. mám k přerušení od UART zapnutý TMRx a ten hlídá příjem posledního znaku, že pokud po dobu xy ms nic nepřijde, jsou data kompletní. Při přerušení od RCIF dojde k posunu v RAM o 1. Mám PIC 18F46K22. Kdyby jsi chtěl kod, tak ho sem dám.

Seruste, vdaka za odpovede.
Posunom v RAM o 1 myslis, ze kazdy jeden prijaty Byte sa ti ulozi do jednej pamatovej pozicie? Takto to mam aj ja momentalne vyriesene a funkcne co mi ale zo zaciatku nesedelo je, ze textovy retazec napr.: 5 znakov zabera 5 Bytov v pamati, ale ked sa nad tym lepsie zamyslim, tak to dava zmysel.
Mozes pls. poslat ten kod, aspon tu cast kde prijimas a spracovavas data, zaujima ma ako si vyriesil ten posun v RAM.
Dik.

[code];****************************************************************************
;preruseni od TMR0
;****************************************************************************
IF_TMR0
banksel INTCON
bcf INTCON,TMR0IF
; btg PORTA,2

movlw	b'10000111'  ;
movwf	T0CON
bsf		T0CON,TMR0ON

; clrf TMR0L
; clrf TMR0H
banksel SEGx_FLAG
; bcf TECKA1
; bsf PORTA,2
bsf GPS_OK

lfsr	0,GPS1

banksel	GPS_POCET_H_TEMP
movf	GPS_POCET_H_TEMP,w
banksel	FSR0H
addwf	FSR0H,f

banksel	GPS_POCET_L_TEMP
movf	GPS_POCET_L_TEMP,w
banksel	FSR0L
addwf	FSR0L,f
clrf	WREG
addwfc	FSR0H

movlw	0xFF
movwf	INDF0

banksel	GPS_POCET_L
movff	GPS_POCET_L_TEMP,GPS_POCET_L
movff	GPS_POCET_H_TEMP,GPS_POCET_H

clrf	GPS_POCET_L_TEMP
clrf	GPS_POCET_H_TEMP

movff	GPS_POCET_VET_TEMP,GPS_POCET_VET

clrf	GPS_POCET_VET_TEMP

IF_TMR0_END
#if (TEST)
call SEND_DATA
movlw .7
movwf GPS_POCET_VET
#else

#endif
; call TMRx_GPS_DEKOD
bra INT_END

;****************************************************************************
;preruseni od RS232
;****************************************************************************
IF_RS232

banksel	RCREG
movf	RCREG,w				; precist RCREG
banksel	PIR1				; jinak nejde vymazat priznak
bcf		PIR1,RCIF			; vymazat priznak preruseni
banksel	GPS_TEMP
movwf	GPS_TEMP			; RCREG ulozit do TEMP

banksel	TMR0L
movlw	b'10000000'  ;
movwf	T0CON
movlw	.200
movwf	TMR0H
clrf	TMR0L
bsf		T0CON,TMR0ON

banksel	GPS_TEMP
bcf		GPS_OK				; vynulovat ze NEjsou data komplet

; bsf TECKA1

; movff GPS_FSR0_H,FSR0H
; movff GPS_FSR0_L,FSR0L

; movff GPS_TEMP,POSTINC0

lfsr	0,GPS1

banksel	GPS_POCET_H_TEMP
movf	GPS_POCET_H_TEMP,w
banksel	FSR0H
addwf	FSR0H,f

banksel	GPS_POCET_L_TEMP
movf	GPS_POCET_L_TEMP,w
banksel	FSR0L
addwf	FSR0L,f
clrf	WREG
addwfc	FSR0H

banksel	GPS_TEMP
movf	GPS_TEMP,w
movwf	INDF0



banksel	GPS_POCET_L_TEMP
incf	GPS_POCET_L_TEMP
CLRF	WREG	
addwfc	GPS_POCET_H_TEMP


banksel	GPS_TEMP
movf	GPS_TEMP,w
xorlw	'$'
btfss	STATUS,Z
bra		IF_RS232_END

incf	GPS_POCET_VET_TEMP

IF_RS232_END

; bsf PORTA,2
; bcf PORTA,2

bra		INT_END	[/code]

Snad se v tom vyznáš. Pokud 1.7ms nic nepřijde na UART, vykoná se preruseni od TMR0 a bere se to že data s GPS jsou komplet. Pak se řeší co se vlastně uložilo.

Kruhový buffer v ASM je v příkladech Chipona2, stačí si to jen najít a použít, je to pěkně napsáno (i když drobné chybky by se našly, ale kdo nikdy nechyboval ať hodí kamenem).

pic16fxx.sweb.cz/programovani/chipon2/index.html

Kruhový buffer v C je popsán na Algoritmy.net

algoritmy.net/article/32/Kruhovy-buffer

Ty stránky co poslal Mahoney jsou dobrý, ale použití maker není moc dobrá věc. Přestal jsem to požívat, protože makro se opakuje jako celý kus kodu. Pokud je makro moc dlouhé a opakuje se často, pěkně to sežere pamět v PIC.

To je pravda, první co jsem udělal bylo, že jsem ty makra zrušil. Jinak ten druhej odkaz co jsem dal je Java, nikoliv C, za což se omlouvám (editovat to nebudu). Kruhový buffer v C např. zde:
embedjournal.com/implementing-ci … mbedded-c/