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
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/