[ vukboban @ 26.07.2012. 23:14 ] @
Pozdrav svima.
Radim neki projekat sa PIC om,u kojem je potrebno da PIC komunicira sa telefonom.
Takodje je potrebno da se prijem podataka obavlja u interaptu .
Osnovni problem mi je kako da detektujem da je telefon ZAVRSIO predaju podataka,da bih izasao iz interapta i nastavio sa glavnim programom.
Ako neko zna,i raspolozen je da mi pomogne bio bih mu zahvalan.
[ bogdan.kecman @ 26.07.2012. 23:20 ] @
Citat:
vukboban:
Takodje je potrebno da se prijem podataka obavlja u interaptu .
Osnovni problem mi je kako da detektujem da je telefon ZAVRSIO predaju podataka,da bih izasao iz interapta i nastavio sa glavnim programom.


ne radi to tako. Ti mozes da upalis (na picu koji ima hardwerski uart ako sa telefonom pricas preko uarta) da ti pic trigeruje interapt
- kada ti stigne bajt na uart
- kada ti se popunu rcv bafer na uart-u
- kada ti se isprazni send bafer na uart-u

i onda ti u tom interaptu pokupis taj bajt ili nisku bajtova ili posaljes dalje bajt koji si spremio da saljes.

u ovom tvom pitanju si napisao
- da ne znas kako radi interapt
- da nisi procitao datasheet od pica da vidis kako radi uart

procitaj prvo jedno pa drugo pa se onda vrati sa boljim pitanjem, ne izlazis ti iz interapta kada "zavrsis pricu sa telefonom" vec kada posaljes ili primis par bajtova, zavrsavas sa telefonom tako sto znas sta ce telefon da ti posalje pa znas tacno koliko bajtova cekas, za to ti je potrebno da znas kojim protokolom telefon prica pa onda treba da implementiras taj protokol u svoj firmware
[ goran_68 @ 26.07.2012. 23:27 ] @
Koji telefon koristis i sta citas? Kakve podatke?


[ vukboban @ 26.07.2012. 23:31 ] @
Interapt trigeruje telefon kad na PICU ukljucim receive interapt,to je OK.
Ono sto saljem telefonu za to mi ne treba interapt,i to je OK
Problem je sto ja ne znam sta ce telefon da mi posalje,pa samim tim ne znam ni koliko je to dugacko,a ne znam ni kako se zavrsava to sto mi on salje.
Evo da pojasnim:
Telefon moze ili da zvoni,u tom slucaju salje <cr><lf>RING<cr><lf>,pa onda broj pozivaoca,pa poruku zavrsava sa <cr><lf>.
Moze i da dobije poruku,koja pocinje sa <cr><lf>CMI ili tako nesto,pa je ta poruka duzine do 150,160 znakova,i zavrsava sa <cr><lf>.
Kako da mogu da primim i jedno i drugo?
Telefon je neki simens,citam iz njega poruke ili broj pozivaoca
[ bogdan.kecman @ 26.07.2012. 23:40 ] @
Citat:
vukboban:
Telefon moze ili da zvoni,u tom slucaju salje <cr><lf>RING<cr><lf>,pa onda broj pozivaoca,pa poruku zavrsava sa <cr><lf>.
Moze i da dobije poruku,koja pocinje sa <cr><lf>CMI ili tako nesto,pa je ta poruka duzine do 150,160 znakova,i zavrsava sa <cr><lf>.
Kako da mogu da primim i jedno i drugo?
Telefon je neki simens,citam iz njega poruke ili broj pozivaoca


napravis state masinu ... tu triger sluzi samo da radi dovatanje bajta koji salje telefon. Poruka ti uvek pocinje sa CRLF i zavrsava se sa CRLF ... kada si u stanju "ne radim nista", kada dobijes CRLF cekas na sledecu nisku da bi presao u sledece stanje, ako je to CMI onda predjes u stanje "citam poruku" i sve bajtove slazes u nisku gde cuvas poruku dok ne dobijes CRLF, to te vraca u stanje "ne radim nista" a u niski gde si cuvao bajtove imas poruku - radi sa njom sta oces ... AKO posle CRLF dobijes RING onda ides u stanje ... i tako dalje tako dalje .. nacrtaj murov graf svih stanja i svih prelaza i onda isprogramiraj taj state machine .. nije komplikovano ...
[ bogdan.kecman @ 26.07.2012. 23:42 ] @
pogledaj http://www.microchip.com/forums/m520736.aspx
[ vukboban @ 26.07.2012. 23:46 ] @
Ma ja sam ustvari imao ideju da mi prijemni bafer bude najvece moguce duzine(nekih 200 bajtova),pa da on u interaptu sve to lepo popuni(jal sa podacima ako ih ima,jal sa nulama ako nema podataka),pa onda natenane u mainu sve to izanaliziram.
Ne znam koliko je to pametno...

Sve ovo pitam jer mi je cilj da se sto manje zadrzavam u interaptu,jer imam jos i I2C komunikaciju sa RTC,a i jos neku data\clock komunikaciju sa nekim cipom,pa ne bih da ih cesto i dugo prekidam
[ bogdan.kecman @ 26.07.2012. 23:52 ] @
Citat:
vukboban:
Ma ja sam ustvari imao ideju da mi prijemni bafer bude najvece moguce duzine(nekih 200 bajtova),pa da on u interaptu sve to lepo popuni(jal sa podacima ako ih ima,jal sa nulama ako nema podataka),pa onda natenane u mainu sve to izanaliziram.
Ne znam koliko je to pametno...


nije pametno
[ vukboban @ 26.07.2012. 23:58 ] @
Nisi me razumeo,ne da stalno visim u interaptu,nego ako nesto primim (receive flag)udjem u interapt,pokupim 200 bajtova necega,izadjem,i onda to analiziram kad mogu
[ bogdan.kecman @ 27.07.2012. 00:53 ] @
jesam te razumeo, nije pametno
[ goran_68 @ 27.07.2012. 06:17 ] @
Prekidna rutina ti nece biti puno veca ukoliko primenis ovo o cemu je Bogdan pisao. Dakle, nece ti drasticno uvecati vreme koje provodi kontroler dok obradjuje prekid sa serijskog porta. Istovremeno, ukoliko to aplikacija dozvoljava, ti mozes prekinuti neku drugu komunikaciju ili iskljuciti ostale prekide ukoliko ti je ova serijska komunikacija najveceg prioriteta. Neki PIC-ovi imaju dva nivoa prioriteta prekida pa mozes i to da koristis ukoliko je tvoj takav.
[ vukboban @ 27.07.2012. 12:09 ] @
PIC je 18F4550,ima on prioritete,ali mi to nije potrebno,jer je jedini prekid ovaj UART prekid.
Probao sam sinoc ovaj moj pristup(cekam RCIF,udjem u interapt,pokupim 200 bajtova,izadjem,i vise ne ulazim do sledeceg RCIF),a kasnije kad mi vreme dozvoli obradjujem to primljeno,i za sad to raki OK,ali svakako cu probati i ovaj Bogdanov pristup.
Hvala svima
[ bogdan.kecman @ 27.07.2012. 12:16 ] @
Citat:
vukboban:
ovaj Bogdanov pristup.


nije to "bogdanov pristup", to se tako radi
[ vukboban @ 27.07.2012. 12:20 ] @
Ma ok,verujem da se to tako radi,ali meni je logicnije da ako vec podatak moze da bude i 10,ali i 200 bajtova(za koji u startu ne znam koliki je) odmah pokupim 200,nego da udjem u rutinu,pokupim 3 bajta,izadjem,vidim sta je,pa opet udjem u rutinu,i pokupim ili ostalih 7,ili u drugom slucaju ostalih 197.
[ bogdan.kecman @ 27.07.2012. 12:29 ] @
da ali ti ne znas koliko bajtova ces da dobijes, skocices u interapt kad? kada dodje priv bajt? i tamo ces da cekas sta? 200 bajtova, sto je mozda jedna, mozda dve a mozda tri i pola poruka .. pritom izmedju treceg i cetvrtog bajta mozes da imas 6 sekundi pauzu za koje vreme ces ti da sedis u interaptu i da cekas jos 197 bajtova
[ vukboban @ 27.07.2012. 12:35 ] @
Ne,proucio sam ja odlicno protokol kojim prica telefon:
kad posalje start bit,ja skocim u interapt.on salje ili 10 ili 200 bajtova,i to brzinom od 19200,nema nikakvih pauza tu tipa 6 sekundi.
Znaci on posalje start,ja udjem u interapt,tom brzinom(19200) pokupim 200 bajtova(da li pravih podataka,da li praznih nula) i izadjem,jer znam da telefon nece nista vise da salje(taj njegov protokol je da tako kazem "jednosmeran",on ne zahteva ni acknowledge,niti ista slicno,nego posalje sta ima i onda cuti).
I on ne salje nista narednih recimo 2 dana!
Doduse pokusavao sam i sa timeoutom u interaptu,ako recimo 1ms ne primim nista(prazan receive buffer) da izadjem iz interapta,u slucaju da primim,ponovo brojim tih 1 ms
[ goran_68 @ 27.07.2012. 20:49 ] @
Pa nije mcu u prekidnoj rutini sve vreme. Kad se napuni RCREG postavlja sa RCIF. Ulazis u prekidnu rutinu i citas RCREG. Time se i RCIF brise. Dok se ponovo ne napuni RCREG ti si van i radis nesto drugo.
korak je negde na ovom forumu jako lepo objasnio kako se radi obrada prijema sa serijskog porta.

[Ovu poruku je menjao goran_68 dana 27.07.2012. u 22:42 GMT+1]