Program pro PIC16F690 zobrazující obsah EEPROM na displeji

Zdravim,

napsal jsem si takovy jednoduchy programek pro vyzkouseni prace s EEPROM. Na 4 digitovem displeji zobrazuji adresu a hodnotu v EEPROM (00-FF,00-FF). Cele to ovladam 6ti tlacitky - 2pro pohyb nahoru dolu v adrese, 2 pro to same ale s hodnotou a pak zapis a cteni.
Bohuzel zapis ani cteni z EEPROM mi nefunguje. Procesor proste zamrzne, nebo se zniceho nic resetne. Prikladam kod assembleru. Pokud smazu obsah podprogramu CTI a ZAPIS tak program funguje jak ma, ale pokud se snazim z EEPROM neco precist nebo zapsat, narazim. Rutiny pro cteni a zapis jsem zkousel ruzne upravovat, kde cekam na vynulovani bitu EECON1,R nebo WR. Nebo jsem cekal na nastaveni PIR2,EEIF. Zkusil jsem i tyto rutiny davat do hlavni smycky. Vse bez uspechu :frowning:

Nejde mi na rozum i to, ze cast kodu zpusobi zamrznuti ikdyz na nej zrovna vubec neskacu.

Za kazdou radu dik.

v simulatoru Real Pic Simulator v. 1.1.0.0 program zkolabuje take.

:arrow_right: administrator: přejmenováno z “16f690 problem s EEPROM”
eepromV1_displ_16f690.asm (4.81 KB)

Cau, mas dobre nastaveny pojistky ? muze se ti to resetovat (pes) a v urcity casti kodu to nemusis poznat, nebo mas spatnej pomer call/return,

tady mas funkcni kod pro zapis/cteni upravenej z DS,snad pomuze
EE.asm (2.2 KB)

Dik za reakci,

pocet CALL a RETURN mam stejny.

Rutina cteni v tvem kodu je totozna s tou mou. V pojistkach mam nastaveno jen povoleni vycteni kodu z obou pameti a nastaveni zdroje hodinoveho signalu. Zbytek mam v nule. Presne ktery nastaveny bit v pojistkach by mel praci s eeprom vadit?

V podprogramu zapis napred cekas az bit WR spadne do nuly a pak ho das jeste spat. Co presne ho probudi ? preruseni od bitu EEIF ? nevidim kde ho nulujes, takze podle me je tam ten sleep k necemu jen pri prvnim zapisu resp. zavolani zapisU.

Ukonceni zapisu jsem take bezuspesne zkousel pri nastaveni EEIF a pak ho nuloval, vcetne povolovani a zakazovani GIE na tech spravnych mistech. Kombinovat to jeste s cekanim na WR=0 se mi zda preplacane.

jsou k necemu v tvem kodu prazdne radky ?
je potreba v rutine zapisu pouzit NOP po instrukci WR=1 ? v datasheetu nic takoveho neni.

Myslím, že tvůj problém je špatná práce s tabulkou.
Nemáš dobře ošetřen obsah PCLATH.
Instrukce: tabZnak addwf PCL,F provede skok na edresu 008, nikoliv do vlastní tabulky. Tím dojde také po čase k přetečení zásobníku a zřejmě i k dalším nevídaným efektům.
Možná jsou tam i další chyby, ale tahle je kritická určitě.
Zkus přidat něco takového -

BCF dSTR movlw HIGH tabZnak ; tohle pridej movwf PCLATH ; tohle pridej movf EEadr1,W call tabZnak call SEND movf EEadr2,W call tabZnak addwf teckaA, W call SEND movf EEhod1,0 call tabZnak call SEND movf EEhod2,W call tabZnak addwf teckaH, W call SEND BSF dSTR return

Ovšem tenhle problém ti ukáže i simulátor.

Tuto rutinu pro vyber konstanty podle cisla 0-Fh mam opsanou primo z jedne knihy k vyuce PIC pro 16f84A. Nerikam ze neni derava, ale … byte, ktery ukladam do W pred zavolanim te tabulky ma vzdy vynulovane horni 4 bity a podle tech donich nemuze skocit dal nez o 15 radku, ktere tvori onu tabulku.

Tuto rutinu pouzivam temer v kazdem mem kodu pac s ni obsluhuju onen 4 digitovy displej jen po 3ech dratech. napr. A/D prevod.

Znova pripomenu ze program prestane delat problemy, kdyz… kdyz smazu radky mezi ZAPIS a RETURN tak se program rozbehne a funguje asi na 8 zmacknuti tlacitek nez se resetne, pritom neskacu na CTI (to je jine tlacitko), pokud skocim na CTI tak se PIC resetne okamzite …kdyz smazu i radky mezi CTI a RETURN tak se program chova naprosto korektne a neresetuje se ! s tim, ze nepracuji s EEPROM :angry: .

V simulatoru o kterem jsem se zminoval vyse se po instrukci, kde nastavuji bit WR nebo R do 1, stane to ze se ukazatel vynuluje a program stoji na ORG 0, tedy na zacatku programu = reset.

Nekde jsem se docetl o nejakem nastavovani organizace EEPROM - device type nebo tak nejak. Pouzivam WinPic800, ale tohle nastaveni tam nikde neni. Je mozne, ze to zpusobuje tohle ? existuje vubec neco takoveho ?

Já nediskutuju o tom, jestli to máš špatně nebo ne. Já ti říkám, že to máš špatně. Protože na tom naprosto korektně a zdůvodnitelně ustřelí i MPLAB SIM. Prostě si tu svoji chybu odkrokuj. Že to děláš trvale špatně, jak sám říkáš ,vedlo k tomu, že to prostě tady nefunguje. PCLATH máš s hodnotou 0 a v WREG máš při prvním průchodu také nulu. Zákonitě skončíš na začátku programu, ať chceš nebo ne.
Když umažeš kus programu, tak se tvoje tabulka dostane do prvních 256 byte paměti a problém se tím odstraní, což je naprosto přirozené. Hledáš záhady tam, kde rozhodně nejsou.

pravdu máš. Diky moc za fix a bug. je videt ze jsem jeste poradny lamer :blush:

asi takle,kdyz sem vydel jak nastavujes banky a jak je to krapet neprehledny tak sem to uz neskoumal,zapis a cteni je z DS a v simulatoru to funguje,nevim v com pises kod ale v MPLABu je jasne videt ze ten SLEEP je za strednikem tudis neaktivni,

prazdne radky sou pozustatek z copy/paste nebo k zprehledneni kodu

narazka na pojistky byla jestly nems zaplyho psa (WDT)

tu tabulku si dej hned na zacatek at se ti neposouva s pridavanim kodu…

[code] ORG 00h
goto nastaveni

tabZnak addwf PCL,F
retlw 3FH
retlw 6H
retlw 5BH
retlw 4FH
retlw 66H
retlw 6DH
retlw 7DH
retlw 7H
retlw 7FH
retlw 6FH
retlw 77H
retlw 7CH
retlw 39H
retlw 5EH
retlw 79H
retlw 71H

nastaveni ;…
[/code]