Primer 6
======
U ovom primeru koristi se
postavka 1.
Postoje situacije u kojima ne treba da menjamo stanje celog porta odjednom već pojedinačne bitove kako nebismo poremetili već postavljena stanja. Recimo da treba da trepere LED D5 i D6 dok su D1 i D2 uključene, a D3, D4, D7 i D8 isključene. Taj primer bi izgledao ovako:
Code:
inic:
osccon=%01101000 ;interni oscilator na 4MHz
anselb=0 ;ceo port B digitalni
trisb=%00000000 ;svi bitovi B porta izlazni
portb=%00000011 ;postavi početno stanje na port B, tj. uključi D1 i D2
pocetak:
portb.4=1 ;uključi LED povezanu na pin 4 porta B (D5)
portb.5=1 ;uključi LED povezanu na pin 5 porta B (D6)
pause 500 ;napravi pauzu od 500 milisekundi
portb.4=0 ;isključi LED povezanu na pin 4 porta B
portb.5=0 ;isključi LED povezanu na pin 5 porta B
pause 500 ;napravi pauzu od 500 milisekundi
goto pocetak ;idi na labelu pocetak
end
Medjutim, u ovom programu se krije jedna zamka koja se, doduše, ovde neće "aktivirati", ali kada bismo umesto LED D5 imali neko kapacitivno opterećenje, mogli bismo da imamo problem, kao što sam ga ja imao u jednom uredjaju koji sam pravio. O čemu se radi?
Ako se vrše dva uzastopna postavljanja pinova jednog porta, može da dodje do nepravilnog postavljanja novog stanja jer se svaki pristup portovima vrši u 3 koraka: čitaj-izmeni-upiši (na engleskom: read-modify-write) što konkretno znači da se kod upisa novog stanja na port zapravo prvo preuzme stanje direktno sa pinova u interni registar, zatim se izmeni sadržaj tog registra i na kraju se njegovo stanje prosledi na port. Ako se na jednom od pinova nalazi neko kapacitivno opterećenje ili je pin strujno preopterećen, velike su šanse da će druga izmena porta da poništi prvu jer strujno preopterećen pin ima manji napon koji se onda tumači kao logička 0 umesto 1.
Pojasnićemo to na našem primeru: zamislimo da je na RB4 priključen kapacitivni potrošač kome je potrebno neko vreme da se napuni i stabilizuje napon, a na RB5 neki drugi potrošač. Pojašnjenje za početnike: kod priključenja napona na kapacitivno opterećenje prvo se javlja protok struje koja puni kondenzator, dok je napon na njegovim izvodima 0 volti i zatim se povećava, tako da tek nakon izvesnog vremena dostigne nivo koji može da se "protumači" kao visok logički nivo.
Pogledajmo deo ovog primera:
Code:
portb=%00000011 ;postavi početno stanje na port B, tj. uključi D1 i D2
pocetak:
portb.4=1 ;uključi LED povezanu na pin 4 porta B (D5)
portb.5=1 ;uključi LED povezanu na pin 5 porta B (D6)
Naredba "portb.4=1" treba da postavi bit 4 porta B na logičko 1, tj. na napon napajanja. Zbog principa čitaj-izmeni-upiši biće pročitano stanje sa pinova u interni registar koji će da sadrži vrednost %00000011 jer smo pre toga postavili to stanje na port B, a zatim će biti setovan četvrti bit, i to novo stanje vraćeno na port, tj. na port će biti poslato %00010011. Kod sledeće naredbe "portb.5=1", takodje će prvo da bude pročitano stanje sa pinova B porta, ali pošto je na pin 4 priključeno kapacitivno opterećenje, stanje na njemu će da bude i dalje logička nula (jer se kondenzator nije napunio) pa će umesto 00010011 biti pročitano 00000011, zatim će biti setovan peti bit i takvo stanje vraćeno na port pa će na kraju umesto 00110011 na pinovima biti 00100011. Ovo može da se prevazidje na nekoliko načina, a kako, videćemo u sledećim primerima.
[Ovu poruku je menjao rsinisa dana 15.01.2013. u 22:27 GMT+1]