Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TUTORIJAL: PicBasic Pro 3 i PIC16F1827

[es] :: Elektronika :: Mikrokontroleri :: TUTORIJAL: PicBasic Pro 3 i PIC16F1827
(TOP topic, by veselinovic)
Strane: < .. 1 2 3 4 5

[ Pregleda: 54034 | Odgovora: 88 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182713.06.2013. u 09:35 - pre 131 meseci
Primer 24:
=======
U ovom primeru koristi se postavka 1.

Zbog specifičnosti FOR naredbe moguće je dodatno optimizovati program tako što ćemo umesto matematičkog izraza za krajnju vrednost (u našem slučaju "pomeraj + 7") da stavimo promenljivu koju smo izračunali neposredno pre FOR petlje.

Code:

i           var byte      ;brojač za FOR petlju
brojac      var byte      ;brojač prolazaka za jednu kombinaciju
pomeraj     var byte      ;pomeraj za LOOP
pomeraj2    var byte      ;vrednost za kraj FOR petlje
pauza       con 300       ;konstanta za pauzu


    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000                   ;interni oscilator na 4MHz
    anselb=0                           ;ceo port B digitalni
    latb=0                             ;isključimo sve LED
    trisb=0                            ;postavi ceo port B kao izlazni

    do                                 ;početak beskonačne petlje
      pomeraj=0                        ;resetujemo "pomeraj"
      do                               ;petlja za izbor početnog elementa
        brojac=0                       ;resetujemo "brojac"
        do                             ;petlja za 4 ponavljanja
          pomeraj2=pomeraj + 7         ;izračunaj vrednost za kraj FOR petlje
          for i=pomeraj to pomeraj2    ;postavi uslove za brojačku petlju
            lookup i, [1,2,4,8,16,32,64,128,_
            1,3,7,15,31,63,127,255,_
            127,191,223,239,247,251,253,254,_
            192,96,48,24,12,6,3,129], latb  ;uzmi podatak
            pause pauza                ;napravi pauzu
          next i                       ;uvećaj "i" i vrati se ako treba
          brojac=brojac + 1            ;ako ne, uvećaj "brojac"
        loop until brojac = 4          ;vrati se ako "brojac" nije 4
        pomeraj=pomeraj + 8            ;pomeri se na sledećih 8 u LOOP petlji
      loop until pomeraj=32            ;vrati se ako "pomeraj" nije 32
    loop

end


Na ovaj način uštedeli smo još 26 vorda što ukupno čini čak 96 u odnosu na primer 22 što uopšte nije malo za ovakav tip mikrokontrolera.

Dosadašnji primeri nam nisu omogućavali nikakvu kontrolu dogadjaja tj. mogućnost našeg uticaja na rad programa, a bez toga se skoro ni jedan program ne može zamisliti pa ćemo od sledećeg primera da se pozabavimo kontrolom dešavanja u toku izvršavanja programa.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182717.06.2013. u 13:55 - pre 131 meseci
Primer 25:
=======
U ovom primeru koristi se postavka 1.

Malo je programa kojima u toku rada nije potreban neki spoljni uticaj, bilo od strane korisnika ili od nekog senzora, davača i sl. U ovom primeru videćemo kako da kontrolišemo LED D1 pritiskom na taster TA1.

Code:

led1          var portb.0          ;definišemo alias za led D1
led2          var portb.1          ;definišemo alias za led D2
taster1       var porta.4          ;definišemo alias za taster TA1

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    ansela=0                       ;ceo port A digitalni
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisa=255                      ;postavi ceo port A kao ulazni
    trisb=0                        ;postavi ceo port B kao izlazni

    do                             ;početak petlje
      if taster1=1 then led1=0     ;ako taster nije pritisnit, isključi D1
      if taster1=0 then led1=1     ;ako je taster pritisnut, uključi D1
      led2=1                       ;uključi D2
    loop                           ;kraj petlje
      
end


Kao što vidimo iz šeme, taster TA1 povezan je na RA4 pa smo tako i definisali alias za njega. Program bi trebalo da je potpuno jasan jer nemamo ni jednu novu komandu, novo je podešavanje ANSELA i TRISA registara; ANSEL moramo da postavimo na 0 kako bi isključili sve analogne funkcije A porta i uključili digitalnu funkciju na svim pinovima. Medjutim, kada je u pitanju TRISA registar, ako pogledamo tabelu 3-8 u tehničkim podacima za ovaj PIC videćemo da je po uključenju stanje svih bitova tog registra postavljeno na 1, tj. njegovo stanje je 255, isto kao što smo mi postavili u programu. U principu to nismo morali, ali je ipak preporuka da to uradimo jer ako izostavimo inicijalno podešavanje verovatno ćemo posle nekog vremena, kada pogledamo ponovo program, da se pitamo koje su početne vrednosti registara koje nismo podesili pa ćemo morati da posegnemo za dokumentacijom.

Objasnićemo samo ulogu otpornika R24 koji je, kako se vidi iz šeme, jednim krajem povezan na +5V, a drugim na taster i RA4. Obzirom da su svi pinovi A porta postavljeni kao ulazi, pa i RA4, stanja na njima su nedefinisana jer oni u električnom smislu nisu nigde spojeni tj. "plivaju", a kada je ulaz odspojen, stanje na njemu može da bude 0 ili 1, ili da se stalno menja zbog faktora kao što su smetnje koje ulaze kroz napajanje, ili indukcije kroz vodove na štampanoj ploči. Zato je neophodno da na ulazu imamo stabilno logičko stanje koje se obezbedjuje otpornikom; kada je taj otpornik jednim krajem spojen na plus tada taj otpornik nazivamo PULL-UP (što znači "povući na gore"), a kada je spojen na masu nazivamo ga PULL-DOWN (u prevodu "povući na dole"). Uobičajeno je da se u ovakvim situacijama koristi pull-up otpornik, a i u samom PIC-u postoje takvi otpornici, fabrički ugradjeni, koji mogu da se uključe ili isključe, ima ih na svim pinovma B porta i samo na pinu 5 porta A, pa smo morali da dodamo spoljne na ostale pinove A porta.
Da bi se detektovala promena stanja, taster moramo da povežemo na suprotan polaritet - kada taster nije pritisnut stanje na pinu je 1, a kada je pritisnut stanje na pinu je 0 jer je taster spojen direktno na masu, a zbog otpornika je ograničena struja koja prolazi izmedju plusa i mase pa nema kratkog spoja. Vrednost otpornika može da bude od 1K pa do oko 100K u zavisnosti od upotrebljenih komponenti, a vrednost otpornika u samom PIC-u je oko 22K. Na našem razvojnom sistemu pull-up otpornici (R24, R25 i R26)imaju vrednost od 4,7K.

Da se na kratko vratimo programu. Prva IF naredba ispituje da li je vrednost na pinu RA4 jednako 1, i ako jeste onda isključuje LED1, a druga radi obrnuto. Kroz prethodno objašenjenje videli smo da će na RA4 da bude logičko 1 kada taster nije pritisnut, a 0 kada je taster pritisnut.
Naredba kojom uključujemo LED2 je tu radi kontrole i uporedjenja sa sledećim primerom i vidimo da je LED2 stalno uključena.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182720.06.2013. u 13:39 - pre 131 meseci
Primer 26:
=======
U ovom primeru koristi se postavka 1.

Ovaj program radi istu stvar kao i prethodni samo na malo drugačiji način.

Code:

led1          var portb.0          ;definišemo alias za led D1
led2          var portb.1          ;definišemo alias za led D2
taster1       var porta.4          ;definišemo alias za taster TA1

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    ansela=0                       ;ceo port A digitalni
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisa=255                      ;postavi ceo port A kao ulazni
    trisb=0                        ;postavi ceo port B kao izlazni

    do                             ;početak glavne petlje
      do while taster1=1           ;vrti se u petlji sve dok je TA1 otpušten
        led1=0                     ;isključi LED D1
      loop                         ;kraj petlje

      do while taster1=0           ;vrti se u petlji sve dok je TA1 pritisnut
        led1=1                     ;uključi LED D1
      loop                         ;kraj petlje
      led2=1                       ;uključi LED D2
    loop                           ;kraj petlje
      
end    


Umesto IF naredbi koje ispituju stanje tastera postavili smo DO ... LOOP petlje za svako od stanja tastera. Bitno je da uočite da se LED2 uključuje tek nakon što se taster pritisne i otpusti, a to je zato što se program prvo vrti u prvoj petlji sve dok je taster otpušten, pa kad se pritisne prelazi u drugu petlju i ostaje u njoj sve dok je taster pritisnut i tek nakon otpuštanja izlazi iz petlje i stiže do naredbe kojom se uključuje LED2.

Namera je bila da se ovim primerom prikaže da jedan jednostavan problem može da se reši na više načina, ali i da je potrebno odabrati pravi način u zavisnosti od potreba. U ovom primeru program se praktično zaustavlja od daljeg izvršavanja sve dok se ne ispune odredjeni uslovi dok se u prethodnom samo na momenat ispita stanje tastera i program nastavlja dalje. Zato treba paziti na izbor načina da se ne upadne u zamku ovog tipa.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182701.07.2013. u 08:15 - pre 130 meseci
Primer 27:
=======
U ovom primeru koristi se postavka 1.

Pritiskom na taster TA1 uključujemo LED D1, a pritiskom na TA2 je isključujemo.

Code:

led1          var portb.0          ;definišemo alias za led D1
led2          var portb.1          ;definišemo alias za led D2
taster1       var porta.4          ;definišemo alias za taster TA1
taster2       var porta.5          ;definišemo alias za taster TA2

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    ansela=0                       ;ceo port A digitalni
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisa=255                      ;postavi ceo port A kao ulazni
    trisb=0                        ;postavi ceo port B kao izlazni
    wpua=%00100000                 ;uključi PULL-UP na RA5
    option_reg=%01111111           ;uključi globalno PULL-UP otpornike

    do                             ;početak petlje
      if taster1=0 then led1=1     ;ako je TA1 pritisnut, uključi D1
      if taster2=0 then led1=0     ;ako je TA2 pritisnut, isključi D1
    loop                           ;kraj petlje
      
end


Na šemi razvojnog sistema vidi se da za taster TA1 postoji pull-up otpornik, dok za TA2 ne postoji, a ovaj program ipak radi kako treba. To je zato što, kao što smo napomenuli u tekstu uz primer 25, su u sam PIC ugradjeni pull-up otpornici vrednosti od oko 22 Koma; B port ih ima na svim pinovima, dok na portu A postoji samo jedan i to na RA5, a taster TA2 je upravo povezan na taj pin.

Da bi aktivirali te otpornike potrebno je da ih uključimo podešavanjem odgovarajućih SFR registara, a to su WPUA za otpornik na portu A, i WPUB za otpornike na portu B, koji omogućavaju da kontrolišemo svaki otpornik pojedinačno - kada je bit setovan, odgovarajući otpornik je uključen i to je podrazumevano stanje nakon uključenja PIC-a. Detalje za ove registre možete da vidite u tehničkoj dokumentaciji na stranama 121 i 127 respektivno.

Medjutim, postoji još jedan bit koji globalno omogućava uključenje ovih otpornika, a to je bit 7 registra OPTION koji se u tehničkim podacima pojavljuje još i pod imenom OPTION_REG (radi se o istom registru) i to drugo ime se koristi u PBP-u. Kada je taj bit setovan, svi otpornici su isključeni i to je podrazumevano stanje po uključenju. Ostali bitovi ovog registra nam za sada nisu potrebni, a ako želite da saznate više o njemu, pročitajte detalje na strani 175. Ova dupla kontrola može da Vam se učini besmislenom, ali je zgodno u nekim situacijama da promenom samo jednog bita isključite sve pull-up otpornike.

Medjutim, čak i kada su svi registri podešeni za uključenje pull-up otpornika, oni će biti automatski isključeni za svaki pin portova koji je podešen kao izlazni.

Vidimo da smo u inicijalnom bloku programa dodali podešavanje WPUA i OPTION_REG registra kako bi uključili pull-up na RA5 pri čemu registar WPUA nismo morali da podešavamo jer smo rekli da je po uključenju ionako setovan odgovarajući (u ovom slučaju i jedini) bit. Ali, i to smo već rekli, dobra je praksa podesiti sve registre koje koristimo kako bi tačno znali njihova stanja.

Ostali deo programa bi trebalo da Vam je jasan i nisu potrebna dodatna objašnjenja.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182724.07.2013. u 00:13 - pre 130 meseci
Primer 28:
=======
U ovom primeru koristi se postavka 1.

Pretpostavimo da nam treba uredjaj kojim ćemo, na primer, da brojimo vozila koja prodju nekom ulicom i za to upotrebimo sistem kod koga se pritiskom na taster brojač vozila uveća za 1 pri svakom pritisku. Obzirom da još nismo radili sa displejima, upotrebićemo LATB registar kao brojač jer imamo ujedno i vizuelnu indikaciju na LE diodama, doduše u binarnom obliku, ali tu lekciju smo odavno naučili i nije nam problem da ga pretvorimo u dekadni.

Code:

taster1       var porta.4          ;definišemo alias za taster TA1
taster2       var porta.5          ;definišemo alias za taster TA2

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    ansela=0                       ;ceo port A digitalni
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisa=255                      ;postavi ceo port A kao ulazni
    trisb=0                        ;postavi ceo port B kao izlazni
    wpua=%00100000                 ;uključi PULL-UP na RA5
    option_reg=%01111111           ;uključi globalno PULL-UP otpornike

    do                             ;početak petlje
      if taster1=0 then            ;ako je TA1 pritisnut,
        latb=latb + 1              ;uvećaj stanje LATB za 1
      endif
      if taster2=0 then latb=0     ;ako je TA2 pritisnut, isključi sve LED
    loop                           ;kraj petlje
      
end


Medjutim, umesto da se pri svakom pritisku na TA1 binarna kombinacija na LE diodama promeni za 1, primećujemo da svetle sve LED dok držimo pritisnut taster TA1, a kada ga otpustimo na LED ostane neka proizvoljna kombinacija koja ne predstavlja broj uvećan za 1. Gde smo pogrešili?

Ovo je klasičan početnički problem i zato ukazujemo na njega kroz primer koji ne radi ono što smo zamislili. Hajde da analiziramo program, deo izmedju DO i LOOP.

Prva IF naredba ispituje da li je pritisnut taster TA1, i ako jeste uveća se registar LATB za 1. Nakon toga se u drugoj IF naredbi ispituje da li je pritisnut taster 2, i ako jeste resetuje se LATB, a zatim se program vraća na prvu IF naredbu. I gde je tu problem? Obe IF naredbe se izvrše za svega par mikrosekundi, tačno vreme zavisi od toga da li je neki taster pritisnut, ali je to vreme svakako kratko, reda 10-ak us. Ako držimo pritisnut TA1 vidimo (iz asmeblerskog programa) da se na svakih 11 mikrosekundi LATB uveća za 1 što praktično znači da se za pritisak od jedne sekunde LATB uveća za neverovatnih 90909 ! Obzirom da je broj njegovih kombinacija 256, vidimo da se za to vreme sve kombinacije "provrte" čak 355 puta, a ako se uzme u obzir da oko može da vidi do 25 promena u sekundi, jasno nam je zašto nam se čini da su sve LED upaljenje dok držimo taster TA1 pritisnut.

Rešenje ovog problema je da uvećamo LATB u trenutku kada prvi put detektujemo pritisak na taster, a da zanemarimo njegovo stanje sve dok ga ne otpustimo i ponovo pritisnemo. Kako da to uradimo, videćemo u nekoliko narednih primera.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182725.07.2013. u 20:05 - pre 129 meseci
Primer 29:
=======
U ovom primeru koristi se postavka 1.

Problem iz prošlog primera može da se reši na ovaj način:

Code:

taster1       var porta.4          ;definišemo alias za taster TA1
taster2       var porta.5          ;definišemo alias za taster TA2

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    ansela=0                       ;ceo port A digitalni
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisa=255                      ;postavi ceo port A kao ulazni
    trisb=0                        ;postavi ceo port B kao izlazni
    wpua=%00100000                 ;uključi PULL-UP na RA5
    option_reg=%01111111           ;uključi globalno PULL-UP otpornike

    do                             ;početak petlje
cekaj0:
      if taster2=0 then latb=0     ;ako je TA2 pritisnut, isključi sve LED
      if taster1=1 then cekaj0     ;ako TA1 nije pritisnut idi na labelu 'cekaj0'
      latb=latb + 1                ;uvećaj stanje LATB za 1
cekaj1:
      if taster1=0 then cekaj1     ;ako je TA1 još uvek pritisnut, idi na labelu 'cekaj1'
    loop                           ;kraj petlje
      
end


Analiziraćemo opet deo programa izmedju DO i LOOP.

Prvi IF proverava da li je pritisnut taster TA2 i ako jeste, resetuje LATB registar.
Drugi IF proverava da li je taster TA1 otpušten i ako jeste, vraća se na labelu 'cekaj0'. Ako je TA1 pritisnut, uvećava se LATB za 1, a zatim se sa sledećom IF naredbom proverava da li je taster još uvek pritisnut. Ako jeste, vraća se na labelu 'cekaj1', odnosno na isti IF, tj. ova IF naredba ne dozvoljava da se LATB ponovo uveća sve dok se TA1 ne otpusti kako nebismo imali lažna brojanja kao u prethodnom primeru i time smo rešili problem pogrešnog brojanja. Medjutim, napravili smo sebi novi problem jer se, sve dok je TA1 pritisnut, program vrti u petlji od jedne IF naredbe i dalji napredak je nemoguć, program je praktično "prikovan" na jednom mestu, što nam nikako ne odgovara, sem u nekom krajnje jednostavnom programu.

Ali, ovde se javlja još jedan problem - ako ste probali program videli ste da se vrlo često jednim pritiskom na taster stanje LATB registra uveća za više od jedan tj. registruje se veći broj pritisaka nego što ih je zaista bilo. Ovaj problem ne potiče od programa već od tastera, tj. od jedne osobine njegovih kontakata koja se zove poskakivanje, odn. "bouncing" na engleskom. O ovom problemu i kako ga rešiti biće reči u sledećoj lekciji.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182729.07.2013. u 09:09 - pre 129 meseci
Poskakivanje kontakata
=================
Kod svih mehaničkih prekidačkih elemenata (prekidači, tasteri, releji, mikroprekidači, sklopke) zbog same konstrukcije i činjenice da su kontakti od metala te da imaju odredjenu masu i elastičnost, dešava se da se u momentu spajanja ili odspajanja kontakata ne ostvari odmah spoj već da kontakti neko vreme poskakuju i time ostvaruju nekoliko otvaranja i zatvaranja strujnog kruga.

Vreme i broj poskakivanja zavisi od nekoliko faktora kao što su konstrukcija, brzina pomeranja kontakta i jačina pritiska, zaprljanost kontakata i sl. Čak i kad su faktori isti, vreme i broj poskakivanja će biti različiti. Kod kvalitetnijih elemenata broj poskakivanja može da bude jednocifren (pa čak i da ga nema), a vreme smirivanja može da se kreće od par mikrosekundi (ponekad i ispod jedne mikrosekunde) pa sve do reda 1 ms, dok kod lošijih to zna da potraje i preko 150 ms. Takodje je sasvim uobičajeno da nije isto vreme smirivanja kod otvaranja i kod zatvaranja kontakta jednog istog prekidačkog elementa i ono može znatno da se razlikuje.

Na sledeće 2 slike vidi se poskakivanje kod zatvaranja i kod otvaranja kontakata.





Ako se ovi prekidački elementi koriste za uključenje sijalica, motora, grejnih tela i sličnih tromih sistema, ovo poskakivanje ne igra nikakvu ulogu i ne remeti normalan rad tih uredjaja. Ali ako te elemente priključimo na neki mikrokontroler ili elektronsko kolo koje je dovoljno brzo da to poskakivanje registruje kao više uzastopnih zatvaranja i otvaranja , onda imamo problem koji moramo da rešimo, inače ćemo da imamo, kao što smo videli u prethodnom primeru, netačne podatke.

Eliminacija poskakivanja ("debouncing" na engleskom) može da se uradi hardverski i softverski i svaki način ima nekoliko tipičnih rešenja. Najčešća hardverska rešenja su RC filter i filter sa RS flip-flopom. Sledeće dve slike predstavljaju ta dva rešenja s tim da druga varijanta može da se koristi samo ako imamo element sa otvorenim i zatvorenim kontaktom.





Medjutim, mi ćemo ovde da se bavimo softverskim rešenjima jer baratamo jednim moćnim "oružjem" koje je u stanju da radi brzo i softverski sve to postigne čime se ostvaruje ušteda u prostoru i materijalu što može da bude ekonomski veoma korisno.

Zbog samog načina izrade tasteri koji se koriste na našem razvojom sistemu imaju veoma mali broj poskakivanja (tipično od 1 do 5) i vreme smirivanja koje je najčešće ispod 1 ms što je odlično vreme, ali ako uzmemo u obzir da jedna mašinska instrukcija u našim primerima traje svega jednu mikrosekundu, svesni smo, kao što se pokazalo u prethodnom primeru, da imamo problem koji ne možemo da zanemarimo.

Postoji veliki broj softverskih rešenja koja se primenjuju u praksi jer ni jedno rešenje nije univerzalno, svako ima dobre i loše strane, a koje će biti upotrebljeno zavisi od konkretne potrebe u uredjaju. Pozabavićemo se nekima od njih.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
Prikačeni fajlovi
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182719.08.2013. u 09:38 - pre 129 meseci
U ovom primeru koristi se postavka 1.

Najjednostavniji način rešavanja problema poskakivanja kontakata dat je u ovom primeru:

Code:

taster1       var porta.4          ;definišemo alias za taster TA1
taster2       var porta.5          ;definišemo alias za taster TA2

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    ansela=0                       ;ceo port A digitalni
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisa=255                      ;postavi ceo port A kao ulazni
    trisb=0                        ;postavi ceo port B kao izlazni
    wpua=%00100000                 ;uključi PULL-UP na RA5
    option_reg=%01111111           ;uključi globalno PULL-UP otpornike

    do                             ;početak petlje
cekaj0:
      if taster2=0 then latb=0     ;ako je TA2 pritisnut, isključi sve LED
      if taster1=1 then cekaj0     ;ako TA1 nije pritisnut idi na labelu 'cekaj0'
      pause 20                     ;sačekaj 20 ms
      if taster1=1 then cekaj0     ;ako TA1 nije pritisnut idi na labelu 'cekaj0'
      latb=latb + 1                ;uvećaj stanje LATB za 1
cekaj1:
      if taster1=0 then cekaj1     ;ako je TA1 još uvek pritisnut, idi na labelu 'cekaj1'
      pause 20                     ;sačekaj 20 ms
      if taster1=0 then cekaj1     ;ako je TA1 još uvek pritisnut, idi na labelu 'cekaj1'
    loop                           ;kraj petlje
      
end


Ovo rešenje nije baš najbolje, ali ga početnici često koriste jer se lako implementira i za njih je lako razumljivo. Iako nije savršeno, ovo rešenje je uglavnom zadovoljavajuće u nekim situacijama, mada u uslovima povećanih smetnji može da dovede do pogrešnog očitavanja i ne preporučuje se kada je neophodna apsolutna sigurnost.

Kako radi ovo rešenje? Veoma jednostavno: uradi se testiranje tastera i ako je pritisnut, napravi se potrebna pauza (u našem slučaju je to 20 ms) i zatim se ponovo testira stanje tastera. Ako test kaže da je i dalje pritisnut, podrazumeva se da je taster zaista pritisnut i radi se ono što je potrebno u tom slučaju.

U našem primeru provera sa pauzom se vrši i prilikom pritiskanja i prilikom otpuštanja tastera što je najispravnije, ali je u većini slučajeva dovoljno samo pri pritiskanju. Upišite ovaj program u PIC i proverite ima li sada lažnog brojanja.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182708.09.2013. u 05:26 - pre 128 meseci
Prethodni primer ima nekoliko mana od kojih je prva koju pominjemo veoma ozbiljna. Ista je kao i ona koju smo imali u prethodna dva primera, a to je da program ne može da napreduje dalje dok se ne pritisne taster što bi značilo da sav ostali kod mora da dodje ispred testiranja tastera što u praksi nije uopšte praktično, a često je i nemoguće napraviti neki kompleksniji program na taj način.

Druga mana rešenja u prošlom primeru je što se pravi pauza od 20 ms pri svakoj proveri tastera i za to vreme program jednostavno čeka, gubi ponekad dragoceno vreme, i ne može da radi ništa drugo. Ako malo razmislimo, videćemo da je potpuno nepotrebno čekanje ako taster nije pritisnut jer u tom slučaju nema poskakivana kontakata i ne treba čekati na njihovo smirivanje. Zbog toga ćemo da proverimo da li je taster pritisnut i tek tada pravimo pauzu.

Medjutim, tu dolazi do izražaja treća mana, a to je upravo pauza koja se pravi čim se detektuje da je taster pritisnut. U realnim uslovima vrlo je moguće da je neka smetnja, koja je na neki način ušla u sistem, prouzrokovala lažnu detekciju i program će krenuti u čekanje. Smetnje su uglavnom veoma kratke, mnogo kraće od tih 20 ms, i nakon pauze neće biti detektovan pritisak tastera pa smo opet uzalud izgubili to vreme koje početnicima može da izgleda smešno malo, ali u realnosti nam ponekad to mnogo znači.

Sve te probleme rešićemo primerom koji sledi.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: TUTORIJAL: PicBasic Pro 3 i PIC16F1827
(TOP topic, by veselinovic)
Strane: < .. 1 2 3 4 5

[ Pregleda: 54034 | Odgovora: 88 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.