skraceni kurs ucenja picbasica
Moderators: pedja089, stojke369, [eDo], trax
Re: skraceni kurs ucenja picbasica
se izvinuvam
- Attachments
-
- proekt.jpg (15.39 KiB) Viewed 21507 times
PIC16F648A
U pitanju je PIC16F648A :
https://s32.postimg.cc/atwbhrvpx/Clip.jpg
https://s32.postimg.cc/qgnkv59hx/Clip_2.jpg
Nikako nece da mi radi LCD displej, evo kratkog koda, koristio bih interni oscilator 4MHz,nece ni ovo da mi radi:
RA0-Taster UP
RA1-Relej3
RA2-DS18b20
RA3-Taster DOWN
RA4-DS18B20
RA6- LCD(Enable)
RA7-LCD(RS)
RB0-DS18B20
RB1-Relej1
RB2-Relej2
RB3-Taster MODE
LCD se nalazi na portu RB4-RB7
https://s32.postimg.cc/atwbhrvpx/Clip.jpg
https://s32.postimg.cc/qgnkv59hx/Clip_2.jpg
Nikako nece da mi radi LCD displej, evo kratkog koda, koristio bih interni oscilator 4MHz,nece ni ovo da mi radi:
Code: Select all
#CONFIG
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF
#ENDCONFIG
clear
OPTION_REG.7 = 1 'Weak pull-ups enabled
DEFINE LCD_DREG PORTB ' I/O port where LCD is connected
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 7 ' Register select pin RA4
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 6 ' Enable pin RA2
DEFINE LCD_BITS 4 ' 4-bit data bus
DEFINE LCD_LINES 2 ' LCD has 2 character lines
DEFINE OSC 4
DEFINE BUTTON_PAUSE 100
'*****************************************************************************
'Pinout for EasyPic5
Heat Var PORTA.1 ' Relej
DQ Var PORTA.2 ' One-wire data pin
DQ1 Var PORTA.4 ' One-wire data pin
Mode_B Var PORTB.3 'Taster Mode
UP_B Var PORTA.0 'Taster UP
DOWN_B Var PORTA.3 'Taster Down
'*****************************************************************************
'Configs EasyPic5
'*****************************************************************************
TRISA=%00011101 ' 1-input
TRISB=%00001000 ' 0-output
'*****************************************************************************
CMCON = 7 ' Set PORTA to digital
Pause 100 ' Wait for LCD to start up
mainloop:
Lcdout $fe, 1 ' Clear screen
Pause 500 ' Wait .5 second
Lcdout "Hello" ' Display "Hello"
Pause 500 ' Wait .5 second
Lcdout $fe, $c0, "World" ' Move to line 2 and display "World"
Pause 500 ' Wait .5 second
Goto mainloop ' Do it forever
RA1-Relej3
RA2-DS18b20
RA3-Taster DOWN
RA4-DS18B20
RA6- LCD(Enable)
RA7-LCD(RS)
RB0-DS18B20
RB1-Relej1
RB2-Relej2
RB3-Taster MODE
LCD se nalazi na portu RB4-RB7
Re: skraceni kurs ucenja picbasica
Možda ti fali definicija oscilatora:
?
Code: Select all
define osc 4
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Re: skraceni kurs ucenja picbasica
Ima definicija oscilatora, odmah posle definicija za lcd
Re: skraceni kurs ucenja picbasica
Pull-upuj RS pin displeja.
Ako kaniš pobijediti, ne smiješ izgubiti
Re: skraceni kurs ucenja picbasica
Pozdrav svima dali mi neko moxze pomoci kako na picu 16f688 port a.4 da nateram da radi kao taster. na pini je pool-up otpornik 4k7 ka vcc a taster okidda na 0. Cip uopste nereaguje na stiskanje tog tastera,svi ostali rade evo deo koda gde sa =m testirao tastere kad sam video da me zezaju
Code: Select all
'---------------------------OSIGURACI---------------------------
' 16F688
#CONFIG
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CPD_OFF & _CP_OFF & _BOREN_OFF
#ENDCONFIG
DEFINE OSC 8
'-------------------------- PODESAVANJA ------------------------
OSCCON = %01110000 ' INT_OSC_8MHZ
OPTION_REG = %01000000 ' PULL UP ENABLE, KAD JE BIT 7 = 0 !!!!
WPUA = %00110000 ' WEAK PULLUP NA PORTOVIMA A5 I A4
CMCON0 = %00000111 ' disable comparator
ANSEL = 0
DEFINE PULSIN_MAX 6000 'Maximum counts allowed before pulsin times out
TRISA = %110000
TRISC = %111000
symbol rele = porta.1
output rele
symbol izlaz = porta.2
output izlaz
symbol led = portc.0
output led
led = 0
'**********TASTERI**********************
symbol reset = porta.4
input reset
symbol taster1 = porta.5
input taster1
symbol test = portc.4
input test
symbol taster2 = portc.5
input taster2
symbol taster3 = portc.3 'taster5
input taster3
symbol taster4 = portc.1
input taster4
'**********************************************************
'TEST TASTERA OBRISI
DO
IF reset=0 THEN 'OVDE GRESIIIIIIIIII
LED = 1
PAUSE 1000
LED = 0 ' RESET JE PORT A.4
PAUSE 1000
ENDIF
LOOP
'******************************************************
Re: skraceni kurs ucenja picbasica
Meni deluje da bi trebalo da radi...
Re: skraceni kurs ucenja picbasica
Nazalost Pedja a.4 neradi, jedino ako cip nije zveknuo al neznam zasto bi, ili mu fali nesto
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Zdravo dugari hteo bih da cujem vase predloge uvezi koriscenje tastera i eliminisanje treperenje kontakata (Debounce).
Ovaj kod resava treperenje kontakata ali nije najbolje resenje.
Ovaj primer ima nekoliko mana a to je da program ne može da napreduje dalje dok se ne pritisne taster i vrlo je tesko napraviti neki kompleksniji program na ovaj način.
Druga mana je što se pravi pauza od 20 ms pri svakoj proveri tastera i za to vreme program jednostavno čeka, gubi dragoceno vreme, i ne može da radi ništa drugo.
Ovde dolazi do izražaja treća mana, a to je upravo pauza koja se pravi čim se detektuje da je taster pritisnut.
U slucaju da nam neka smetnja napravi laznu detekciju pritisnutog tastera program će krenuti u čekanje. Posto su smetnje ceso kratke i nakon pauze neće biti detektovan pritisak tastera tada smo bespotrebno izgubili vreme koje namm je mozda znacilo.
E sad mene interesuje koji su drugi nacini da se ove navedene mane prevazidju da bi program bio ekonomicniji i da moze raditi druge stvari a ne da gubi dragoceno vreme.
Pozz.
Ovaj kod resava treperenje kontakata ali nije najbolje resenje.
Code: Select all
taster1 var porta.4 ;definišemo alias za taster TA1
taster2 var porta.5 ;definišemo alias za taster TA2
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
Druga mana je što se pravi pauza od 20 ms pri svakoj proveri tastera i za to vreme program jednostavno čeka, gubi dragoceno vreme, i ne može da radi ništa drugo.
Ovde dolazi do izražaja treća mana, a to je upravo pauza koja se pravi čim se detektuje da je taster pritisnut.
U slucaju da nam neka smetnja napravi laznu detekciju pritisnutog tastera program će krenuti u čekanje. Posto su smetnje ceso kratke i nakon pauze neće biti detektovan pritisak tastera tada smo bespotrebno izgubili vreme koje namm je mozda znacilo.
E sad mene interesuje koji su drugi nacini da se ove navedene mane prevazidju da bi program bio ekonomicniji i da moze raditi druge stvari a ne da gubi dragoceno vreme.
Pozz.
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Znam da moze da se resi hardversi ali mene interesuje softversi kojim se najcesce primerom programeri sluze da bih to primenio i ja sada odmah na pocetku kada jos uvek savladavam programiranje.
Vidjao sam na puno uredjaja da postoji opcija kada se drzi taster uvecava se neki parametar a ukoliko se duze zadrzi taster onda krene brze da se uvecava.
Vidjao sam na puno uredjaja da postoji opcija kada se drzi taster uvecava se neki parametar a ukoliko se duze zadrzi taster onda krene brze da se uvecava.
Re: skraceni kurs ucenja picbasica
Ja koristim hardverski. A to sto si napisao sada svako implementira na neki svoj nacin.
Recimo generisi interapt svakih x ms, i u interaptu proveravaj stanje tastera, ako se nije promenilo zadnjih X puta promeni stanje neke promenljive, ako se zadrzalo jos y puta povecaj neku promenljivu koja ce da ubrza.
Recimo generisi interapt svakih x ms, i u interaptu proveravaj stanje tastera, ako se nije promenilo zadnjih X puta promeni stanje neke promenljive, ako se zadrzalo jos y puta povecaj neku promenljivu koja ce da ubrza.
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Hvala Pedja to sa intrrupt-om ima smisla tu se uopste negubi na vremenu.
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Kako nisam mogao nigde naci primer kako resiti debounce tastera na nacin koji je ekonomicniji juce sam seo i napisao algoritam po nekoj svojoj logici.
Moja zamisao je bila da ukoliko dodje do lazne detekcije ne gubim to vreme uzaludno. To sam resio tako sto ispitujem taster na svakih 1ms i to je vereme koje se moze izgubi prilikom lazne detekcije sto je puno manje od 10ms.
Zatim sam odradio podprogram tastera u kom imam prvih 6 prolaza sporije promene vrednosti nekog parametra a zatim krece brze sve dok se drzi taster nakon otpustanje tastera sledecim pritiskom krece ponovo sporije.
Prilazem taj deo koda cisto da cujem misljenje jos nekog da li je ovo ispravan nacin kada radimo sa tasterima a moze da posluzi jos nekom kao primer.
Moja zamisao je bila da ukoliko dodje do lazne detekcije ne gubim to vreme uzaludno. To sam resio tako sto ispitujem taster na svakih 1ms i to je vereme koje se moze izgubi prilikom lazne detekcije sto je puno manje od 10ms.
Zatim sam odradio podprogram tastera u kom imam prvih 6 prolaza sporije promene vrednosti nekog parametra a zatim krece brze sve dok se drzi taster nakon otpustanje tastera sledecim pritiskom krece ponovo sporije.
Prilazem taj deo koda cisto da cujem misljenje jos nekog da li je ovo ispravan nacin kada radimo sa tasterima a moze da posluzi jos nekom kao primer.
Code: Select all
Pocetak:
gosub LCD
;skeniranje tastera T1
;-----------------------------------------------
If T1 = 0 then
For CountByte = 0 to 9
Pause 1
If T1 = 1 then
Goto pocetak
endif
Next CountByte
gosub Uvecaj ; podprogram obrada tastera
B0 = 0
endif
; skeniranje tastera T2
;------------------------------------------------
If T2 = 0 then
For CountByte = 0 to 9
Pause 1
If T2 = 1 then
Goto pocetak
endif
Next CountByte
gosub Umanji ; podprogram obrade tastera
B0 = 0
endif
pause 50
goto Pocetak
;----------------------------------------------------------
Uvecaj:
Count = Count + 1
If Count >= 100 then
Count = 100
endif
gosub LCD
if B0 <= 5 then
B0 = B0 + 1
pause 900
Endif
Pause 100
if T1 = 0 then uvecaj
return
;------------------------------------------------------------
Umanji:
Count = Count - 1
if Count = 255 then
Count = 0
endif
gosub LCD
if B0 <= 5 then
B0 = B0 + 1
pause 900
Endif
Pause 100
if T2 = 0 then Umanji
return
Re: skraceni kurs ucenja picbasica
Ne znam koju verziju PBP-a koristis, ali count je rezervisana rec, i sluzi za brojanje impulsa na pinu. Tako da bi to trebao definitivno izmeniti.
U programu ti je lose jer imas 1 promenljivu B0, pa ako se drza 2 tastera onda ce ti se prvi usporiti kada dodas drugi. U ovom slucaj kad je jedna promenljiva nije problem, ali ja bi dodao kad se drze ta 2 tastera da uopste ne ide u podprograme.
U programu ti je lose jer imas 1 promenljivu B0, pa ako se drza 2 tastera onda ce ti se prvi usporiti kada dodas drugi. U ovom slucaj kad je jedna promenljiva nije problem, ali ja bi dodao kad se drze ta 2 tastera da uopste ne ide u podprograme.
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Pedja hvala na javljanju slazem se da nemoze promenljiva biti count mora drugacije da se nazove to sam i ja primetio jer je kompajler prijavio gresku koristim PBP 3.0.9 .
Za ovo ostalo se neslazem da je potrebno imati vise promenljivih dovoljno je samo B0 i CountByte a evo i zasto:
kada se stisne neki od tastera ili oba odjednom program kada naidje i detektuje neki od njih da je stisnut ostaje u petlji da uvecava countByte dok se ne ispuni uslov za skok na podprogram obradu tastera.
Kada ode u podprogram tu ostaje sve dok se drzi taster vrti se u petlji i uvecava promenljivu koju smo tamo naveli i B0 se uvecava samo do 5 zatim se preskace i tu smo ubrzali uvecavanje ostale promenljive u ovom primeru recimo Brojac koju smo izmenili u odnosu na prethodni kod za to vreme glavi program stoji.
Prvom prilikom kada otpustimo taster procesor se vraca u glavni program na liniju B0 =0 jer je tu stao kada je otisao na izvrsenje podprograma i tu lokacuju je upisao na stek naredbom Gosub tek tada se detektuje sledeci taster da je stisnut i onda se istim redosledom sve ponavlja kao u prethodnom slucaju.
Ovako mozemo imati vise tastera a samo jednu promenljivu B0 nadam se da sam bio jasam a upravo sam i isprobao to na razvojnom sistemu radi kako je opisano.
Ispravljen kod:
Za ovo ostalo se neslazem da je potrebno imati vise promenljivih dovoljno je samo B0 i CountByte a evo i zasto:
kada se stisne neki od tastera ili oba odjednom program kada naidje i detektuje neki od njih da je stisnut ostaje u petlji da uvecava countByte dok se ne ispuni uslov za skok na podprogram obradu tastera.
Kada ode u podprogram tu ostaje sve dok se drzi taster vrti se u petlji i uvecava promenljivu koju smo tamo naveli i B0 se uvecava samo do 5 zatim se preskace i tu smo ubrzali uvecavanje ostale promenljive u ovom primeru recimo Brojac koju smo izmenili u odnosu na prethodni kod za to vreme glavi program stoji.
Prvom prilikom kada otpustimo taster procesor se vraca u glavni program na liniju B0 =0 jer je tu stao kada je otisao na izvrsenje podprograma i tu lokacuju je upisao na stek naredbom Gosub tek tada se detektuje sledeci taster da je stisnut i onda se istim redosledom sve ponavlja kao u prethodnom slucaju.
Ovako mozemo imati vise tastera a samo jednu promenljivu B0 nadam se da sam bio jasam a upravo sam i isprobao to na razvojnom sistemu radi kako je opisano.
Ispravljen kod:
Code: Select all
Brojac var byte
CountByte var byte
B0 var byte
Brojac = 0
B0 = 0
Pocetak:
gosub LCD
;skeniranje tastera T1
;-----------------------------------------------
If T1 = 0 then
For CountByte = 0 to 9
Pause 1
If T1 = 1 then
Goto pocetak
endif
Next CountByte
gosub Uvecaj ; podprogram obrada tastera
B0 = 0
endif
; skeniranje tastera T2
;------------------------------------------------
If T2 = 0 then
For CountByte = 0 to 9
Pause 1
If T2 = 1 then
Goto pocetak
endif
Next CountByte
gosub Umanji ; podprogram obrade tastera
B0 = 0
endif
pause 50
goto Pocetak
;----------------------------------------------------------
Uvecaj:
Brojac = Brojac + 1
If Brojac >= 100 then
Brojac = 100
endif
gosub LCD
if B0 <= 5 then
B0 = B0 + 1
pause 900
Endif
Pause 100
if T1 = 0 then Uvecaj
return
;------------------------------------------------------------
Umanji:
Brojac = Brojac - 1
if Brojac = 255 then
Brojac = 0
endif
gosub LCD
if B0 <= 5 then
B0 = B0 + 1
pause 900
Endif
Pause 100
if T2 = 0 then Umanji
return
Re: skraceni kurs ucenja picbasica
Taj deo sam prevideo. Ja obicno izbegavam da bilo koji podprogram blokira izvrsenje glavnog programa.
Ali ti si to resio sa dodavanjem LCD prikaza u svakom pod programu.
Ali ti si to resio sa dodavanjem LCD prikaza u svakom pod programu.
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Svaki odlazak u podprogram blokira izvrsenje glavnog programa to je neizbezno e sad sve zavisi sta se radi u podprogramima i koliko se zadrzavamo.
U ovom slusaju imacemo istu zadrsku iako bi ovo sve stavili u glavi program osim ako pauze zamenimo nekim tajmerom onda je druga stvar.
Mislim da u vecini slucajeva prilikom unosnje nekih parametra tasterima nije ni bitno da ostatak programa mora da radi interapt u svakom trenutku nam radi ukoliko koristimo asemblerski jer ON interupt koji ima PBP neradi kako treba zato njega i ne koristim.
Pozz.
U ovom slusaju imacemo istu zadrsku iako bi ovo sve stavili u glavi program osim ako pauze zamenimo nekim tajmerom onda je druga stvar.
Mislim da u vecini slucajeva prilikom unosnje nekih parametra tasterima nije ni bitno da ostatak programa mora da radi interapt u svakom trenutku nam radi ukoliko koristimo asemblerski jer ON interupt koji ima PBP neradi kako treba zato njega i ne koristim.
Pozz.
Re: skraceni kurs ucenja picbasica
U pitanju je termostat sa DS18B20 i 16F648A. Naime, prilikom svakog ukljucivanja pod napon program ode u labelu Greska2 iako nije ispunjen uslov za to if V > TargetTemp1 then Greska2 izlaskom iz te labele i ponovnim ulaskom program se normalno ponasa te ako ispunjen uslov If V < TargetTemp - Hyst then Mainloop4 ode u Mainloop4 a ako je ispunjen if V > TargetTemp1 then Greska2 ode u Greska2. I tako svaki put kad termostat skinem sa napona i ponovo ga stavim. U cemu gresim?
Code: Select all
Mainloop3:
if UP=0 then Blokada
LcdOut $FE, $80, "Temp. dostignuta" ' Show function
Output DQ ' Make Pin Output
DQ=0 ' OneWire line Low
PauseUs 480 ' Keep down for 480 µS
Input DQ ' Make Pin Input
PauseUs 70 ' Wait 70 µS
If DQ=1 then ' No presence pulse from DS1820
goto greska4
Pause 500 ' Wait 0.5 Sec.
Goto MainLoop3 ' Check again
EndIf
'*****************************************************************************
' Temp reading
'*****************************************************************************
OWOut DQ, 1, [$CC, $44 ] ' Start temperature conversion
waitloop:
WHILE NOT DQ
WEND
OWOUT DQ, 1, [$CC, $BE ] ' Skip ROM search & read scratchpad memory
OWIN DQ, 2, [Temperature.Lowbyte, Temperature.Highbyte]' Read two bytes / end comms
Convert_Temp:
IF Temperature.15 THEN
Temperature = ~Temperature + 1
Twist = 1
ENDIF
TempC = ( Temperature & $7FF ) >> 4 ' Partie Entiere '4
Float = ((Temperature.Lowbyte & $0F ) * 25 )>> 2 ' Partie décimale 100emes
Temperature = TempC*100 + Float 'Préparation 1/100 degrés
IF Twist THEN
V= 10000 - Temperature ' 25 C=12500 0 C=10000 -10 C=9000
Twist = 0
else
V= 10000 + Temperature
EndIf
'----------------------- Upravljanje relejima ----------------------------------
Read 0, B1 ' Read TargetTemp MSB
Read 1, B2 ' Read TargetTemp LSB
TargetTemp=B1*256+B2 ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B3 ' Read Hysteresis
Hyst=10*B3 ' Calculate Hysteresis value (Default= 2.0 C.)
Read 3, B4 ' Read TargetTemp MSB
Read 4, B5 ' Read TargetTemp LSB
TargetTemp1=B4*256+B5 ' Calculate TargetTemp value (Default=20.0 C.)
If V < TargetTemp - Hyst then Mainloop4 ' Below Target temperature - Hysteresis
if V > TargetTemp1 then Greska2
DOZ=0:VE=1
'-------------------------------------------------------------------------------
GoSub SelectSign ' +/blank/- Sign
GoSub DisplayTemp ' Temperature to LCD
Goto MainLoop3 ' Do it forever
- milan-markovic
- Pocetnik na forumu
- Posts: 34
- Joined: 24-05-2014, 10:54
- Location: Aleksinac
Re: skraceni kurs ucenja picbasica
Da li si siguran da nije ispunjen uslov proveri vrednost promenljive ako imas LCD dislpej prikazi njenu vrednost i znaces da li je to problem.