[ ruzmarin84 @ 04.07.2010. 23:10 ] @
Ovako... PIC 16f877 vrsi 10-bitnu ad konverziju i rezultat u byte-ovima salje serijskom vezom u PIC 18f4550, koji te bajtove prima i prosledjuje na usb port racunara... Verovatno da nije preterano slozeno, ali ne mogu bas lako da provalim kako da byte-ove koje posaljem sa jednog primim na drugom picu.
Kada pokrenem aplikaciju na pc-u, preko usb porta se salje 254 ka 18f4550, koji kada to primi treba da prosledi u 16f877a, koji kada to primi vrsi ad konverziju i onda vraca bajtove ovom 18f.... mislim da mi se podaci gube u serijskoj vezi dva pic-a. Sa razvojnog sistema, pomocu hiper terminala vidim da mi pic 16f877 vraca neke podatke kada mu posaljem 254, ali ne mogu da ih razumem... (neki hijeroglifi)... Glavni problem je sto stalno moram da vadim PICeve iz plocica i vracam u razvojni sistem da bi ih reprogramirao, pa im krivim nozice... a i dangubno je...
Znaci kako bih recimo poslao nekih 8 podataka (byte-ova) sa jednog i te iste byteove primio na drugom pic-u preko serijske veze...
Koristim picbasic... Ako neko moze malo da pogleda kod... pa da mi kaze gde sve gresim...


[ bogdan.kecman @ 04.07.2010. 23:32 ] @
za basic ce morati neko drugi ali par saveta

1. uzmi ICSP (npr pickit2 ili pickit3, imas pickit2 klon ovde na forumu prodaju za male pare) - tako ces moci da programiras pic direktno na stampi bez da vadis iz nje
2. ta dva pica - da li si vezao kako treba RX na TX i TX na RX? direktno pin na pin? na istoj plocici? ili imas max232 na oba i razdvojeni su zickom?
3. da li si setovao istu brzinu seriskog porta na oba pic-a, da li si probao sa manjom brzinom..
4. podeli to u 2 dela i prvo nateraj jedan da radi pa drugi, ako ti iz ht-a ne vidis sta ti salje 877 kako mislis da to 4550 dekodira?!

pitanje - da li je poenta ovoga da provalis kako se to radi ili?
[ ruzmarin84 @ 05.07.2010. 06:44 ] @
Napravio sam dve odvojene plocice, na jednoj 877a, na drugoj 4550. Spojio sam tx na rx i rx na tx, ali ne preko max-a, vec zicom direktno... tako sam ukapirao da treba kada spajam pic sa pic. Brzina jeste ista. E sad... kada napisem ovako naredbu:
hserout [promenljiva]..... na prijemu imam te hijeroglife... a kada napisem
hserout [dec promenljiva]... na prijemu u ht-u vidim brojeve...
sad problem je sto ne znam da li su mi to valjani podaci... uglavnom sigurno se ceo proces ne odvija kako treba, cim nemam rezultat...
Da li treba da koristim max232 ako spajam pic na pic?

A ovo radim kako bih kasnije nekako uspeo da iskoristim rs232 na 485, zbog dostizanja vece razdaljine... pre svega da malo ukapiram serijsku komunikaciju... i da bih iskoristio neki software koji sam pisao u VB.NET-u, a korektno radi na 4550 i koristi USB...
[ _str_ @ 05.07.2010. 08:52 ] @
Dali koristis kristale na obe plocie ili rade sa internim RC oscilatorom?
[ ruzmarin84 @ 05.07.2010. 08:55 ] @
Na jednoj je kristal od 8MHz, a na drugoj kristal od 20MHz, nisam imao trenutno dva ista... Da nije mozda tu problem?
[ cat2kill @ 05.07.2010. 11:18 ] @
Pazi da oba imaju isti baud rate. Naravno treba uzeti u obzir i grešku baud rejta s obzirom na frekvenciju oscilatora (to je navedeno u datasheetu)
Predpostavljam da vjerojatno imaš razlog za to, ali zašto jednostavno ne koristiš 18F4550 da ti radi ADC.

Serijska veza je okey, ali možeš koristiti I2C ili SPI.
[ ruzmarin84 @ 05.07.2010. 11:29 ] @
Imaju oba istu brzinu... 18f4550 radi konverziju i salje podatke... tako jeste trenutno stanje... ali je problem sto za svako snimanje podataka u trajanju od najmanje 30 minuta mora laptop da se nosi do mesta gde je uredjaj za ocitavanje namontiran. Zato sam mislio da iskoristim aplikaciju koju sam pravio, a da vezu produzim kao serijsku rs485... trebace bogami 150 do 200m, do kancelarije gde ima kompjuter i stampac.
Posto ne mogu usb da produzim, prvo mi je palo na pamet ovako nesto... Ustvari neko sa foruma mi je to predlozio...
[ bogdan.kecman @ 05.07.2010. 11:43 ] @
ok ti je taj koncept samo

1. bolje ti je 18F2550 umesto 18F4550 - manji je, jeftiniji je radi isto sto i 4550
2. prvo napravi da ti usb radi, dakle zabodi 2550/4550 na usb i sa druge strane okaci terminal i napravi da ti ono sto posaljes na usb izlazi na terminalu i ono sto posaljes sa terminala stize kako treba na usb (dakle bez hijeroglifa, da ti lepo radi komunikacija)
3. bolje ti je 16F690 umesto 16F877 (10 adc-ova, seriski port, manji / jeftiniji chip)
4. onda napravi da ti 877/690 radi kako treba, zakacis terminal na njega i pricas sa njim, opet - bez hijeroglifa.
5. spojis ta dva mdoula DIREKTNO (bez ikakvih transcievera) RX na TX i TX na RX i probas da li sve radi

tek kada sve 1-5 radi kako treba, tek onda ukljucujes u pricu transcievere / rs485 ili koji ces vec da koristis ..
[ foxhunter1 @ 05.07.2010. 15:25 ] @
Citat:
ruzmarin84: E sad... kada napisem ovako naredbu:
hserout [promenljiva]..... na prijemu imam te hijeroglife... a kada napisem
hserout [dec promenljiva]... na prijemu u ht-u vidim brojeve...
sad problem je sto ne znam da li su mi to valjani podaci... uglavnom sigurno se ceo proces ne odvija kako treba, cim nemam rezultat...
Da li treba da koristim max232 ako spajam pic na pic?
...


Kada mu zapovedis: hserout [promenljiva] >>> onda ti PIC salje samo jedan byte. Najbolje cu ti to objasniti primerom: ako je promenljiva = 65, onda ce ti PIC preko serijskog porta poslati bas tu vrednost i ako to gledas preko nekog terminal programa koji je u 'ASCI' modu videces karakter 'A', ako je terminal u Hex modu videces hex 41 (=65 dec). Medjutim ako je vrednost tvoje promenljive u ASCI tabeli nema nama poznat znak (standardna slova alfabeta, brojevi i znakovi interpunkcije) videces 'hijeroglife'.

A ako si mu zapovedio: hserout [dec promenljiva] i tvoja 'promenljiva' ponovo ima vrednost 65, PIC ce sada poslati 2 bajta kao string: "65" ... terminal (u asci modu) prikazace ti: 6 5, u hex modu: 36 35.

Nadam se da sam ti pomogao da razumes neke stvari. U uputstvu za PBP imas objasnjene 'modifajere' za HSEROUT, SEROUT, SEROUT2 sa primerima koji ce ti pomoci da to ukapiras.

ps Nadji neki pismeniji terminal program od HTa ... imas na netu Tiny PIC bootloader ... pretrazi googlom bas ovako. ima odlican terminal u sebi, gde istovremeno mozes da gledas i ASCI i hex interpretaciju primljenih karaktera. Jedina falinka mu je sto ne podrzava sve brzine.

Sada videh da si u kodu za F877 napisao:

Define ADC_CLOCK 20/8 ' Klok (0=Oscilator /8)

Ovo ce kompajler (najverovatnije) prevesti kao: Define ADC_CLOCK 2
Da li si zaista zeleo da ti bude ovako definisan klok ADCa, ili si napravio previd?


[Ovu poruku je menjao foxhunter1 dana 05.07.2010. u 16:42 GMT+1]
[ ruzmarin84 @ 05.07.2010. 17:20 ] @
razumeo sam to sa dec... i hex...
Za oscilator 20/8, nije previd, ostao je los komentar... Menjao sam oscilatore, mislio sam da nije mozda tu problem...
E vidite ovako...
Ovaj 877a, sada salje normalne vrednosti... ne znam kako ce to ovaj 4550 da prima... ali ja na terminalu ocitavam korektne brojeve...
f4550 mi pravi probleme... Nema sanse da proradi serijska komunikacija kako treba. On konstanto salje hijeroglife... i ne mogu da nadjem ni jedan primer u PICBASIC-u sa 4550 na netu koji radi serijsku komunikaciju dobro. Mislim da mozda neki registar nisam dobro konfigurisao, od onih u vezi EUSART-a, ali nesto mi nisu bas najjasniji... Uglavnom ne prolazi isto kao kod 877a.
Siguran sam da kada mu posaljem zahtev preko usb-a da on to detektuje, i vrati mi odgovor, ali njega ja ne mogu da detektujem.
Inace koristim ovaj terminal iz pbp-a. Probacu i taj sto si mi preporucio, ali tesko da je tu problem...
[ foxhunter1 @ 05.07.2010. 19:40 ] @
Ma nije problem u terminal programu, ovaj sam ti preporucio da bi sebi olaksao zivot.

Sada sam malo detaljnije pogledao tvoj program za 4550. Tu si definisao da ti je oscilator 8 MHz. Kompajler na osnovu te definije izracunava sve ostale tajminge. Ne znam kakvi su ti konfig fjuzovi, prilikom programiranja, ali sam gotovo siguran da ti je klok samog uC dela razlicit od 8 MHz.... znas oni PLL multiplajeri, divizori i ostalo... Ja nisam radio USB sa ovim PICom, radio sam sa 18F14K50, pa nisam bas familijaran sa njim. Ako si omanuo u definiciji kloka, onda ono sto si ti napisao da je brzina serijske kom 2400 bps ne pije vodu uopste :-( .

Drugo sta sam primetio, stavio si da su USB baferi duzine 18 bajta, a cini mi se da treba da budu 8 * n, ali ako kazes da ti USB deo radi kako treba - onda mi se samo cini :-)

deo koda:
If USBBuffer[0] = 254 Then
hserout [dec3 usbbuffer[0]]
Gosub DoUSBOut

USBBuffer[0] = 0 ' ili nesto drugo, samo da bude razlicito od 254

Endif

Dodao sam ti ovu liniju, jer ako je jednom bilo 254 - ostace tako sve dok ne posaljes neku drugu vrednost sa PCja, znaci bice ti uslov uvek ispunjen, a ti si to poslao jos pre pola sata...

Sledeca primedba:

hserin [usbbuffer[0]]
if USBBuffer[0]=254 then

'Realizacija AD konverzije

hserin [usbbuffer[1]]
hserin [usbbuffer[2]]
hserin [usbbuffer[3]]
...

Ako sam dobro shvatio, ti ovde ocekujes podatke od PIC16F877. Mislim da to uopste ne moze ovako. Komanda HSERIN jednostavno proveri da li serijski bafer pun i ako ima nesto pokupi i stavi u tvoju promenljivu. Ako nema nicega jednostavno preleti preko tog dela (ili se vrti u petlji cekajuci da se nesto pojavi - nisam 100% siguran). Ako taj deo i prodje, ti posle toga odmah kupis narednih 16 bajtova, a to 'nece da moze' ... Moraces to nekako drugacije da osmislis, mozes da probas da koristis SERIN2 modifajere, gde ces cekati $FE (254) i posle toga puniti tvoj bafer. Imas i timeout lejblove itd, ali ti stvari dodatno komplikuje i odrzavanje USB konekcije :-( ... sto rece Pirotjanac - ne da Bog dva dobra zajedno nikako... da ti tuberkulozu za dzabe ... al' moras da kasljes :-).

Reci ti meni, koliko cesto vrsis prozivku sa PCja, pa da probamo nesto da osmislimo?

Pozdrav

[ ruzmarin84 @ 05.07.2010. 20:25 ] @
Sa malim izmenama koda za 16f877a dosao sam do nekih rezultata. i siguran sam da se ad konverzija vrsi korektno, proverio sam na lcd displeju, rezultati su bili ok. E sad, da li ce ti podaci da budu dobro desifrovani na serijskom portu, to je pitanje koje cu tek da resavam.

E i ja sam gotovo 100% siguran da nesto kod izbora brzine za ovaj 18f4550 nije ok... U datasheetu ima mnogo nekih za mene konfuznih stvari... taman kad nesto i izmenim, izgubim i ono sto sam na pocetku imao.

Dobre su ti primedbe za ovo sto si izmenio u kodu, ima smisla potpuno... sad sam gledao, a za ove hserin na 4550 bio sam sumnjicav od pocetka da ce da rade... ali rekoh da pokusam, pa ako ne bude trazicu dalje...

Inace podatke treba da dobijam na svakih minimalno 30 sec. To su neki tehnoloski zahtevi... Mada sam ja dok sam pisao aplikaciju (kad je sve bilo na 4550 picu) uzimao podatke i na svaku 1 s i radilo je kako treba.

Sad mi je cilj da bilo sta procitam sa 4550 na serijskom portu, ali da to u terminalu stvarno bude citljivo. Moguce da ga malo zeza i to sto treba da rade usb i serijska konekcija odjednom... sto rece ti u vicu... nece dva dobr odjednom...
Hvala svima na trudu... znao sam da ce ovde biti dosta posla, ali bez muke nema nauke :)

[ cat2kill @ 05.07.2010. 21:35 ] @
Koliko sam ja radio sa 18F2550/4550 znam da za mod u kojem radi USB , unutarnji klok treba biti 48MHz, koji se postigne namještanjem 96MHz PLL prescalera i system clock postscalera.

Znaći, ako imaš quartz recimo 8MHz, preskaler namještar na /2 time dobiješ interni klok za PLL od 4MHz koji se onda množi za 24, da se dobije 96MHz. A tad se tih 96MHz dijeli sa 2 da se dobije clock za USB.
A za CPU core dijeljenje može biti sa 2, 3, 4, 6.

Tako da kompajleru kažeš na kojoj ti frekvenciji radi CPU core tako da on zna izračunati tajminge za USART.

Pazi na to, mene je to zezalo dok nisam skužio. Recimo možeš za test mu reći da na neki pin da 8kHz PWM izlaz. Pa tako recimo ako si kompajliro sa 8MHz postavkom, trebao bi dobiti 8kHz, ali ako nije, dobiti ćeš neku drugu vrijednost.
[ ruzmarin84 @ 05.07.2010. 22:27 ] @
Za cat2kill-a:

Bravo majstore.....
Proradi!!!... Vec sam poceo da besnim...
Jos da vidim kako cu da ove podatke izprosledjujem sa jednog u drugi... Al to neka ga do sutra... :)
Pozdrav svima...
[ cat2kill @ 05.07.2010. 22:40 ] @
A ako želiš baš biti über COOL & fancy. Možeš recimo iskoristiti MRF24J40MA/B transceiver i cijelu tu spiku sa serijskim slanjem podataka riješiti bežično :D Ali naravno to je dodatna investicija.
[ ruzmarin84 @ 07.07.2010. 09:25 ] @
Momci, ponovo moram da vam se obratim.
Imam neke rezultate, ali kad radim odvojeno sa po jednim PIC-om i terminalom.

Ovako sam zamislio i isprogramirao da tece proces...

1. 18f4550 salje 254 na 16f877, ovaj to primi i onda salje prvi podatak nazad na 4550.
2. Kada 4550 primi podatak on salje 877-ici "444" (znak da je primio podatak).
3. Kad 877-ica primi "444" salje drugi podatak na 4550...
...
4.Kad 16f877 posalje 16 podataka, i kad 18f4550 primi poslednji (16-ti) podatak, on salje sve to na USB.
5.kraj

To je ustvari ono sto mi je Bogdan.Kecman rekao u nekom od prethodnih postova.

E sad ovako... Sve to radi na terminalu pri brzini 4800 sa razdvojenim PIC-evima. Kad ih spojim, nemam ocitavanja.

Ubacicu listinge, pa ako neko ima malo vremena neka pogleda... ali ono sto me buni je pravilno podesavanje baudrate u programu. Naime, na jednom pic-u je u programu namestena brzina 4800, a na drugom 2400. Ali na terminalu oba rade na 4800. Druga stvar, ni jedan PIC ne mogu da nateram da radi sa oscilatorom od 20 MHz. Sa 8MHz rade.
Da li bi neko ko se sa ovim sretao mogao da malo pojasni kako se racunaju ovi DEFINE parametri i kako se pravilno postavljaju registri vezani za serijsku komunikaciju. Nasao sam na net-u i neki kalkulator Mister E Pic Multi-calc, ali cini mi se da to sto on kalkulise ne pije vodu. Hvala unapred...
[ bogdan.kecman @ 07.07.2010. 09:43 ] @
za DEFINE ce morati neko ko cuka taj basic ..

sto se tice 20MHz kristala, obrati paznju da 4550 kada radi sa USB-om ne moze da radi sa svakim kristalom. Jako je bitno da mu klok za usb bude 96MHz tako da je fora da ti setujes konfig tako da od tvog kristala dobijes tih 96MHz koje onda sa deliocem (post scalerom) namestis frekvenciju na kojoj ce ti trcati cpu. Ako se dobro secam, sa 20MHz kristalom ne mozes uopste da ga nateras da radi sa usb-om

vezano za bit rate, vec ti je neko napisao, proveri da li tvoj kompajler zna tacno na koliko ti se MHz vrti taj mcu. Ti mozes da konfigurises mcu da trci na 16MHz a kompajleru da kazes da trci na 4MHz i sve ce da "radi" samo sto ce kompajler sve da ti izracuna pogresno pa ce 2400 brzina da bude u stvar 9600 i slicno .. nalakse (tako sam ja u pocetku) - napravis program u kome samo odradis konfiguraciju i onda stavis petlju

upali led
cekaj 1sec
ugasi led
cekaj 1sec
aj ispocetka

i onda vidis, ako je sec vreme blinkanja ubo si konfiguraciju ... (sekund posto ces lako da prepoznas dal je 1sec ili 0.5sec ili 0.1sec cak i sa obicnom stopericom na satu)


drugo - ne znam kakav ti je seriski sa kojim to testiras, posto gomila ovih USB go*** rade "auto sinhronizaciju" tako da bez obzira sta ti kazes u terminal programu on prica sa onim drugim "na njegovoj brzini"
[ cat2kill @ 07.07.2010. 21:30 ] @
PIC18F4550 dela sa usb besprijekorno, sa 20MHz.

Prescaler radi sa dijeljenjem 1,2,3,4,5,6,10 i 12. Tako da oscilator na ulazu može raditi na 4,8,12,16,20,24,40 i 48MHz. Uzeću u obzir da je 20MHz kristal vjerojatno zadnja vrijednost s kojom će raditi stabilno.
Znaći uzmi 20MHz kristal, setiraj preskaler na /5, i postskaler na 2. Reci kompajleru DEFINE OSC 48.

Ma da bi mogao zajeebat PICBASIC, smrdi. Mislim da ti je bolje rješenje mikroBasic for PIC ili još bolje mikroC ili najbolje CCS C
mikroBasic ima nekako prirodniji Basic i iznimno dobar help i veoma dobar forum, i balkanac ga napravi što znaći da je dobro.

Obavezno nariktaj da oba kontrolera imaju ISTI baud rate!
[ Sepa011 @ 07.07.2010. 21:49 ] @
MikroC i MikroBasic su toliko 'prirodni' da neodoljivo (na prvi i svaki drugi pogled) podsecaju na Pascal.
[ cat2kill @ 07.07.2010. 21:58 ] @
Kad si pravi pr0gramer onda možeš da pišeš u čemu ti se sprdne.
Basic, pascal, c, python, ma čak i ASM. Heheh... glavno da nije LOGO :D i FORTRAN (ružno jako).

Pa imaš i mikroPaskal :D uglavnom IDE je veoma sličan. Mislim ako ti je draže piši u konzoli. Svejedno je, kako i s čime, ali neke stvari će dovesti do bržeg rezultata neko ostale.
Nema potrebe za otkrivanjem tople vode i za pisanjem već postojećih funkcija. Jedino ako baš nisi neki hardcore lik koji nastoji sve optimizrat 102% :)

Pomogni čoveku rađe :D vidiš da se tu pati sa serijskom komunikacijom. Ma da se kladim da će još problema biti u vezi toga zbog dosta dugačkoga kabela.
[ ruzmarin84 @ 08.07.2010. 18:51 ] @
Ukapirao sam ovo oko brzina... Ustavri sve pise u datasheetu, samo sto treba da se cita na pravom mestu... Jos sinoc sam uspeo da knfigurisem da svaki pic radi na vise raznih brzina sa raznim oscilatorima, i sve se slaze i u kompajleru... i na terminalu... ali kad se spoje dve plocice medjusobno, nece ni da cuje... Pa sam danas napravio jednu plocicu sa max232, da proverim da li su ove dve dobre... i sve radi 100%. ali kad ih spojim... nista.

Stvarno ne znam vise sta da mu radim, a izgubio sam dosta vremena, pa mi se ne odustaje...
Posto sam trenutno malo bez ideje, da vas priupitam, da li se prilikom spajanja dva mikrokontrolera preko serijskog porta jednostavno sa dve zice spoje RX prvog i TX drugog i RX drugog sa TX prvog, ili treba da ima jos nesto izmedju... Da nisam tu nesto zeznuo...?

Evo i da ostavim link, ako se neko nekad bude zezao sa ovim brzinama za serijski port u zavisnosti od brzine oscilatora meni je dosta koristio Pic Baud Rate Calculator...

http://www.micromagicsystems.com/

Ako neko ima neko knstruktivno resenje, ili predlog, neka baci neku recenicu...



[ Sepa011 @ 08.07.2010. 20:20 ] @
Treba pored Rx i Tx jos zicka za masu.

Podrazumeva se da Tx prvog ide na Rx drugog i Rx prvog na Tx drugog.

Ako bas oces da stavljas max-ove, treba ti 2 komada, kod svakog kontrolera po jedan. Onda mozes pomocu racunara koji ima 2 serijska porta da 'snifujes' komunikaciju izmedju samih kontrolera a jos da ti se vrti i aplikacija koja sa 18F cavrlja USB-om.
[ cat2kill @ 08.07.2010. 20:54 ] @
REcimo ovako nešto :D cisto shematski :D
[ ruzmarin84 @ 08.07.2010. 21:53 ] @
Ma necu maxeve, koji ce mi djavo ako ne trebaju... Samo sam pomocu jednog testirao ove dve skalamerije sto sam pravio... i uverio se da su ispravne...
Pretpostavljam da je nesto u kodu greska, ali ko zna dal cu uspeti to da nadjem... Opet kazem, ako neko od vas poznaje picbasic da malo pogleda ove kodove... dal mozda nije greska u formatu podatka koji saljem (ovo DEC)... da li pic to razume na isti nacin kao i pc...

Dal znaci nesto dodati pauze iza svakog slanja/primanja...
jesam malo dosadan, al malo mi fali da ovo ugazim, i odem na pecanje ili tako nesto...

Sa masom sam isprobao... bez uspeha...
[ Sepa011 @ 08.07.2010. 22:25 ] @
Malko si se nesto posvadjao sa bajtovima/wordovima

deklarises clanove niza kao Byte
Code:
USBBuffer        Var Byte[USBBufferSizeMax]

a pridodeljujes vrednost koja je veca od 255 (Byte = 0..255 ili $00..$FF)
Code:
uSBBuffer[1]=444

ovo gore NECE DA MOZE posto USBBuffer[1] ne moza da ima vrednost vecu od $FF (255)

tolko za pocetak, trazi dalje ...
[ ruzmarin84 @ 10.07.2010. 15:05 ] @
Opet moram da gnjavim nekog da malko zrakne u ove PICBASIC kodove... nema teorije da ova dva progovore medjusobno...
Pic 16 uopste nece da odgovori ovom pic18.Kao da ne razume ovo 254. A preko terminala se sve odvija korektno. Kada instrumentom premerim izmedju tx i rx vidim da pic 18 posalje zahtev, ali ovaj 877 ne odgovara. a kada komuniciram preko terminala imam i slanje i odgovor. Juce sam se oko ovog zezao ceo dan, i procitao kilometre teksta, ali jednostavno ne mogu da nedjem nesto korisno. Ovo za byte-ove sam prevideo... ali nista i kad sam to promenio.

Da nije nesto vezano za oscilatore. Da ne moraju biti iste hercaze??? Ne znam gde da gledam...
[ Sepa011 @ 10.07.2010. 18:17 ] @
Mislim (ne zamo da mislim, nego znam) gde ti je greska. Turas Dec modifajer gde treba i gde ne treba. Procitaj help ili uputstvo za PBP.

Ovako to izgleda u Proton+ -u

Code:
Device 16F877
Xtal 20

Declare Adin_Res 10
Declare Adin_Tad 8_FOSC
Declare Hserial_Baud 2400

Dim AD_Rez_1 As Word
Dim AD_Rez_2 As Word
Dim AD_Rez_3 As Word
Dim AD_Rez_4 As Word
Dim AD_Rez_5 As Word
Dim AD_Rez_6 As Word
Dim AD_Rez_7 As Word
Dim AD_Rez_8 As Word

Dim i As Byte

Dim USBBufferSizeMax As 18
Dim USBBufferSizeTx As 18
Dim USBBufferSizeRx As 18

Dim test As Byte
Dim USBBuffer[USBBufferSizeMax] As Byte
Dim USBBufferCount As Byte

ADCON0 = %00111111
TRISA  = %11111111
ADCON1 = %10000010

Low PORTE.0
TRISC.7 = 1
TRISC.6 = 1
RCSTA.7 = 1

Pocetak:

ProgramStart:
GoSub DoSerIn
GoTo ProgramStart

DoSerIn:
    USBBufferCount = USBBufferSizeRx
    HSerIn [Dec USBBuffer[0]]
    If USBBuffer[0] = 254 Then
        GoSub DoSerOut
    EndIf
Return
                    
DoSerOut:
    USBBufferCount = USBBufferSizeTx
    USBBuffer[0] = 254
                        
    'REALIZACIJA AD KONVERZIJE
    AD_Rez_3 = ADIn 0        'izvrsi konverziju na RA0 i 10 bita
                            'rezultata smesti u AD_rez_3
    AD_Rez_4 = ADIn 1       'izvrsi konverziju na RA1 i 10 bita
                            'rezultata smesti u AD_rez_4
    AD_Rez_1 = ADIn 2       'izvrsi konverziju na RA2 i 10 bita
                            'rezultata smesti u AD_rez_1
    AD_Rez_2 = ADIn 3       'izvrsi konverziju na RA3 i 10 bita
                            'rezultata smesti u AD_rez_2
    AD_Rez_5 = ADIn 4       'izvrsi konverziju na RA4 i 10 bita
                            'rezultata smesti u AD_rez_5
    AD_Rez_6 = ADIn 5       'izvrsi konverziju na RA5 i 10 bita
                            'rezultata smesti u AD_rez_6
    AD_Rez_7 = ADIn 6       'izvrsi konverziju na RA6 i 10 bita
                            'rezultata smesti u AD_rez_7
    AD_Rez_8 = ADIn 7       'izvrsi konverziju na RA7 i 10 bita
                            'rezultata smesti u AD_rez_8
    
                       
    USBBuffer[1] = AD_Rez_1.LowByte            'Nizi bajt rezultata smesti
                                            'u USBBuffer[1]
    USBBuffer[2] = AD_Rez_1.HighByte        'Visi bajt rezultata smesti
                                            'u USBBuffer[2]
    USBBuffer[3] = AD_Rez_2.LowByte            'Nizi bajt rezultata smesti
                                             'u USBBuffer[3]  
    USBBuffer[4] = AD_Rez_2.HighByte        'Visi bajt rezultata smesti
                                            'u USBBuffer[4]
    USBBuffer[5] = AD_Rez_3.LowByte            'Nizi bajt rezultata smesti
                                             'u USBBuffer[5]
    USBBuffer[6] = AD_Rez_3.HighByte        'Visi bajt rezultata smesti
                                             'u USBBuffer[6]
    USBBuffer[7] = AD_Rez_4.LowByte            'Nizi bajt rezultata smesti
                                             'u USBBuffer[7]
    USBBuffer[8] = AD_Rez_4.HighByte        'Visi bajt rezultata smesti
                                             'u USBBuffer[8]
    USBBuffer[9] = AD_Rez_5.LowByte            'Nizi bajt rezultata smesti
                                             'u USBBuffer[9]
    USBBuffer[10] = AD_Rez_5.HighByte        'Visi bajt rezultata smesti
                                             'u USBBuffer[10]
    USBBuffer[11] = AD_Rez_6.LowByte        'Nizi bajt rezultata smesti
                                             'u USBBuffer[11]  
    USBBuffer[12] = AD_Rez_6.HighByte        'Visi bajt rezultata smesti
                                             'u USBBuffer[12]
    USBBuffer[13] = AD_Rez_7.LowByte        'Nizi bajt rezultata smesti
                                             'u USBBuffer[13]
    USBBuffer[14] = AD_Rez_7.HighByte        'Visi bajt rezultata smesti
                                             'u USBBuffer[14]
    USBBuffer[15] = AD_Rez_8.LowByte        'Nizi bajt rezultata smesti
                                             'u USBBuffer[15]
    USBBuffer[16] = AD_Rez_8.HighByte        'Visi bajt rezultata smesti
                                             'u USBBuffer[16]
                       
    High PORTE.0
    HSerOut  [Dec USBBuffer[1]]
                       
    timeout2:
    HSerIn 5000,timeout2, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[2]]
    EndIf
    Low PORTE.0
                       
    timeout3:
    HSerIn 5000,timeout3, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[3]]
    EndIf
    High PORTE.0
                       
    timeout4:
    HSerIn 5000,timeout4, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[4]]
    EndIf
    Low PORTE.0
                       
    timeout5:
    HSerIn 5000,timeout5, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[5]]
    EndIf
    High PORTE.0
                       
    timeout6:
    HSerIn 5000,timeout6, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[6]]
    EndIf
    Low PORTE.0
                       
    timeout7:
    HSerIn 5000,timeout7, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[7]]
    EndIf
    High PORTE.0
    
    timeout8:
    HSerIn 5000,timeout8, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[8]]
    EndIf
    Low PORTE.0
                       
    timeout9:
    HSerIn 5000,timeout9, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[9]]
    EndIf
    High PORTE.0
                       
    timeout10:
    HSerIn 5000,timeout10, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[10]]
    EndIf
    Low PORTE.0
                       
    timeout11:
    HSerIn 5000,timeout11, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[11]]
    EndIf
    High PORTE.0
                       
    timeout12:
    HSerIn 5000,timeout12, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[12]]
    EndIf
    Low PORTE.0
                       
    timeout13:
    HSerIn 5000,timeout13, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[13]]
    EndIf
    High PORTE.0
                       
    timeout14:
    HSerIn 5000,timeout14, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[14]]
    EndIf
    Low PORTE.0
                       
    timeout15:
    HSerIn 5000,timeout15, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[15]]
    EndIf
    High PORTE.0
                       
    timeout16:
    HSerIn 5000,timeout16, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[16]]
    EndIf
    Low PORTE.0                      ' Ugasi signalnu lampicu
Return

End      

za pic16

Normalno se kompajlira, a nocas cu da ti kazem kako se ponasa na razvojnom sistemu (sa PIC16F887 na 8MHz)
[ ruzmarin84 @ 10.07.2010. 20:48 ] @
Code:
 High PORTE.0
    HSerOut  [Dec USBBuffer[1]]
                       
    timeout2:
    HSerIn 5000,timeout2, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[2]]
    EndIf
    Low PORTE.0
                       
    timeout3:
    HSerIn 5000,timeout3, [test]
    If test = 111 Then
        HSerOut  [USBBuffer[3]]
    EndIf
    High PORTE.0


Jel na pocetku, iza prvog hserout treba da ide dec?
Nije mi jasno kad se koristi, a kad ne. Meni terminal uglavnom cita hieroglife kad ne stavim dec.
Ako ti nije tesko pojasni mi u dve recenice... (kad budes imao malo vremena naravno...)
Hvala puno...
[ Sepa011 @ 10.07.2010. 21:39 ] @
Ajde 'vako:

Kad turis Dec ispred neke promenljive koju saljes serijskim portom dalje, kompajler to pretvori u niz ASCII cifara koje su nama, ljudima citljive, tako da se Dec 111 u terminalskom prozoru vidi kao 111. Ako ne stavis to Dec, onda ces u terminalu da vidis o (malo slovo O).

Sve od 32 do 126 su printabilni ASCII karakteri.

Kada tvom piconji saljes "komandu" tipa 254, ti u stvari saljes BAJT vrednosti 254 ($FE ili %11111110)

Moras da razgranicis sta su nizovi ASCII znakova a sta su promenljive tipa Byte ili Word ili Dword....

I jes zaheb, ne treba to Dec koje si video. Da sam na tvom mestu, ovu rutinu za slanje vrednosti A/D konverzije bih uradio drugacije (ne bih cekao 'test' da stigne da bi se poslao sledeci bajt)
[ Sepa011 @ 10.07.2010. 22:16 ] @
Ovo ispod radi k'o sat kada se iz terminala posalje ASCII 254, ne sekvenca brojeva 2 5 4 ($32 $35 $34)

Code:
'****************************************************************
'*  Name    : PIC16.BAS                                         *
'*  Author  :                                                   *
'*  Notice  :                                                   *
'*          :                                                   *
'*  Date    :                                                   *
'*  Version :                                                   *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F887
Xtal 8

Declare Adin_Res 10
Declare Adin_Tad 8_FOSC
Declare Hserial_Baud 2400

Dim AD_Rez_1 As Word
Dim AD_Rez_2 As Word
Dim AD_Rez_3 As Word
Dim AD_Rez_4 As Word
Dim AD_Rez_5 As Word
Dim AD_Rez_6 As Word
Dim AD_Rez_7 As Word
Dim AD_Rez_8 As Word

Dim i As Byte

Dim USBBufferSizeMax As 18
Dim USBBufferSizeTx As 18
Dim USBBufferSizeRx As 18

Dim test As Byte
Dim USBBuffer[USBBufferSizeMax] As Byte
Dim USBBufferCount As Byte

ADCON0 = %00111111
TRISA  = %11111111
ADCON1 = %10000010

Low PORTE.0
TRISC.7 = 1
TRISC.6 = 1
RCSTA.7 = 1

Pocetak:
DelayMS 100
HSerOut ["Alive", 13, 10]

While 1 = 1
    GoSub DoSerIn
Wend

DoSerIn:
    USBBufferCount = USBBufferSizeRx
    HSerIn [USBBuffer[0]]
    If USBBuffer[0] = 254 Then
        GoSub DoSerOut
    EndIf
Return
                    
DoSerOut:
    USBBufferCount = USBBufferSizeTx
    USBBuffer[0] = 254
                        
    AD_Rez_3 = ADIn 0
    AD_Rez_4 = ADIn 1
    AD_Rez_1 = ADIn 2
    AD_Rez_2 = ADIn 3
    AD_Rez_5 = ADIn 4
    AD_Rez_6 = ADIn 5
    AD_Rez_7 = ADIn 6
    AD_Rez_8 = ADIn 7
    
    USBBuffer[1] = AD_Rez_1.LowByte
    USBBuffer[2] = AD_Rez_1.HighByte
    USBBuffer[3] = AD_Rez_2.LowByte
    USBBuffer[4] = AD_Rez_2.HighByte
    USBBuffer[5] = AD_Rez_3.LowByte
    USBBuffer[6] = AD_Rez_3.HighByte
    USBBuffer[7] = AD_Rez_4.LowByte
    USBBuffer[8] = AD_Rez_4.HighByte
    USBBuffer[9] = AD_Rez_5.LowByte
    USBBuffer[10] = AD_Rez_5.HighByte
    USBBuffer[11] = AD_Rez_6.LowByte
    USBBuffer[12] = AD_Rez_6.HighByte
    USBBuffer[13] = AD_Rez_7.LowByte
    USBBuffer[14] = AD_Rez_7.HighByte
    USBBuffer[15] = AD_Rez_8.LowByte
    USBBuffer[16] = AD_Rez_8.HighByte
                       
    High PORTE.0
    For i = 1 To USBBufferSizeMax - 2
        HSerOut  [USBBuffer[i]]
    Next i
    Low PORTE.0
                       
Return

End
[ ruzmarin84 @ 11.07.2010. 09:59 ] @
Sepa011

Hvala ti do neba... Proradilo mi je sve... Pretpostavljao sam da je nesto banalno, ali ne bih ja to pronasao jos 100 godina...
Ipak je iskustvo ono sto se stice :) .....

Jos da vidim kako da mu ubacim RS485 komunikaciju na sve ovo... i problem resen

Hvala svim ucesnicima na veoma korisnim komentarima i savetima...