DIY Electronic projects
Pomoc oko upisa u interni eeprom 16f84a - Printable Version

+- DIY Electronic projects (https://forum.yu3ma.net)
+-- Forum: Mikrokontroleri (https://forum.yu3ma.net/forumdisplay.php?fid=52)
+--- Forum: Microchip PIC (https://forum.yu3ma.net/forumdisplay.php?fid=53)
+--- Thread: Pomoc oko upisa u interni eeprom 16f84a (/showthread.php?tid=673)



Pomoc oko upisa u interni eeprom 16f84a - MILANNN - 10-19-2014

Pozdrav svima.Evo prvog pitanja u ovoj oblasti pa ako i nebude odgovora nema veze,bar da probijemo led pa da krene malo prica i o piconjama.Potrebna mi je pomoc u vezi ovog koda.Hteo bih da postavim da se pritiskom na taster upise u eeprom koliko puta je pritisnut taster i pritiskom na drugi taster da mi taj broj ispise u drugom redu displeja.Na pr pritisnim taster-brojac 5 puta i na displeju u prvom redu pise 5 , tad pritisnem drugi taster i taj broj 5 se upise u eeprom pa brojac moze da broji dalje a kad pritisnem treci taster u drugom redu da se pojavi br 5 koji je upisan u eeprom bez obzira do kog broja je brojac stigao u prvom redu displeja.Ovo sto stoji u kodu da se pojavi "kraj" u drugom redu to cu da izbacim.Ako neko ima vremena zamolio bih za pomoc jer neide mi nikako,mozda je problem i do proteusa ali neverujem,mislim da ipak ja gresim.

brojac var byte
provera var byte
taster var bit
TRISA = %11111101
brojac=0

DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100



cekaj0:

lcdout $FE, $80, "BROJ ="

gosub proveri_ulaz
if taster = 0 then cekaj0:

cekaj1:

gosub proveri_ulaz
if taster = 1 then cekaj1
brojac=brojac + 1

lcdout $FE, 2
lcdout "BROJ ", #brojac

if brojac = 10 then
porta.1 = 1
LCDOUT $FE, $C0
lcdout " KRAJ"
endif

goto cekaj0

proveri_ulaz:
taster=0
for provera = 0 to 100
if PORTA.0 = 1 then return
pauseus 100
next provera
taster = 1
return
end


RE: Pomoc oko upisa u interni eeprom 16f84a - Macola - 10-20-2014

Rekao bih da je PicBasic u pitanju.

Najverovatnije da se upisuje ovako:

Code:
write lokacija,podaci

A čita ovako:

Code:
read lokacija,varijabla

Naravno, u helpu tvog Basic treba pogledati jer ima dosta verzija za PIC16 seriju.

16F84 ima svega 64 lokacije po 8 bita u svom EEPROM. Dakle lokacija (adresa u EEPROM) može biti od 0-63, a veličina podatka na svakoj adresi 0-255.

Postoji i grupni način čitanja iz EEPROM. Na primer:

Code:
;deklarisanje konstanti, varijabli, arrays i pina za led

param_depth con 10 ; na primer, potrebno ti je 10 lokacija u EEPROM
;promenom samo konstante param_depht resavas potreban broj param (0-63)

led var portb.7 ; led na na primer na pinu RB7, kroz otpornik od min. 330R

trisb = %01111111 ; proglasen samo RB7 kao izlaz, ostali na portu B su ulazi

i var Byte ; varijabla potrebna za for petlju

parametri var Byte[param_depth] ; radni parametri, konkretno 10 kom., u RAM, tokom programa ih menjaš, posle upišeš kad hoćeš
oldparam var Byte[param_depth]  ; privremeni u ram, za poredjenje

Clear  ; softverski reset MCU
    porta = 0 : portb = 0 ; inicijalizacija oba porta na sigurnu pocetnu vrednost

    For i = 0 To param_depth -1 ;0-9, tj. 10 komada
        read i,oldparam[i] ;iz eeprom u ram, oldparam niz se kasnije ne menja,sluzi za uporedjiv. sa nov.vred.
        parametri[i] = oldparam[i]  ;ovde si ih prepisao u radne koje ces menjati tokom programa
        pause 100  ;vreme koje odredjuje brzinu blinkanja led
        Toggle led ; sporo blinkanje led kao indikacija da je procitan EEPROM
    Next i

;posle ovoga radis neki tvoj program, a prvo si pokupio podatke iz eeprom, posle startovanja MCU

Ili grupno upisivanje, gde se upisuje samo onaj podatak koji je promenjen, radi štednje EEPROM.

Code:
upisi:      ; labela kojom pozivas upisivanje kada zelis, pomocu goto ili gosub itd...
    For i = 0 To param_depth -1 ;0-9, tj. 10 komada
        If parametri[i] <> oldparam[i] Then    ;upisi samo one koji se razlikuju od bivsih, tj. samo one koje si menjao
            write i,parametri[i]
            oldparam[i] = parametri[i] ;namesti promenjene oldparam za kasnije poredjenje
            Toggle led ; brzo blinkanje led kao indikacija upisivanja
            pause 20
        EndIf
    Next i

Mnogo godina nisam pisao u basic, ali po sećanju bi trebalo nešto ovako.
Kada se ovde piše kod u Basic, reči (naredbe) iz Basic nisu boldovane.
Tvoj editor za basic će to verovatno sam boldovati, ali evo za svaki slučaj šta bi trebalo da bude boldovano:
write, read, con, var, For, To, Next, If, Then, Endif, Toggle, pause, Byte

Pozz

P.S.

Zaboravih: Ako ti treba neki parametar za neku matematiku ili prikaz na displeju, ili šta god: neko_ko_prima_podatak = param[lokacija (od 0 do param_depht -1)], gde možeš upisati na način: param[lokacija]= neka_veličina (od 0-255).

Štediš eeprom tako što izvršiš upisivanje u njega tek kada nameravaš da isključiš MCU, na primer ručnim pozivom memorisanja.
To se takođe elegantno može napraviti i tako što detektiuješ nečim nestanak naizmeničnog napona na trafou kojim sve to napajaš, a elko ispred stabilizatora za 5V staviš dovoljno velikim da "izdrži" vreme za upis eeprom, dovedeš taj signal nestanka na neki pin MCU i napraviš maleni poziv da se upis izvrši automatski kod nestanka napajanja (nešto za dlaku pre nestanka). Naravno, taj metod zahteva da detekcioni signal bude prilagođen ulazu MCU (0-5V), obavezan brown-out zaštitni sklop, istovremeno sa detekcijom nestanka i zabranu led da ne troši elko i skraćenje vremena u for petlji na neophodnih svega 10mS.

Tada će potrošnja MCU biti beznačajna a upisivanje čak i svih 63 lokacija potrajati manje od sekundu, a to je dovoljno sa nekih možda 2200uF ispred 7805 i radnim naponom od možda 15-tak V ispred stabilizatora. Po nestanku napajanja 7805 će "držati" sigurnih 5V sve dok mu na ulazu napon ne padne na <8V.

Tako na primer rešavaš da ti se parametri tokom nekog rada uređaja ne izgube kod slučajnog nestanka napajanja.
Omogućenje automatskog upisa obeležiš nekim flag, koji kasnije upotrebiš za dozvolu automatskog upisa, da ne bi imao problema kod butovanja MCU, a taj flag postaviš tek kada se završi podizanje onog što si hteo (kada uđeš u glavnu petlju programa).
Naravno, ako ništa nisi u međuvremenu menjao, ništa se neće ni upisati, a ako si menjao biće upisano samo ono što si menjao, tj. samo ono što je potrebno upisati ponovo. Štednja eeprom je maksimalna i bez obzira što je kod 16F84 moguće čak milion upisivanja, u nekim situcijama se to brzo može potrošiti ako ne vodiš računa o tome. Posle toga eeprom postaje beskoristan.

Znam da ti ovo izgleda komplikovano sada, ali sačuvaj ovaj tekst negde jer će ti kad-tad zatrebati, a razumećeš kasnije.


RE: Pomoc oko upisa u interni eeprom 16f84a - MILANNN - 10-20-2014

Nije komplikovano napraviti takav sklop za detekciju nestanka naizmenicnog signala tj spasavanje podataka,ceo taj proces tj nestanak naizmenicnog signala pic ce videti isto kao pritisak tastera tj prekazak nekog pina sa log1 na log0 a sve ostalo odradice rezerva u kondenzatoru,ideja ti je fantasticna.Meni to nije padako napamet jer svaki kod za koji se imalo pomucim cuvam pa zato nisam razmisljao o tome mada kad je u pitanju nesto sto se trenutno potavlja u eeprom e onda je ovo super resenje.Par puta mi je proteus uzeo i po nekoliko dana bez potrebe jer to isto sto nije htelo u proteusu na plocici proradi iz prve.Uradicu i sada tako pa ako nije problrm proteus nego ispadne da je problem sto ja negde gresim stavicu externi eeprom,sa njim nikad nisam imao problem.Veliko hvala na pomoci drugar,ako niko ima nesto slicno kao primer ili adresu neka postavi.


RE: Pomoc oko upisa u interni eeprom 16f84a - Macola - 10-20-2014

(10-20-2014, 03:12 PM)MILANNN Wrote: Nije komplikovano napraviti takav sklop za detekciju nestanka naizmenicnog signala tj spasavanje podataka,ceo taj proces tj nestanak naizmenicnog signala pic ce videti isto kao pritisak tastera tj prekazak nekog pina sa log1 na log0 a sve ostalo odradice rezerva u kondenzatoru,ideja ti je fantasticna.Meni to nije padako napamet jer svaki kod za koji se imalo pomucim cuvam pa zato nisam razmisljao o tome mada kad je u pitanju nesto sto se trenutno potavlja u eeprom e onda je ovo super resenje.Par puta mi je proteus uzeo i po nekoliko dana bez potrebe jer to isto sto nije htelo u proteusu na plocici proradi iz prve.Uradicu i sada tako pa ako nije problrm proteus nego ispadne da je problem sto ja negde gresim stavicu externi eeprom,sa njim nikad nisam imao problem.Veliko hvala na pomoci drugar,ako niko ima nesto slicno kao primer ili adresu neka postavi.

Utoliko bolje ako ti nije komplikovano.
Taj način upisivanja po nestanku napajanja, tamo gde treba, koristim od kada je se pojavio 16F84, kao prvi PIC sa flešom. To provereno i sigurno radi na bilo kom Pic sa eeprom unutra.

U pricipu se u eeprom čuvaju neki važni parametri sklopa, poput neke setovane temperature, nekih podesivih vremena, parametara PID i slično tome, koji treba da ti ostanu tamo kada ponovo uključiš napravu.

Pic kontroleri inače imaju veoma pouzdan eeprom i samo upisivanje nije nikakav problem. U datasheet od 16F84 imaš asm kod za upisivanje, a u višim jezicima poput C ili Basic, već odrađene makroe koji to svode na jednu reč, kako sam i napisao u gornjem primeru.

Sam eeprom kod Pic 16F i 18F serija dozvoljava čak po milion upisivanja u eeprom (broj čitanja nije ograničen).
To znači da ako bi vršio 100 isključivanja uređaja dnevno, sa upisivanjem onog što treba sačuvati, trebalo bi ti oko 27 godina da pohabaš interni eeprom u 16F84. Mnogo je to brate!
Neverovatno su retke potrebe za tako čestim upisivanjem, jedino kod nekih superspecijalnih svemirsko vojnih potreba, gde MCU svaki krug programa počinje iz reset stanja radi enormne stabilnosti sistema, a tu zasigurno neće staviti baš 16f84, a još sigurnije neće takav tip eeprom!
Projektili se ne lansiraju sa 16F84, već se radije koriste specijalizovani stack MCU, i pišu se u Forth (bar je tako ranije bilo, ne znam šta rade sada)!

16F84 ima 64 bajta eeprom na raspolaganju, što je savim dovoljno za kapacitet tog Pic, dok na primer neki 18F imaju čitavih 1024 bajta, što je dovoljno za čuvanje na stotine parametara veoma složenih mašina u industriji.

Eksterni eeprom zahteva "produvavanje" I2C ili SPI komunkacije na 16F84, koji nema hardverske module za to, i to je značajno komplikovaniji put od upisa u lokalni eeprom.
Kod tako malog Pic često može da se dogodi čuvena situacija da ti nedostane još samo jedan pin ili još samo dva bajta :-).

Ukoliko ne praviš neke masivne baze podataka (a pitam se kakve bi sa 16f84), preporučujem ti da upisuješ tih 64 bajta u lokalni eeprom kod 16F84.
To je 64 parametra veličine bajt, ili 32 16 bitna parametra na primer.
Ako na primer uspeš da smestiš PID termoregulator u taj mali Pic, sve što treba od parametara za njega hladno staje u njegov eeprom.
Dakle tih 64 bajta nisu uopšte mali.
Osim toga upisivanje je krajnje jednostavno i smrtonosno sigurno radi, kao i čitanje.
Sasvim uredan, čitak i regularan primer sam ti dao, koji možeš odmah upotrebiti, a čak sam ti napravio indikaciju upisa i čitanja pomoću LED, da lepo vidiš kada se to događa.

Ni malo mi nije jasno kako ti je to lakše da koristiš eksterni eeprom od internog, a na 16F84?


Pozz


RE: Pomoc oko upisa u interni eeprom 16f84a - Macola - 10-21-2014

Šta si uradio drugar? Jesi li "progurao" upisivanje i čitanje lokalnog eeprom?


RE: Pomoc oko upisa u interni eeprom 16f84a - MILANNN - 10-21-2014

Nisam.Neide nikako pa cu veceras kad zavrsim sa obavezama da probam drugacije,da stavim jos jednu promenljivu i da se na pritisk tastera broj upise u promenljivu a kad bude potrebno,da se pojavi u drugom redu na pritisak sledeceg tastera.Tako bi trebalo da moze i da izbegnem eeprom jer izgleda da negde poprilicno debelo gresim.

Sad vido onu prethodnu duzu poruku.
"Ni malo mi nije jasno kako ti je to lakše da koristiš eksterni eeprom od internog, a na 16F84?"
Koristio sam externi na 16f877,lakse mi je jer sam pre par godina kupio knjigu Voje Milanovica pa je lepo objasnjeno na srpskom a ima i gotovih primera pa nije bilo tesko videti sta i kako.Na 16f84a nisam nikad do sada probao ni sa jednim eepromom,tek pre neki dan sam prvi put nabrzinu pogledao DS za 16f84a uvezi eeproma.


RE: Pomoc oko upisa u interni eeprom 16f84a - Elektrostudio - 10-21-2014

Ajd da posaljem prvi post ovde. EEPROM u 16F84 zahteva specifican pristup i ako je u pitanju citanje lokacije nije problem, medjutim ako treba upisati u EEPR onda mora se ispostovati procedura koja stoji u DS-u. Prvo se upise 55h pa potom AAh u kontrolni registar i tek nakon toga ide prava vrednost za upis u EEPR. Posto ne radim u BASIC-u treba proveriti imali naredbu za ovu stvar.


RE: Pomoc oko upisa u interni eeprom 16f84a - Macola - 10-22-2014

Da. Tako je. U datasheet je to lepo napisano.
Međutim to se radi kada se piše u asm, a za pisanjem u asm stvarno ima potrebe tek za nešto što mora da radi neverovatno brzo ili da stane u malo fleša.
Odnosno, kada se radi strašno velika serija sa superjevtinim PIC, gde se bira najjevtiniji u kog aplikacija još uvek može da stane, ili za specijalizovane potrebe gde je neophodna maksimalna brzina izvršenja.


Kada se radi u višim jezicima, poput Basic, C ili slično, obično je napravljen makro, u vidu jedne reči, koji to automatski odradi.

Ne znam koju verziju Basic za Pic MCU ima MILANNN, jer ih ima podosta, od Swordfish pa do MCSplus?

MILANNN teba da pogleda u uputstvu za svoj Basic kako mu glasi makro za upis i čitanje eeprom, i onda je to sasvim jednostavno za korišćenje.
--------------------------------
Nešto oko tih 16F vs 18F...

Postoji više razloga zašto treba napustiti 16F seriju i preći na 18F seriju.
- manja cena
- veća brzina
- bogatiji hardverskim modulima
- linearno adrresiranje (nema arbitracije dosadnim bankama)
- mnogo više memorije u svakom smislu
- ispravljena gomila prethodnih zaglupa na 16F seriji

Na primer, prilično ozbiljnom 16F877A, kao skoro direktnu zamenu možete upotrebiti 18F452, potom kao njegovu još bolju zamenu na primer 18F4620.

Koliko može biti ozbiljan stari 16F877 dovoljno pokazuju desetine kontrolera sa 128 I/O, sa LCD displejem, tastaturom, SPI i RS232 komunikacijom, oba aktivna PWM multipleksitranih na 8 mogućih izvršnih lokacija, itd...
Takvim napravama sam pokrenuo desetine vrlo složenih mašina za preradu plastičnih masa koje i dan danas rade bez greške, i to je sve vukao jedan jedini 16F877, sa nekoliko in-out ekspandera.

Generalno su razlike sledeće:

- 16F877, 20MHz, 14K fleša, 368 Bytes SRAM, 256 Bytes EEPROM, 8 ADC 10bit, 2 PWM, I2C, SPI, USART, 3 Timers, 2 comparators, 4 dosadne banke u flešu, trenutno košta 6.6$ .

- 18F452, 40MHz, 32K fleša, 1536 Bytes RAM, 256 Bytes EEPROM, 8 ADC 10bit, 2 PWM, I2C, SPI, USART, 4 Timers, no comparators, linearno adresiranje, trenutno košta 6,2$.

- 18F4620, 40MHz, 64K fčeša, 3968 Bytes RAM, 1024 Bytes EEPROM, 13 ADC 10bit, 2 PWM, I2C, SPI, EUSART, 4 Timers, 2 comparators, linearno adresiranje, trenutno košta 5.4$.
---------------------------------
Sam 16F84 je bio svojevremeno pravi "BUM" sa flešom za programsku memoriju.
Umesto EPROM staklenog prozorčeta kao na primer kod PIC16C74, gde se brisalo UV lampom po deset minuta, 16F84 je ponudio elegantnije rukovanje i ako je "zapreminski" siromašan.
Međutim, 16F84 je veoma zastareo i ništa nije bolji za učenje od ovih novijih PIC.
Da bi početničko učenje bilo uspešno, počev od led blink i slično, dovoljno je napraviti ispravnu hardversku konfiguraciju nekog konkretnog PIC, a tu će iskusnii sa foruma pomoći.
Led blink se može vežbati i na mnogo moćnijem na primer 18F4620 umesto na 16F84 ili 16F877, bez osećaja "klaustrofobije", jer na raspolaganju stoji ogroman memorijski prostor i velika brzina, a sve što je napisano za 16F84 će raditi tu, tj. portabilno je, osim bespotrebnog prenošenja softverski rešenih komunikacija, jer postoje hardverski moduli koji to mnogo jednostavnije rade.

Da bi se vežbalo ono iz 16F84 (samo digitalni I/O) a na primer na snažnom 18F4620, dovoljno je osim konfiguracije kloka koja zavisi od alata koje koristite, napisati negde na početku koda samo ovo:

Ako je u Basic:

ADCON1 = $0F ;adc off
CMCON = $07 ;comparators off

Ako je u C:
ADCON1 = 0x0F; /* adc off */
CMCON = 0X07; /* comparators off */

I 18F4620 će postati naprava sa gomilom digitalnih I/O i ogromnom količinom memorije.
Nešto kao džinovski 16F84 koji sad liči na stonogu sa čitava 3 cela osmobitna porta i četvrtim nepotpunim :-).
Višak prostora nikada nije smetao. Jednostavno ga možete upotrebiti ili ne.

Nema ni jednog razloga za korišćenjem malenog oldtajmera 16F84. Čak mu ni cena nije "umiljata", jer košta 3.7$, za koje se može kupiti čak i poneki od 16-to bitnih DSPIC.
Prodaju ga još uvek zato što ne znaju šta će sa zalihama, a ne bi hteli da bace, pri čemu prodaju i palamuđevinu da je najlakši za početnike, samo da bi ga prodali.

Nema tu razlike oko učenja.

Ono što ih razlikuje je konfiguracija hardvera (koja se mora uraditi u nekoj malo manjoj količini i na tom oldtajmeru 16F84) i tu totalni početnik valja da se nekom iskusnijem obrati za prvu pomoć.
Posle vremenom sve bude jasnije i lakše.

Konfiguracija se ne može izbeći, bio to malecki 16F84 neki mnogo veći.
Radi se samo o nekoliko reči teksta više.
---------------------------------------
Inače oko tih jezika nešto iz ličnog iskustva:

Basic "jede" popriličnu količinu fleša, i kada sam ranije pisao neku mašinu u 16F877A, koja koristi 128 In/Out, onda je postajalo tesno, pa sam morao ponekad da sve to ponovo napišem sa nekih 5-6 Kilolinija u asm. Pitanje je koliko je kompiler tada bio optimizovan, ali stvarno nisam želeo da se bakćem sa tim.

C je tu daleko optimalniji, posebno za seriju 18F koja je prilagođenija tom jeziku.
Napravio sam nekada test sa istim prilično masivnim algoritmom u asm i u C, i C je "pojeo" tek 30% više fleša od asm, za razliku od Basic koji je "jeo" skoro dvostruko.
Tada sam napustio Basic i prešao na C (pre možda 10-11 godina).

Možda je sada neki moderniji Basic optimizovan dobro, ali ne bih nešto da se vraćam na to...

Jedan od najmoćnijih programerskih alata koga sam se u nekom periodu dohvatio je metajezik Forth (ne mešajte ga sa Fortran).
Žao mi je što nisam ostao dovoljno uporan u tome i svakodnevno razmišljam da se ponovo vratim na tu esencijalnu moć koju Forth nudi.
Forth "jede" svega 10-tak% fleša više nego asm, i skoro je jednako brz u izvršavanju.
Forth definitivno zaslužuje novu temu da ne gušim ovde, i ko od programera želi apsolutnu kontrolu nad MCU do poslednjeg bita u njemu. i ekstremne mogućnosti, Forth je savršen izbor i ako zahteva totalni preokret u načinu razmišljanja. Zahteva vreme i potpuno posvećivanje na početku, ali posle toga postaje veoma nadmoćan alat (ko ostane dovoljno uporan :-)

Pretpostavljam da mislite da je Forth retko u upotrebi, ali se varate.
U pozadini ispod vaših Windows, Linux, OSX, "tutnji" Forth, koji arbtrira ogromnim delovima najbržeg hardvera na vašim mašinama.
Tu je zbog svojih izuzetnih mogućnosti, i to nije slučajno tako, no o tome ćemo u novoj temi...
-------------------------



Pozz