Cteni a zapis do, z EEPROM v PIC 16F628A

Zdravím všechny.
Potřebuji poradit se zápisem do eeprom v picu. Při simulaci v MPLABU a i v realitě se nic nezapíše do EEADR. Ikdyž v EE_ADR1 hodnota je. Nejde to ani při čtení ani při zápisu. Věděl by někdo proč? Předem dík H.
READ bsf STATUS,RP0 ; banka 1
movfw EE_ADR1
movwf EEADR
bsf EECON1,RD ; cteni EEPROM
movf EEDATA,W ; nactena data z pameti EEPROM do registru W
bcf STATUS,RP0 ; banka 0
;-------------------------------
return ; !!! data v registru W !!!

Zkus to takto.
Citace z datasheetu:

EXAMPLE 13-2: DATA EEPROM WRITE
Pro zápis do paměti dat typu EEPROM je nutné zapsat adresu buňky do které se bude zapisovat do registru EEADR. Do registru EEDATA je nutné zapsat 8-bitové slovo určené k zápisu. Následně musí uživatel zajistit provedení požadované sekvence instrukcí, která inicializuje proces zápisu, viz příklad 8-2.

BSF STATUS, RP0 ; Bank 1
BSF EECON1, WREN ; Enable write
BCF INTCON, GIE ; Disable INTs.
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW AAh ;
MOVWF EECON2 ; Write AAh
BSF EECON1,WR ; Set WR bit
; begin write
BSF INTCON, GIE ; Enable INTs.

EXAMPLE 13-1: DATA EEPROM READ
Pro čtení dat z paměti EEPROM je nutné použít ukazatele dat v registru EEADR. Do tohoto registru je nutné umístit adresu buňky, ze které budeme číst. Dále je nutné nastavit bit RD v registru EECON1<0>. Již v následujícím instrukčním cyklu jsou v registru EEDATA připravena data vyčtená z paměti EEPROM. V registru EEDATA zůstane vyčtená hodnota do dalšího čtení z paměti EEPROM nebo do přepsání registru jinou hodnotou. Programová rutina obsluhy je uvedena na příkladu 8-1.

BCF STATUS, RP0 ; Bank 0
MOVLW CONFIG_ADDR ;
MOVWF EEADR ; Address to read
BSF STATUS, RP0 ; Bank 1
BSF EECON1, RD ; EE Read
BCF STATUS, RP0 ; Bank 0
MOVF EEDATA, W ; W = EEDATA

Dík za odpověď.
Bohužel mě se vůbec nic nepřesune do EEADR. Pořád je tam 00h. Zkusil jsem to i slepě překopírovat z toho co jsi napsal, ale nic :frowning: .
Zkusil jsem to odsimulovat a do EEDATA se hodnota z adrresy 00h zapise. Pokud tam chci zadat jinou adresu tak to nejde. Už opravdu nevim co s tim. H.

A v ktorej banke je EE_ADR1?
Pokial je inde ako v prvej banke, tak to fungovat nemoze.
Mimochodom, syntax “movfw abc” je nespravny.
Mal by sa pouzivat tvar “movf abc,W”.
MPASM vezme obe moznosti, ale druha je ta spravna a bude fungovat vzdy.

Dík. S tou syntaxí mi to taky nejde. Dám sem kód jestli něco nenajdete. Mělo by to řídit dvě serva v cca 84 krocích a SW dorazy jdou nastavit a “měly” by jít uložit do eeprom. V MPLABU to je hned za nastavením portů se má vyčíst z eeprom z adrsey 01h data. Ale protože se ni do EEADR nezepíše tak to čte z adresy 00h.
Dík všem za rady a hezký svátky. H.
Servo.asm (21.9 KB)

A nezapise sa to preto, lebo EE_ADR1 je v banke 0 (RAM+8 ), ale v rutine READ to robite takto

READ bsf STATUS,RP0 ; banka 1
movfw EE_ADR1
movwf EEADR 
...
...

Teda citate EE_ADR1 ako by ten register bol v banke 1. Treba najprv precitat obsah registra EE_ADR1 kym je PIC v banke 0, potom sa prehodit do banky 1, teda asi takto

READ 
movf EE_ADR1,W
bsf STATUS,RP0 ; banka 1
movwf EEADR 
...
...

Dufal som, ze ked sa opytam na to, v ktorej banke je EE_ADR1, tak sa nad tym zamyslite aj sam.

Dík.
Zamyslel a přišel jsem teď na to taky. Už jsem zas o kousek chytřejší :slight_smile:.
Program je dokončen a běží. Dám ho sem, třeba se někomu budou části hodit. Nejsem odbornik tak je to trošku kostrbaty,ale funguje.
Servo.asm (22.4 KB)