skraceni kurs ucenja picbasica

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

Moderators: stojke369, pedja089, [eDo], trax

Post Reply
elena2610
Posts: 2
Joined: 07-05-2016, 12:53

Re: skraceni kurs ucenja picbasica

Post by elena2610 »

se izvinuvam
Attachments
proekt.jpg
proekt.jpg (15.39 KiB) Viewed 20105 times
User avatar
electron
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 225
Joined: 28-02-2009, 19:20
Location: Serbia

PIC16F648A

Post by electron »

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:

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
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
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: skraceni kurs ucenja picbasica

Post by Kukinjos »

Možda ti fali definicija oscilatora:

Code: Select all

define osc 4
?
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
electron
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 225
Joined: 28-02-2009, 19:20
Location: Serbia

Re: skraceni kurs ucenja picbasica

Post by electron »

Ima definicija oscilatora, odmah posle definicija za lcd
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1625
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: skraceni kurs ucenja picbasica

Post by WhiteHead »

Pull-upuj RS pin displeja.
Ako kaniš pobijediti, ne smiješ izgubiti
alarmi ns
Penjem se :)
Penjem se :)
Posts: 54
Joined: 29-06-2013, 20:13

Re: skraceni kurs ucenja picbasica

Post by alarmi ns »

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
'******************************************************
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

Meni deluje da bi trebalo da radi...
alarmi ns
Penjem se :)
Penjem se :)
Posts: 54
Joined: 29-06-2013, 20:13

Re: skraceni kurs ucenja picbasica

Post by alarmi ns »

Nazalost Pedja a.4 neradi, jedino ako cip nije zveknuo al neznam zasto bi, ili mu fali nesto
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

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.

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
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.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

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.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

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.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

Hvala Pedja to sa intrrupt-om ima smisla tu se uopste negubi na vremenu.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

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.

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
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

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.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

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:

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 
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

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.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

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.
User avatar
electron
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 225
Joined: 28-02-2009, 19:20
Location: Serbia

Re: skraceni kurs ucenja picbasica

Post by electron »

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
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: skraceni kurs ucenja picbasica

Post by milan-markovic »

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.
Post Reply