Pic 16f628 pamcenje zadnjeg rada programa

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

Moderators: pedja089, stojke369, [eDo], trax

gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Pozdrav svima,da li neko može da mi pomogne oko pamćenja zadnjeg programa u kojem je pic radio,kada se pic ugasi sa napanja i posle nekog vremena opet upali da radi,da krene od onog zadnjeg programa u kojem je radio,pre nego sto je bio ugasen,tj,predpostavljam mada nisam neki stručnjak,da bi trebalo da se zadnje stanje rada upise automatski u EPROM pica,ali ja nemam ideju da li to moze da se izvede i na koji nacin.
Ja sam napravio program neki primer,sa tasterom da menja paljenje led dioda:

Code: Select all

;DEVICE 16F628

SYMBOL TASTER=PORTB.4
symbol PAUZA=95

OKRETANJELEDIODA:
IF TASTER=0 THEN GOTO BLINKANJELEDDIODA

LOW PORTB.2
HIGH PORTB.0
PAUSE PAUZA

LOW PORTB.0
HIGH PORTB.1
PAUSE PAUZA

LOW PORTB.1
HIGH PORTB.2
PAUSE PAUZA

GOTO OKRETANJELEDIODA 

BLINKANJELEDDIODA:
IF TASTER=0 THEN GOTO OKRETANJELEDIODA 
low portb.0 : low portb.1 : low portb.2
high PORTB.3
PAUSE 1000
low PORTB.3
PAUSE 1000

GOTO BLINKANJELEDDIODA
e sada da li moguce da ako je npr,pic radio u "BLINKANJELEDDIODA",pre neko sto je ugasen,da kada se ponovo upali da krene od programa "BLINKANJELEDDIODA",a ne od "OKRETANJELEDIODA"tj.od pocetaka.
Hvala svima,ako neko može da mi pomogne oko ovoga :D
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1627
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by WhiteHead »

Jedini način je da svako bitno stanje u programu upisuješ u eprom, a na početku programa uslovno grananje, međutim to će značajno usporiti program.
Ne znam možda neko ima bolje rješenje....
Ako kaniš pobijediti, ne smiješ izgubiti
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Predpostavio sam da treba zadnji program da bude uspisan u EPROM,pre gasenja pica-a,ali ja nema ideju kako :ohno: je to izvodljivo u Picbasic-u.Treba mi za neki programator sa led diodama,da se izabere program koji će da se koristi,i da on uvek počinjenje, kada se upali uredjaj.Ako neko ima neku ideju ,da probam,bilo bi super :D
User avatar
78L05
Pravo sam se raspisao :)
Pravo sam se raspisao :)
Posts: 1402
Joined: 28-05-2009, 13:22
Location: Hrvatska

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by 78L05 »

Pogledaj tri osnovne naredbe za upravljenje s internim EEPROMOM: DATA, WRITE i READ.
Ako primjerice imaš 5 programa treperenja, definiraj promjenljivu tipa BYTE i u nju pohrani zadnje stanje.
Na pocetku izvodenja programa sa SELECT CASE utvrdi koji je program i neka tako nastavi.
Ovo je prilicno skraceno, ali pokusaj, ako ne bude islo pomoci cu dalje.
Ne vjeruj u čuda - računaj na njih!
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Hvala na brzom odgovoru :) ,ali iskreno neznam kako to da izvedem,pocetnik sam u programiranju,ako bi mogao neki primer pa da čisto da vidim kako se to radi,pa da probam nesto da iskombinujem.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

Pri promeni podprograma upisi u eeprom promenljivu. A pri pokretanju uradi kako su ti rekli.
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Hval pedja089,na odgovoru,evo probao sam nesto,da nebude kako samo pitam a neradim :wink: ,pa vi me ispravite ako nije dobro

Code: Select all

;DEVICE 16F628

SYMBOL TASTER=PORTB.4
symbol PAUZA=95

'PROMENJIVA
B var byte
'-------------

OKRETANJELEDIODA:
IF TASTER=0 THEN GOTO BLINKANJELEDDIODA

LOW PORTB.2
HIGH PORTB.0
PAUSE PAUZA

LOW PORTB.0
HIGH PORTB.1
PAUSE PAUZA

LOW PORTB.1
HIGH PORTB.2
PAUSE PAUZA

'UPISIVANJE U EPROM
write 5,b 
'------------------ 

GOTO OKRETANJELEDIODA 

BLINKANJELEDDIODA:
IF TASTER=0 THEN GOTO OKRETANJELEDIODA 
low portb.0 : low portb.1 : low portb.2
high PORTB.3
PAUSE 1000
low PORTB.3
PAUSE 1000

'UPISIVANJE U EPROM
write 5,b 
'------------------
GOTO BLINKANJELEDDIODA

e sad i ako je i ovo dobro,mada cisto sumnjam da sam dobro napisao,kako pomucu SECET CASE,da pozovom zadnji podprogram koji je bio pre gasenja pica?
Last edited by gagi011bg on 25-08-2012, 20:38, edited 1 time in total.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

Nevalja. Nigde ne dodeljujes vrednost promenljivoj B.
I tako usporavas program, i trosis memoriju. Ona ima samo oko 1 0000 000 upisa.
Zasto ne ovako:
IF TASTER=0 THEN
WRITE 0,1'adr 0 vrednost 1.
GOTO BLINKANJELEDDIODA
ENDIF
bla bla
IF TASTER=0 THEN
WRITE 0,2'adr 0 vrednost 2.
GOTO OKRETANJELEDIODA
ENDIF
A select case....
READ 0,Tmp
SELECT CASE Tmp
CASE 1
GOTO BLINKANJELEDDIODA
CASE 2
bla bla
ENDSELECT
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Hvala,puno, Pedja još jednom :D ,evo malo sam pokušao,nadam se da je ok,kada sam zavrsio COMPILE,programa nisam dobio gresku,za Tmp sam stavio Tmp VAR Byte,jel to ok?

Code: Select all

;DEVICE 16F628

SYMBOL TASTER=PORTB.4
symbol PAUZA=95
---------------------
Tmp var byte
---------------------
READ 0,Tmp
SELECT CASE Tmp
CASE 1
GOTO BLINKANJELEDDIODA
CASE 2
goto OKRETANJELEDIODA
END SELECT

OKRETANJELEDIODA:
'----------------------------
IF TASTER=0 THEN 
WRITE 0,1 
GOTO BLINKANJELEDDIODA
endif

'----------------------------

LOW PORTB.2
HIGH PORTB.0
PAUSE PAUZA

LOW PORTB.0
HIGH PORTB.1
PAUSE PAUZA

LOW PORTB.1
HIGH PORTB.2
PAUSE PAUZA
GOTO OKRETANJELEDIODA 

BLINKANJELEDDIODA:

'----------------------------
IF TASTER=0 THEN 
WRITE 0,2 
GOTO OKRETANJELEDIODA
endif 

'----------------------------

low portb.0 : low portb.1 : low portb.2
high PORTB.3
PAUSE 1000
low PORTB.3
PAUSE 1000
GOTO BLINKANJELEDDIODA
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

Probaj, pa javi...
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Probao sam upravo,sve radi kako treba :D :D !HVALA VAM PUNO,SVIMA,a tebi Pedja posebno! :D
Jedino ima nesto jos,ali to sam još ranije pokusao da resim,oko tastera.
Npr, ako u podprogamu imam ovaj slucaj kao sto je ovde :

Code: Select all

BLINKANJELEDDIODA:
'----------------------------
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
endif 

'----------------------------

low portb.0 : low portb.1 : low portb.2
high PORTB.3
PAUSE 1000
low PORTB.3
PAUSE 1000

GOTO BLINKANJELEDDIODA
moram da drzim taster sve dok se kompeltno ne odradi ciklus,da bi dosao red na ispitivanja stanja tastera,jednio ako baš ne pogodiš da si pritisnuo taster bas kada je ciklus pri kraju,onda je vreme kraće,za prebacivanje u drugi pod program,tako da može malo da potraje ako su napr:

high PORTB.3
PAUSE 5000
low PORTB.3
PAUSE 5000
po kao u ovom primeru 5 sec,izmedju paljenja,

neznam da li postoji mogućnost da se nekako prekine paljenje dioda i gašenje,baš kada sam pritisnuo taster,i da krene neki drugi podprogram?
Znam da sam malo odskocio od onog mog prvobitnog pitanja u vezi teme,ali ako nije problem,da li je i to resivo.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

Interapt, pogledaj DTINT, Ili umesto
PAUSE 1000
Stavi ovo
FOR i = 1 TO 1000
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
ENDIF
NEXT
i

Nemoj da se zajebes pa da ovo gore napisano stavis na neku labelu pa da koristis GOSUB
Ukoliko to uradis, imace GOSUB koji ce staviti PC na stek, onda u tom pod programu imas GOTO kojim skaces negde tamo, i nikad nemas return...
I tu nastaje pizdarija, kada se napuni stack, kud onda? Zavisi od serije piceva, ali neki se restartuju, neki krenu od nule itd.....
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

Probao sam NEFERCERA :D ,ako sam je to dobro da se postavi ovako :

Code: Select all

BLINKANJELEDDIODA:
high PORTB.3
------------------------------------------------------
FOR i = 1 TO 1000
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
ENDIF
NEXT i

low PORTB.3
------------------------------------------------------
FOR i = 1 TO 1000
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
ENDIF
NEXT i
------------------------------------------------------
GOTO BLINKANJELEDDIODA

samo se upali high PORTB.3 kao u ovom primeru i nista,neće da se naiznečno pali i gasi,kao da neprepoznaje ovo kao zamenu za PAUSE 1000,ili ja, što me ne bi čudilo,nisam dobro postavio :D
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

Spor si, pa ne vidis da radi kako treba :)
Zaboravih, posle for ili pre next dodaj pause 1....
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

ha,ha, :D moguće upravu si, usporio sam 1000%,već mi se sve vrti od ovog tastera :D ,
jel si si ti mislio ovako:

BLINKANJELEDDIODA:
high PORTB.3
------------------------------------------------------
FOR i = 1 TO 1000
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
ENDIF
--------------------------------------------------
pause 1000 * jel si mislo ovde da stavim ?
--------------------------------------------------

NEXT i

low PORTB.3
------------------------------------------------------
FOR i = 1 TO 1000
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
END
---------------------------------
pause 1000 * i ovde da stavim pause?
--------------------------------------

NEXT i
------------------------------------------------------
GOTO BLINKANJELEDDIODA

ili sam ja nacisto zabagovao,sto će izleda biti najpre :D

Ma nema veze,nije ovo baš to toliko o glavu,ono sto si mi objasnio predhodno oko Eproma mi je bilo bitnije,da ne davim puno oko ovoga,hvala u svakom slučaju na pomoći :wink:
Reci mis amo još jedno oko upisa kod Eproma,ono sto sam prethodno pitao,
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by gagi011bg »

onaj tvoj primer:

IF TASTER=0 THEN
WRITE 0,1'adr 0 vrednost 1.
GOTO BLINKANJELEDDIODA
ENDIF
bla bla

ovde kada napr,dodjem do:
WRITE 0,9 'adr 0 vrednost 9.
jel ok ako upisem za sledecu:


IF TASTER=0 THEN
WRITE 0,10'adr 0 vrednost 10.
GOTO OKRETANJELEDIODA
ENDIF


A select case....
READ 0,Tmp
SELECT CASE Tmp
CASE 10
GOTO OKRETANJELEDIODA
itd,itd......
ENDSELECT


Ja sam probao ovako,i radi,nego me interesuje je to ok,mislim da li je ispravno ?
Ovo pitam,zato kada imam 10-15,možda više,programa da upisujem,a dodjem do
WRITE 0,09'adr 0 vrednost 09.
da nastavim sa: WRITE 0,10---WRITE 0,11........ i tako redom,
a za
SELECT CASE Tmp
CASE 10,
CASE 11,.............


Hvala u svakom slucaju i za ovo,puno :D
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1627
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by WhiteHead »

Poželjno je nakon naredbe WRITE staviti PAUSE 10, to valjda da mu ostaviš vremena da to kako treba upiše..
Ako kaniš pobijediti, ne smiješ izgubiti
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

WhiteHead,
Nije bas tako :)
To vazi za I2C eeprome, posle upisa 1 bajta, ili cele stranice(page write).
A za interni eeprom ne treba pauza, jer procesor se zadrzava na toj naredbi dok ne javi da je upisan.
Tako dali ti procesoru rekao upisi, pa se zaglupi 10ms tako sto ces vrteti neku petlju, ili radi nesto korisno, gledano sa strane eeproma je isto...

gagi011bg,
Rekoh pauza 1ms a ne 1000. Ako ponovis pauzu 1mS 1000 puta, dobices otprilike 1s.

FOR i = 1 TO 1000
IF TASTER=0 THEN
WRITE 0,1
GOTO OKRETANJELEDIODA
ENDIF
--------------------------------------------------
pause 1'
--------------------------------------------------
NEXT i
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1627
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by WhiteHead »

pedja089 wrote:
To vazi za I2C eeprome, posle upisa 1 bajta, ili cele stranice(page write).
A za interni eeprom ne treba pauza,
Ma negdje sam to pročitao i shvatio da važi i za interni.. :oops:
Ako kaniš pobijediti, ne smiješ izgubiti
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7881
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Pic 16f628 pamcenje zadnjeg rada programa

Post by pedja089 »

Moguce da sam cak i napisao greskom tj neznanjem :ohno: . Ne da mi se sad naci. Ako neko naidje na to, nek rekne da ispravim.
Post Reply