Nieefektywny zapis w EEPROMie PIC 16F84A - jakie mogą być przyczyny?
PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
From: "DaNTe" <dante_at_nospam_nospam.tvm.pl>
Subject: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Wed, 4 Sep 2002 13:37:43 +0200
Witam.
Mam pewien problem. Mianowicie PIC nie chce picsać mi po EEPROmie i nie wiem
czym to może być spowodowane ?
W programie wszystko zdaje się być ok, 55h do EECON2 , AAh do EECON2,
włączony bit odblokowyjący zapis i włączony bit zapisu w EECON1, dane i
adres prawidłowe. Teoretycznie dane są zapisywane, bo zapalana jest flaga
przerwania po skompletowaniu zapisu, ale danych tych nie ma w EE. Odczyt nie
daje oczekiwanego efektu (odczytuje znak ktory mial byc zamazany).
Czy ktos z was spotkal sie z takim problemem ?
Dodam ze to pic na 4MHz ale taktowany jest ~1MHz, zasilany 5V na Vdd i 0V na
Vss. Taktowanie zewnętrzne na wejście clock'a i jednocześnie na B6 ale to
chyba nie przeszkadza.
PIC jest spięty z zewnętrznym EE, ale na razie jego (ex. EE) nie używam - to
chyba nie przeszkadza w uzyciu int. EE.
Raz nawet zadziałało ale za cholere nie wiem czym to było spowodowane :(
Pozdrawiam.
DaN
From: "Marcin" <gotech_at_nospam_02.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Wed, 4 Sep 2002 14:14:18 +0200
Podaję Ci moje wyciachane z programu procedurki na 16F84, które działały na
bank (tzn. działały dobrze :)
; *********************
;odczyt czasu masażu z EEPROMu
;czas w W
READ_EEPROM_TIME
BANK0
movlw .0
movwf EEADR ;adres=0x00
BANK1
bsf EECON1,RD ;rozpocznij czytanie
BANK0
movf EEDATA,w
return
;
; **********************
;zapisanie czasu masażu do EEPROMu
;dana w W
WRITE_EEPROM_TIME
BANK0
movwf EEDATA
movlw .0
movwf EEADR
BANK1
bcf INTCON,GIE
bsf EECON1,WREN
movlw h'55'
movwf EECON2
movlw h'AA'
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
retlw 0
... może to Ci coś pomoże ?
Pozdrówka i do góry głowa
Marcin
From: "Maciej Zaręba" <zarebama_at_nospam_wp.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Wed, 4 Sep 2002 22:42:43 +0200
Napisz tą procedurkę która Ci nie działa (może być na priv) . Pomogę.
From: "DaNTe" <dante_at_nospam_nospam.tvm.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Thu, 5 Sep 2002 16:07:59 +0200
Napisz tą procedurkę która Ci nie działa (może być na priv) . Pomogę.
Przeciez napisalem ze to nie kwestia procedurki bo ona na 100% jest dobra
(dziala na debugerze i wogole czasami dziala w samej elektronice). Ale
czasami nie dziala elektronika. To znaczy EEprom nie zapamietuje tego co ma
zapamietywac. Mimo ze caly proces przebiega OK (to znaczy usawiany jest EFI
i gaszony WR).
I zastanawiam sie co moze miec na to wplyw ?
Za wolne taktowanie ? nie sadze.... nierowne taktowanie ? tez chyba nie, bo
pozostaly program (niemaly) dziala.
Casami udaje sie zapisac zamiast tego co chce FF... nie wiem co jest. Na
pewno nie przekroczylem jeszcze dopuszczalnej liczby zapisan do eeproma.
Procedura wyglada tak:
(startujemy z adresem w W i LICZ=20)
A1:
MOVWF EEADR ; ustawienie na poczatek tablicy
A1NAST:
CALL SkompletujBajt
MOVF AX,0
MOVWF EEDATA
BANK1
BSF EECON1, WREN ; zezwolenie na zapis
;------- standardowa sekwencja sterowania EEPROMEM
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
;------- zapis
A1WAIT:
BTFSS EECON1, EEIF
GOTO A1WAIT
BCF EECON1, EEIF
BCF EECON1, WREN ; blokada zapisu
BANK0
MOVF EEDATA,0 ; test poprawnosci
BANK1
BSF EECON1, RD
BANK0
SUBWF EEDATA, W
BTFSS STATUS, Z
GOTO A1WRERR
MOVF EEDATA,0
CALL WyslijBajt
INCF EEADR
DECFSZ LICZ
GOTO A1NAST
GOTO Koniec
A1WRERR:
MOVLW 0x03
CALL WyslijBajt
GOTO A1NAST
--
pozdrawiam
From: "Maciej Zaręba" <zarebama_at_nospam_wp.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Thu, 5 Sep 2002 20:43:04 +0200
No tak nie do końca dobra ;) Po Bank1 powinieneś wyłączyć przerwania (bcf
GIE) i włączyć dopiero po BSF EECON1,WR. Możę się zdażyć że procedura
przerwania "wcina" Ci się w czasie zapisu do EECON2 i "kładzie" Ci całą
operację. A sekwencja zapisu nie powinna być niczym przerywana. Może o tym
świadczyć to że czasami zapis Ci się udaje.
From: "DaNTe" <dante_at_nospam_nospam.tvm.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Thu, 5 Sep 2002 23:05:04 +0200
No tak nie do końca dobra ;) Po Bank1 powinieneś wyłączyć przerwania (bcf
GIE) i włączyć dopiero po BSF EECON1,WR. Możę się zdażyć że procedura
przerwania "wcina" Ci się w czasie zapisu do EECON2 i "kładzie" Ci całą
operację. A sekwencja zapisu nie powinna być niczym przerywana. Może o tym
świadczyć to że czasami zapis Ci się udaje.
Przerwania sa wylaczone na stale w calym programie, zreszta sa z definicji
wylaczone, a ja ich nigdy nie wlaczam.
From: "Maciej Zaręba" <zarebama_at_nospam_wp.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Fri, 6 Sep 2002 16:17:56 +0200
W takim razie podrzuć jeszcze procedurkę inicjującą procesor (chodzi mi
głównie o inicjacje rejestrow OPTION,INTCON. A i sprawdz po zapisie bit
WRERR w rejestrze EECON1.
From: "DaNTe" <dante_at_nospam_nospam.tvm.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Fri, 6 Sep 2002 20:39:40 +0200
W takim razie podrzuć jeszcze procedurkę inicjującą procesor (chodzi mi
głównie o inicjacje rejestrow OPTION,INTCON. A i sprawdz po zapisie bit
WRERR w rejestrze EECON1.
Nic tu nie ruszalem, sa tak jak je Microchi stworzyl, czyli maja difultowe
ustawienia.
A teraz zagazka, bo juz mi DZIALA, ale nie wiem dlaczego. Pomoglo wpakowanie
malego kondensatora miedzy mase a /MCLR .... czemu to pomoglo ?
na /MCLR mam podane +5V, opcja zapisu jest dlugo-dlugo po starcie, a
procesor na pewno nie resetuje sie.
pozdrawiam
From: "DaNTe" <dante_at_nospam_nospam.tvm.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Fri, 6 Sep 2002 20:40:55 +0200
a moze jeszcze istotne jest ze nie uzywam WDC, taktowanie ustawiam na XT, i
Power-up mam wlaczony. Nie uzywam Code protect
From: "Maciej Zaręba" <zarebama_at_nospam_wp.pl>
Subject: Re: PIC 16F84A nie zapisuje int. EEPROMU - czemu ?
Date: Fri, 6 Sep 2002 22:12:20 +0200
może po prostu "źle" się procek restartował i tyle,przynajmniej kondensator
z opornikiem powinien być (albo jakikolwiek układ resetu).