[ johnny_hush @ 03.01.2008. 22:55 ] @
Na koji nacin bi mogao da, kada posaljem serijskim putem (UART - RS232 standard) neku npr. 8 bitnu informaciju PIC nju primi, proveri da li se podudara sa isto takvom 8 bitnom inforacijom vec zadatom (npr. cuva se u eeprom-u) i naravno u zavisnosti od rezultata ode na odredjenu labelu?

Koristi se PIC16F84A koji nema hardverski UART, znaci potrebo je softversko resenje.

Ono sto bi meni pomoglo je primer koda u assembleru kako bih shvatio na koji nacin to da u radim [radim samo sa asm.]

U svakom slucaju svaka pomoc je dobrodosla.
[ obranko @ 04.01.2008. 00:28 ] @
pozdrav,

predpostavimo da si resio hardverski deo. prikaci izlaz iz rs232 kola na int pin mikrokontrolera. kada se desi prekid, u rutini za prekid podesis timer za generise prekid posle pola bit vremena (ako je brzina 2400bps pola bit vremena je 1/(2400*2)sec). kada se desi taj prekid proveris da li je int pin i dalje nizak (da ne reagujes na smetnje), ako jeste, podesis timer da generis prekid posle celog bit vremena. kada se taj prekid dogodi, ucitas vrednost int pina (to ti je prvi bit). sve ponovis za preostale bite podatka i za stop bit. sada sve bite podataka koje si ucitao skupis u jedan bajt i to je podatak koji ti je poslan.
[ sander @ 04.01.2008. 00:36 ] @
Ili jednostavno koristis gotove biblioteke za rad sa softverskom rs232 komunikacijom u raznoranim c, pascal ili basic kompajlerima.
[ johnny_hush @ 04.01.2008. 01:38 ] @
Pa bih ali ne radim ni sa jednim jezikom za mikrokontrolere, osim sa assemblerom...

@obranko Hvala!
[ sander @ 04.01.2008. 10:50 ] @
Ne zameri, lepo je to sto imas volje da to radis pesice ali to je cisto gubljenje vremena i zivaca. Moja preporuka je da sto pre predjes na C, asembler vec poznajes i ta kombinacija je dobitna. Recimo koliko jednostavno to sto ti hoces izgleda u C-u:

switch (getc()) {

case 0: --deo programa koji se izvrsava ako je podatak dobijen preko rs232 0 --
break;

case 1: ---
break;

- - - - - - -

case 255: ----
break;
}
[ johnny_hush @ 04.01.2008. 14:09 ] @
Hvala, samo me zanima gde bih mogao da nadjem tutoriale o programiranju PIC-ova u C-u?
[ sander @ 04.01.2008. 14:36 ] @
Ako trazis literaturu o programiranju u C-u za PIC kontrolere jedino izdanje Infoelektronike (CCS C compiler)
Ako moze i na engleskom, Mikroelektronika (njihov C kompajler sa propratnom dokumentacijom), user manuel-i od prozvodjaca kompajlera a ima da se nadje i na netu nesto knjiga u PDF formatu pisane za pojedine kompajlere ali i o c programskom jeziku uopste. Videcu da upload-ujem nesto od toga.
[ johnny_hush @ 04.01.2008. 14:53 ] @
Ok, bio bih ti veoma zahvalan
[ korak @ 04.01.2008. 16:56 ] @
sander,

pre toga sigurno se inicijalizuje serijski kontroler (bodova brzina i ostali parametri komunikacije). Sta vraca getc() ako nije nista primljeno sa linije (vidim da si stavio sve slucajeve u switch od 0 do 255). Koliki je bafer za prijem podataka, kako se on postavlja. Prijem mora biti na interrupt, a interrupt procedura treba da puni bafer, a getc() da ga prazni (bafer tipa prvi udje-prvi izadje, ili kruzni bafer?). Sta ako se prepuni bafer, kako se to saopstava?

Ja sve to radim u asembleru, imam poseban modul za sve sto sam opisao, ali me interesuje kako je taj mehanizam podrzan u C-u. Interesantno mi je sa aspekta kompajlera visih programskih jezika. Napisi mi i kako si zadovoljan sa postojecim mehanizmom za rad sa komunikacijom u C-u.

Unapred hvala.
[ johnny_hush @ 04.01.2008. 17:02 ] @
@korak da li bi mozda mogao da postujes tu rutinu u assembler-u koju ti koristis?
[ korak @ 04.01.2008. 17:31 ] @
Mogu ali nije, nazalost, za PIC.
Doduse, uz potrebna objasnjenja nije problem da se napise i za PIC, jer nije komplikovana. Mogu paralelno naredbama MC908 da se pisu naredbe za PIC.

Ako si zainteresovan, obavesti me.
[ johnny_hush @ 04.01.2008. 17:57 ] @
Pa ako na zalost nije za PIC, mozda bi mogao da napises neki prinicp, objasnjenje, koje bi mi znacilo u slucaju za PIC

pozz
[ sander @ 04.01.2008. 22:51 ] @
Da inicijalizuje se direktivom (ccs c compiler) #use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3). Posto kontroler koji on misli da koristi nema hardverski USART ne ide u interapt kod prijema. Ili koristi getc() funkciju koja ce cekati prijem podataka (mena time-out) ili ako treba da radi i jos ponesto osim cekanja na prijem moze da koristi funkciju kbhit() koja daje TRUE ako je start bit poslat (kod software-skog USART-) ili da li je primljen podatak (kod hardware-skog USART-a). Kod software-ske varijante funkciju je potrebno pozivati 10 puta baud rate kako se ne bi desilo da se preskoci citanje podataka. Stavio sam sve slucajeve samo kao primer, sto se bafera tice postoji hardware-ski FIFO od 2 bajta ako se ne procitaju podaci a stigne treci prijavljuje se greska OVERRUN (vazi za kontrolere do pic24 serije, kod 24F serije je nesto drugcije dok kod 24H serije USART moze da koristi i DMA za baferovanje podataka, nisam koristio samo se prisecam Microchip-ovog work shop-a za 16 bitne PIC kontrolere. Dobra stvar kod hardware-skog USART-a je interapt na detekciju adrese (9 bit) zgodno kod povezivanja vise kontrolera u mrezu. Inace uz CCS C dolazi dosta primera tako da preporucujem ovaj kompajler eventualnim pocetnicima u C-u.

Spakovao sam nesto knjiga koje sam skupio na net-u (100Mb) pa kad mi se zavrsi uploadovanje saljem link.
[ johnny_hush @ 05.01.2008. 01:26 ] @
Hvala unapred
[ sander @ 05.01.2008. 07:02 ] @
Evo linka:

http://rapidshare.de/files/38210897/PIC-books.zip.html
[ korak @ 05.01.2008. 12:28 ] @
sander hvala.

Mada me je interesovao samo slucaj sa hardverskom kontrolom. Cini mi se da je bafer od 2 bajta suvise mali, a nisam zapazio da si u tekstu napisao sta vraca getc() ako nije primljeno nista (prazan bafer)

johnni_hush: napisacu dodatna objasnjenja i objaviti.

Pozdrav.
[ johnny_hush @ 05.01.2008. 14:14 ] @
@sander Thanks!

@korak Unapred hvala, dosta bi znacilo

pozz
[ korak @ 05.01.2008. 14:26 ] @
johnni_hush:

Kao sto sam ti obecao saljem ti moj modul za komunikaciju sa opisom.

Neki su primetili da gotovo nema besplatnih razvojnih alata za Motorolu (sto je glupa poslovna politika), pa sam morao da napravim svoj razvojni alat koji ukljucuje editor, asemblerski kompajler, simulator, loader programa na MCU i dibager. Asembler je napravljen po mom ukusu i takav ne postoji nigde. Videces i sam. Ako nesto nije jasno pitaj. Isti asembler sam napravio i za AVR, ali nije dovoljno testiran jer sa AVR-om ne radim.

Pozdrav.
[ sander @ 05.01.2008. 15:55 ] @
Citat:
korak: sander hvala.

Mada me je interesovao samo slucaj sa hardverskom kontrolom. Cini mi se da je bafer od 2 bajta suvise mali, a nisam zapazio da si u tekstu napisao sta vraca getc() ako nije primljeno nista (prazan bafer)

johnni_hush: napisacu dodatna objasnjenja i objaviti.

Pozdrav.


Bafer je dva bajta zato sto se ocekuje da ti je to dovoljno da barem jedan podatak procitas iz generisanog interapta kod prijema, ono jeste bilo bi bolje da je veci ali ni ovako nije lose. Funkcija getc() ce cekati prijem da bi se nastavilo izvodjenje programa i vratice primljeni podatak, kao sto rekoh ako se to ne zeli onda je potrebno koristiti funkciju kbhit() pa onda getc() ili jos bolje interapt na prijem podatka.
[ korak @ 05.01.2008. 19:09 ] @
Sada je sve jasno, hvala

Pozdrav