skraceni kurs ucenja picbasica

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

dobrodosao na forum i hvala.
nastavak bi trebao biti uskoro.
samo da mi prodju kolokvijumi i obaveze oko faksa...
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

dodje red da krenemo dalje.
evo primer kako se koriste i2c memorije tipa 24cXX
detalj seme povezivanja eeproma:
i2csema.GIF
(8.43 KiB) Downloaded 146 times
potrebno je spojiti jos ledice na portb, i napajanje, kristal pullup na mclr..
koja rec o memoriji.
untitled.GIF
(10.05 KiB) Downloaded 137 times
u tablici su dati kapaciteti memorija, od cega se sastoje kontrolni bajtovi, i koja je duzina adrese(byte ili word)
sintaksa za naredbu upisa u memoriju izgleda ovako:
I2CWRITE SDA,SCL, Kontrolni_bajt,{Adresa,}[Prom{,Prom...}]
sda, i scl predstavljaju data i clock pinove. na semi su porta.0 i porta.1, i iz tog razloga na pocetku je potrebno definisatite pinove. to se radi na sledeci nacin
SYMBOL SDA=porta.0
SYMBOL SCL= pota.1
DEFINE I2C_SDA PORTA,0
DEFINE I2C_SCL PORTA,1
pin SDA mora biti pin sa otvorenim kolektorom(scl nije obavezan da bude sa otvorenim kolektorom)
kontrolna rec se uzima iz tabele.
moze da se pise u binarnom obliku kao sto je u tabeli. ili krace u heksa decimalnom.
posto su leva 4 bita 1010 to je decimalni broj 10 ili heksadecimalni A.
stoga za kontrolnu rec cemo pisati $a0 ako su cs0-cs3 na masi.
u tablici se vidi da u kontolnu rec ulaze bitovi oznaceni sa b, i napomenuto je da sluze za odabir blokova u memoriji. npr memorija 24c04 je kapaciteta 512 bajtova. a adresa je duzine bajta, stoga vidimo da samo pomocu adrese ne mozemo pristupiti celoj memoriji. i iz tog razloga postoji ono b u kontrolnoj reci, koje sluzi dali da se selektuje jedna ili druga polovina memorije.
to je najlakse zamisliti kao da su u jednu memoriju spakovali 2 memorije od 256bajtova.
pa ako je b0 onda se pristupa jednom delu a ako je b1 onda drugom.
meni je uvek mrsku da se zezam sa time, pa ako mi je 24c02 mala, onda koristim neku 16-tobitnu memoriju(ovo 16-bitna znaci da je adresa duzine 16bita, a ne podatak)
posle svakog upisa podataka potrebno je sacekati oko 10ms, pre nego sto se krene sa upisom narednog podatka.
primer upisa u memoriju:

Code: Select all

SYMBOL SDA=porta.0
SYMBOL SCL= porta.1
DEFINE I2C_SDA PORTA.0 
DEFINE I2C_SCL PORTA.1
i var byte
Adr var word'(ili byte  zavisi koja se memorija koristi
for i=0 to 255
i2cwrite sda,scl,$a0,adr,[i]
pause 10
next i
naredba za citanje memorije
I2CWRITE SDA, SCL, Kontrolni_bajt,{Adesa,}[Prom{,Prom...}]
jedina razlika izmedju i2cwrite i i2cread je u tome sto sa i2c write pisemo u memoriju podatke a sa i2cread iscitavamo podatak sa adrese u promenljive.
postoje jos 2 stvari vezane za i2c a to su
DEFINE I2C_SCLOUT 1 'ovom naredbom se pin kloka postavlja u bipolarni mod umesto u mod sa otvorenim kolektorom. i u tom slucaju pullup na scl nije potreban
DEFINE I2C_SLOW 1 'ovo se koristi kada se na mikrokontroleru koriste oscilatori brzi od 8MHz-a
evo primer pisanja i citanja podataka iz memorije:

Code: Select all

SYMBOL SDA=porta.0
SYMBOL SCL= porta.1
DEFINE I2C_SDA PORTA.0 
DEFINE I2C_SCL PORTA.1
trisb=0
portb=0
i var byte
Adr var word'(ili byte  zavisi koja se memorija koristi
for i=0 to 255 step 2
adr=i
i2cwrite sda,scl,$a0,adr,[i]
pause 10
next i
for i=0 to 255
i2cread sda,scl,$a0,adr,portb  'iscitava podatak iz memorije i smesta ga na portb
pause 500
next i 
program upisuje na svaku drugu adresu vrednost promenljive i
u drugom delu program iscitava svaku adresu i njenu vrednost smesta na portb. tako da ce se na portub pojaviti vrednost u binarnom obliku.
sledeci bi bio prenos podataka sa racunara na pic.
nadam se da nema gresaka...
plavi
Posts: 1
Joined: 15-12-2008, 13:46

Re: skraceni kurs ucenja picbasica

Post by plavi »

pedja pozdravljama ovu tvoju zamisoa, neki dan sam poceo sa programiranjem pic-eva
imam na pocetku jedno pitanje:
citao sam da je za allpic programator preporucen IcProg v1.05, jeli se moze koristiti MicroCode studio (MCS)
i jeli to radi???
Unaprijed hvala
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

mikrocode studio nije programator. postoji opcioja da se mcs poveze sa programatorom, ali icprog to ne podrzava. ali mislim da nije ni tesko rucno otvoriti hex...
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re:

Post by sasa45 »

izvinjavam se sto kasnim ali ja sam se sad prikljucio u sve ovo i krenuo sam od pocetka.
Imam jednu malu primedbu na ponudjeni kod...smatram da se u ovom obliku tesko moze negde primeniti.
pedja089 wrote:

Code: Select all

SYMBOL  TASTER= PORTB.0
SYMBOL  LED=PORTB.7
OUTPUT LED
INPUT TASTER                   ' sada smo taster proglasili ulazom
pocetak:             
IF TASTER=0 THEN TOGGLE LED  ' sada se ispituje dali je taster stisnut, ukoliko je stisnut promenice se stanje na led, posle svakog ispitivanja pravi se pauza od 1s
PAUSE 1000         
GOTO pocetak   ' program se vraca na pocetak
END
Problem je sto se u svakom ciklusu mora cekati vreme od 1 sec i sa time jako usporava rad tastera,tj duzinu koliko se mora drzati taster da bi on promenio stanje....
ja mislim da je ovako bolje

Code: Select all

LOW OPTION_REG.7 
SYMBOL TASTER= PORTC.0  'dali smo ime pinu portb.0
SYMBOL  LED=PORTC.7
OUTPUT LED
INPUT TASTER                   ' sada smo taster proglasili ulazom
pocetak:             
IF TASTER=1 THEN GOSUB KLIK         
GOTO pocetak   ' program se vraca na pocetak

KLIK:
TOGGLE LED  ' sada se ispituje dali je taster stisnut, ukoliko je stisnut promenice se stanje na led, posle svakog ispitivanja pravi se pauza od 1s
PAUSE 1000
RETURN
END
jedina izmena je dodavanje gosub i sa time se odvaja da se pauza od jedne sekunde koristi samo za led...i samim time taster bolje reaguje....

nadam se da sam uspeo da objasnim....ako gresim molim vas da me ispravite...
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

pa isto ti radi. jer ka skoci na labelu, opet se u njoj zadrzava jednu sekundu
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re: skraceni kurs ucenja picbasica

Post by sasa45 »

da hoce ali ako ja po tvom kodu kratko kliknem na taster a program je na pauzi nece mi odreagovati promena stanja i ako sam pritisao taster...a u mojoj doradi on ceka taster i tek kada ga pritisnes onda nailazi na pauzu...i po mojoj doradi u bilo kojem momentu ako das kratak inpuls tasterom docice do promene stanja...
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

ma daj to je primer, i upravo kako je objasnjeno tako i radi. ne vidim u cemu je problem i zasto komplikovati osnovne stvari. probaj objasniti labele i goto nekome ko prvi put uzme kontroler u ruke. mislim da je lakse skontati ako se program prati bez skokova.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

ja vise nemam ideja sta bi mogao pisati. pa sad ako vas zanima nesto sto nije obradjeno tokom kursa, a niste mogli sami da skontate, pitajte pa cu se potruditi da odgovorim
sasa
Posts: 1
Joined: 25-12-2008, 11:04

Re: skraceni kurs ucenja picbasica

Post by sasa »

pedja pozdravljam ovu tvoju zamisao!! imao bi jedno pitanje za tebe!! Nabavio sam razvojni sistem iz mikroelektronike sa pic16f877a kontrolerom!! Zanima me imas li kakva iskustva sa povezivanjem ps/2 tastature sa pic-om? pozdrav
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

a jedno vreme sam bio zagrejanza to, i nemam pojma zasto nisam nista napravio.
u principu je vrlo jednostavno. postoje clock i data signali koje generise tastatura. kucaj ps/2 keyboard protocol u google i dobices gomilu podataka. jedini je problem sto se mora koristiti neka tabela iz koje ce se uzimati vrednosti slova, jer tastatura ne daje ascii vrednosti. nije mi jasno zasgto su to iskompikovali,ali sta sad.
evo ovde imas lepo objasnjeno
http://www.beyondlogic.org/keyboard/keybrd.htm" onclick="window.open(this.href);return false;
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re:

Post by sasa45 »

pedja089 wrote: e sada ovo bi mogli iskoristiti za izradu nekog konkretnog uredjaja...
npr obrtomera(broj obrtaja u sekundi) ili mozemo ga iskoristiti kao frekfenciometar.
sada nam preostaje jedna nqaredba sa kojom bi prebrojali impulse.
a to je naredba COUNT
sintaksa:
COUNT Pin, Period, BrojImpulsa
Pin je pin na kontroleru na kojem se broje impulsi
Period je vreme za koje se broje impulsi
BrojImpulsa je promenljiva u koju se smesta broj izbrojanih impulsa.
evo primera:

Code: Select all

TRISB=0
TRISA=255
BROJ VAR WORD
BROJ1 VAR BYTE  
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE

POCETAK:
COUNT PORTA.0,1000,BROJ ' broji impulse na pinu RA0, u periodu od 1S i rezultat  smesta u "BROJ"
BROJ1 = BROJ DIG 3 'izdvajamo hiljde
BROJ2 = BROJ DIG 2' izdvajamo stotine
BROJ3 = BROJ DIG 1'desetice
BROJ4 = BROJ DIG 0'jedinice
FOR I = 1 TO 100  ' u ovom slucaju stavili smo da se ispis na displeju ponovi 100 puta, sto znaci da ce vreme prikazivanja broja na displeju biti oko 2 sekunde
PORTB=BROJ1
HIGH PORTB.7
PAUSE 5
LOW PORTB.7

PORTB=BROJ2
HIGH PORTB.6
PAUSE 5
LOW PORTB.6  

PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5 
 
PORTB=BROJ4
HIGH PORTB.4
PAUSE 5
LOW PORTB.4 
NEXT I 
GOTO POCETAK
Imam jedno pitanje vezano bas za ovaj projekat...da li postoji drugo resenje za istu ovu stvar...problem je u treptanju LED Disleya...za vreme od 1sec dok se broje inpulsi na pinu ne moze da se osvezava LED Displey...
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re: skraceni kurs ucenja picbasica

Post by sasa45 »

kako da resim ad konvertor a da mi na displeyu ispisuje vrednost napona a ne velicinu od 0-255

Code: Select all

define adc_bits 5
define adc_clock 3
define adc_sampleus 50

broj var word
broj1 var word

trisa = 255
adcon1 = 2
DEFINE LCD_BITS 4      ' LCD broj Bita na liniji 4 ili 8
DEFINE LCD_DREG PORTB  ' LCD data port
DEFINE LCD_DBIT 0      ' LCD pocetni bit podataka 0 ili 4(od kojeg pina na mikrokontroleru pocinje 0 bit podataka)
DEFINE LCD_RSREG PORTB ' LCD registar select port
DEFINE LCD_RSBIT 4     ' LCD registar select bit (na koji pin na mikrokontroleru je povezan RS bit)
DEFINE LCD_EREG PORTB  ' LCD enable port
DEFINE LCD_EBIT 5      ' LCD enable bit(na koji pin na mikrokontroleru je povezan E bit)
DEFINE LCD_LINES 2     ' Broj linija na LCD-u



pause 500            
lcdout $FE, 1           
POCETAK:
adcin 0,broj
if broj<> broj1 then 
broj1=broj
pause 150
lcdout $FE, 1
lcdout $FE, 2,"COUNT=",dec broj 
endif
GOTO POCETAK

end
koska182
Posts: 11
Joined: 09-06-2007, 01:00

Re: skraceni kurs ucenja picbasica

Post by koska182 »

Definiraš konstantu koja je jednaka 5000/2^n (gdje je n broj bitova u ad konverziji), te onda samo pomnožiš rezutat ad konverzije sa tom konstantom da bi dobio vrijednost u mV...

u tvom slucaju bi trebao pomnožiti sa 5000/32 = 156.25

i to ubaciš u kod, npr:

Code: Select all

Conv1 Con 156                  '5000/32= 156.25
Conv2 Con 25

ADCIN 0, Res                              ' Read Channel 0 data
Volts1 = Res * Conv1                      ' Multiply by 156
Volts2 = Res * Conv2                      ' Multiply by 25
Volts2 = Volts2 / 100 
Volts1 = Volts1 + Volts2                  ' Result in mV

lcdout $FE, 2,"COUNT=",dec Volts1
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re: skraceni kurs ucenja picbasica

Post by sasa45 »

Hvala za ovo objasnjenje probao sam i radi...e jos samo jedno pitanje kako da ga ispisujem u voltima sa dva mesta iza zareza...ja sam pokusao odvojiti u 2 nepoznate jednu za ono ispred zareza i jednu za ono iza zareza i to mi je sve ok ali imam problem sa ispisom zato sto nece da mi ispise broj 01 nego ga napise kao 1...nadam se da razumes sta kazem

DOPISANO1

u redu je resio sam problem sa opcijom DEC2

Code: Select all

lcdout $FE, 2,"COUNT=", DEC ispis1,",",DEC2 ispis2," v"
i sad moze da mi ispise i COUNT=1,03 v

DOPISANO2
Meni ne odgovara konstanta koju si mi poslao.Unimertom iumerim napon na max treba da je 4.8 a na displeyu mi pise 3.8

ja sam se za sada snasao referentni napon (48000) podeljeno sa max brojem koji mi ispise (255) i dobijem konstantu 188...Rezultat mi je u mV...i sad mi ispis na displeyu odgovara vrednosti na unimetru...
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

nije 32, nego se deli sa 1024, jer je konverzija 12to bitna.
i promenljiva u kojoj se smesta rezultrtat mora biti word, ona gornja 4 bita su uvek nule.
evo jedan primer ad konverazije

Code: Select all

 ADCIN 2, AD_Rez   	' Izvrsi konverziju na RA2 i 10 bita rezultata smesti u AD_Rez.
	    Lcdout $fe, $C0	    ' Podesi kursor na pocetak drugog reda
        Dummy = AD_Rez * 5 * 100
        Napon = Div32 1024 'primer 32bitnog deljenja, deli promenljivu Dummy sa brojem iza Div32
        Lcdout $fe, $C0	    ' Podesi kursor na pocetak drugog reda
  	    Lcdout "   Napon:", DEC Napon DIG 2,".", DEC2 Napon, "V" ' Ispisi vrednost na displeju                                       ' rezultat AD konverzije  
  	    Pause 10000		    ' Pauza 10 sec
     
to je samo isecak iz koda...
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re: skraceni kurs ucenja picbasica

Post by sasa45 »

Ja ponvo imam problem i po ovoj matematici ne dobijem tano merenje...tacno merenje mi je ako umesto 1024 stavim 256

Code: Select all

dummy = broj * 5 * 100
ispis=div32 256
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

ok. i to je korektno jer koristis 8bitni a/d
Ljupco
Penjem se :)
Penjem se :)
Posts: 98
Joined: 06-03-2008, 13:27

Re: skraceni kurs ucenja picbasica

Post by Ljupco »

Zdravo!
Citao sam celi kurs ali nisam se prikljucio sve do sad. Molim vas treba mi pomoc!
Ovako treba mi sklop sa PIC16F84A koji ce raditi sledece:
Kad pritisnes taster pali se dioda na PORTB.0, kad pritisnes jos jednom ona se gasi i pali se na PORTB.1, ..., i tako do PORTB.7 , i kad pritisnes opet taster vrati se na DIODA na PORTB.0 i opet iz pocetka, ili sa dva tastera jedan za nagore jedan za nadole.
P.S. Znam samo sa jedan taster i jedna dioda, jer nisam radio sa tasterima.
Unapred Hvala.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

pa za to mozes iskoristiti kod za taster kada se uporedjuje novo stanje i prethodno. i ispod if stavis neki brojac npr
i=i+1
posle toga stavljas
portb=2^i
i jos jedno ispitivanje if i>8 then i=0
nadam se da si me razumeo...
Post Reply