Fórum témák

» Több friss téma
Fórum » PIC EEPROM írás nem megy
Lapozás: OK   3 / 4
(#) rakos28 hozzászólása Márc 27, 2009 /
 
Köszönöm szépen ez gyors volt!
(#) szigetivan hozzászólása Márc 28, 2009 /
 
Sziasztok!

Én is megpróbálta az EEPROM írást/olvasást, és a végén olvasáskor nem azt az értéket adja vissza mit beleírtam:S
Hol a hibáztam, miért nem jó?

Köszi
(#) icserny válasza szigetivan hozzászólására (») Márc 28, 2009 /
 
Elindítod az írást, aztán mielőtt befejeződne, le is tiltod. Mire számítottál?

  1. bcf     INTCON,7        ;GIE = "0", a megszakítások tiltása
  2.         bsf     EECON1,2        ;WREN = "1", az írás engedélyezése
  3.         movlw   H'55'   ;W = H'55'
  4.         movwf   EECON2  ;EECON2 = H'55', írás inicializálás
  5.         movlw   H'AA'   ;W = H'AA'
  6.         movwf   EECON2  ;EECON2 = H'AA', írás inicializálás
  7.         bsf     EECON1,1        ;WR = "1", az írás indítása
  8.         bsf     INTCON,7        ;GIE = "1", a megszakítások engedélyezése
  9.         bcf     EECON1,2        ;WREN = "0", az írás tiltása



Ha visszalapozol ide, akkor láthatsz egy működő változatot. Azt kellen követni! Abban van egy várakozás az írás végére (amit EECON1.WR 0-ba billenése jelez).
(#) szigetivan válasza icserny hozzászólására (») Márc 28, 2009 /
 
Szia!

Köszi az észrevételt, átírtam, de még így sem az általam beírt értéket olvassa vissza (32 helyett 255-öt).
Mit nem vettem észre?
(#) icserny válasza szigetivan hozzászólására (») Márc 28, 2009 /
 
1. Ne késleltetést rakj be, hanem a bitváltást figyeld! Úgy, ahogy a mintaprogramban is van.

2. Próbálj áttekinthetőbben programozni! (pl. a speciális funkciójú regiszterek bitejeinek a szimbolikus nevét használd a sorszámuk helyett)!
(#) szigetivan válasza icserny hozzászólására (») Márc 28, 2009 /
 
"Ne késleltetést rakj be, hanem a bitváltást figyeld!"
Ezt kifejtenéd bővebben,h. hogy érted?

Köszi
(#) icserny válasza szigetivan hozzászólására (») Márc 28, 2009 /
 
Idézet:
„Ezt kifejtenéd bővebben,h. hogy érted?”


Ebben már kifejtettem.
(#) szigetivan válasza icserny hozzászólására (») Márc 28, 2009 /
 
Szia!

Kijavítottam, ahogy kérted, csak a fáradságtól nem tudtam tisztán gondolkodni.
De úgy tűnik mégse mindent, mivel még mindig az a probléma,h. az olvasás végén 63 helyett 255-t ad vissza ennél a sornál.

bsf EECON1,RD

Ötlete lenne valakinek,h.mi lehet a hiba?
(#) icserny válasza szigetivan hozzászólására (») Márc 28, 2009 /
 
  1. movlw   CIM     ;W = CIM

Több helyen is látok ilyen utasításokat, amelyek nem azt csinálják, amit szeretnél. A változó tartalma helyett a változó címét rakják a W regiszterbe.

Tehát: (f) -> w helyett f -> w hajtódik végre, ahol a '()' jelentése: 'tartalma' valaminek.

Az olvashatóság már nagyon sokat javult. Még egy javaslat:

  1. movf    EEDATA,0

helyett írd úgy, hogy:

  1. movf    EEDATA,W


vagy így:
  1. movfw   EEDATA
(#) szigetivan válasza icserny hozzászólására (») Márc 28, 2009 /
 
Köszi szépen a javaslatokat, így már nekem is sokkal átláthatóbb a program

Idézet:
„(f) -> w helyett f -> w hajtódik végre”


Hogy írjam,h.jól hajtódjanak végre ezek a parancsok??
Most próbálgattam, de még nem lett meg a keresett eredmény..
(#) icserny válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
Idézet:
„Hogy írjam,h.jól hajtódjanak végre ezek a parancsok?”

A parancsok abszolút jól hajtódtak végre! Csak nem azt a parancsot használtad, ami az adott feladathoz kellett!

Ez az utasítás szolgál egy memóriarekesz TARTALMÁNAK elővélelére.

Nézd meg az előző beírásom második részét is!
(#) szigetivan válasza icserny hozzászólására (») Márc 29, 2009 /
 
Szia!

Köszi, de próbáltam így is:
movlw b'00100000'
movwf CIM
movf CIM,W
banksel EEADR
movwf EEADR

és így is:
movlw b'00100000'
banksel EEADR
movwf EEADR

Ezért írtam,h.még mindig nem jó sajna. Vagy még lehet,h.mindig nem értem és teljesen belezavarodtam ebbe a primitív utasításba

Idézet:
„1. movfw EEDATA”

Ezt nem írtad el véletlenül? (movwf)
(#) potyo válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
Tedd fel, hogy mivel próbálkozol!
(#) szigetivan válasza potyo hozzászólására (») Márc 29, 2009 /
 
Egy egyszerű EEPROM írást akarok csinálni, majd kiolvasni a beírt értéket..
(#) icserny válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
Én a programod egy másik helyén talált utasításról írtam:
[quote=]movf EEDATA,0 ;W = EEDATA, az eredmény kiolvasása[/quote]

Ez az ellenkező irányba mozgatja az adatot (legalábbis a komment szerint).
(#) potyo válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
Szerintem amikor kiadod a BANKSEL INTCON2 makrót, akkor az átvált a nullás bankba, az EECON2 pedig a hármas bankban van!
(#) szigetivan válasza icserny hozzászólására (») Márc 29, 2009 /
 
Szia!

A programom kommentekkel együtt egy mintaprogram, amit csak ki szerettem volna próbálni..Bővebben: Link
De most már nagyon szeretném,h. végre működjön!
(#) cszotyi válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
Helló!
A gondod az hogy nem jókor használod a banksel makrót,
például az ADAT regiszterd a 0x21-es címen van ami a BANK0-ban található, de te épp a BANK2-ben akarod beleírni és kiolvasni az értéket.
A banksel INTCON utasítás pedig nem kell, mivel az INTCON regiszter mind a 4 bankból elérhető.
Remélem érthető voltam.
(#) szigetivan válasza cszotyi hozzászólására (») Márc 29, 2009 /
 
Szia!

Megcsináltam, ahogy mondtad, mert jogos volt, amit leírtál, de semmi változás
Neked így működött, jó értéket adott vissza??
(#) szigetivan válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
Sziasztok!

Most már fut a progi
Ez a parancs így jó benne?

varok btfss EECON1,WR

Mert máshol btfsc-t láttam..
(#) icserny válasza szigetivan hozzászólására (») Márc 29, 2009 /
 
1. A szimulátor szerint az írás nem működik a programodban.
2. A PIC16F690 adatlapja szerint EEDAT a megfelelő regiszter neve, nem pedig EEDATA. Ennek ellenére EEDATA névvel is működni látszik a dolog.
3. Ahogy korábban már említették, a BANKSEL INTCON sor elrontja a regiszterek címzését. Hagyd ki!!!

  1. main
  2.         movlw   b'00100000'     ; w = 32
  3.         banksel EEADR
  4.         movwf   EEADR       ;EEADR = CIM   W-->EEADR
  5.         movlw   b'00111111'
  6.         movwf   EEDATA      ;EEDATA = ADAT
  7.         banksel EECON1
  8.         bcf     EECON1,EEPGD    ;EEPGD = "0", az EEPROM kiválasztása
  9.         bsf     EECON1,WREN     ;WREN = "1", az írás engedélyezése
  10.         bcf     INTCON,GIE      ;GIE = "0", a megszakítások tiltása
  11.         movlw   H'55'   ;W = H'55'
  12.         movwf   EECON2  ;EECON2 = H'55', írás inicializálás
  13.         movlw   H'AA'   ;W = H'AA'
  14.         movwf   EECON2  ;EECON2 = H'AA', írás inicializálás
  15.         bsf     EECON1,WR       ;WR = "1", az írás indítása
  16. varok
  17.         btfsc   EECON1,WR       ;várunk, amíg befejeződik az írás: ekkor WR 0 lesz
  18.         goto    varok
(#) szigetivan válasza icserny hozzászólására (») Márc 30, 2009 /
 
Sziasztok!

Köszi mindenkinek a kitartó segítséget, kicsit nyögvenyelősen, de megoldódott a probléma
A programot soros porton teszteltem és működik
Akit érdekel csatoltam!
(#) icserny válasza szigetivan hozzászólására (») Márc 30, 2009 /
 
Idézet:
„Ez a parancs így jó benne? varok btfss EECON1,WR”


Azt neked kell eldönteni, hogy mit akarsz csinál(tat)ni a programban.

Ha a WR bit nullára váltását akarod megvárni, akkor nyilvánvalóan nem jó. De erre magad is rájönnél, ha megtennéd azt a szívességet, hogy végre elolvasnád a PIC adatlapját, s áttanulmányoznád benne, hogy mit csinálnak az egyes utasítások. (Ezt nyugodtan veheted letolásnak!)
(#) szigetivan válasza icserny hozzászólására (») Márc 30, 2009 /
 
Szia!

Köszi a letolást kell az néha
Amúgy igen már vettem a fáradságot és elolvastam azokat a részeket mik ehhez kellenek és tudom,h.nem jó az amit írtam, csak egy miértre vagyok kiváncsi, h. ha btfsc-t írok, akkor miért nem megy végig a program és miért áll meg itt (szimulálásnál)??
És elismerem,h.mivel nem régóta foglalkozom PIC-el és nem is folyamatosan, ezért igen jönnek elő mindig kérdések, mivel ezek nekem új dolgok..
Sorry ha sokat kérdek, írok!
(#) icserny válasza szigetivan hozzászólására (») Márc 30, 2009 /
 
Itt már belinkeltem a működő változatot. Nem áll le.
(#) szigetivan válasza icserny hozzászólására (») Márc 30, 2009 /
 
Igen tudom, kösz.
(#) andriopulos hozzászólása Júl 5, 2011 /
 
Nekem is ilyen probélmám van. A prg. beír egy byte-ot az első címre, kiolvassa, és a kiolvasott értéket kiteszi a portra villogtatni. Így működik is. Ekkor már az EEPROMban benne kellene, hogy legyen az adat. Ha azonban újra fordítom úgy, hogy az írás kimarad, és csak kiolvasni kéne az adatot, és bekapcsolom, akkor már nem lesz benne az adat. (Ez persze csak egy tesztprogram). Mit rontok el? Tud valaki segíteni?

#include
#include
#include

void Write_b_eep(unsigned int badd,unsigned char bdata);
unsigned char Read_b_eep( unsigned int badd );
void main(void)
{
int i;
int ReadData1=0;
TRISA = 0x00; LATA = 0;
TRISD = 0x00;
LATA = 0x02;
Write_b_eep(0x00,0x01);
for (i=0;i<10000;i++); //várakozás
ReadData1 = Read_b_eep(0x00);
for (i=0;i<10000;i++); //várakozás
while(1)
{
for (i=0;i<5000;i++)
{
LATA = 0x01;
LATD = ReadData1;
}
for (i=0;i<5000;i++)
{
LATA = 0x00;
LATD = 0x00;
}
}
}>>>>
(#) watt válasza andriopulos hozzászólására (») Júl 5, 2011 /
 
Újraíráskor felülírod az EEPROM-ot is, ha nincs kikapcsolva ez a memóriarész írásjoga a programban. A PK2-vel és a WPB-vel is lehet külön Flasht írni, de a legtöbb égető ismeri ezt a funkciót.
(#) andriopulos válasza watt hozzászólására (») Júl 5, 2011 /
 
Értem. Itt az a gond, hogy az előzőleg tárolt adat marad benne, tehát csak a program futásakor él ez az adat. Utána, ha csak az EEPROMot olvasom ki, akkor az előző adatot olvassa. És még valami: Ha futás közben PICKIT2-vel kiolvasom, akkor sikerül kiolvasni az új adatot és ezután már nem felejti el akkor sem, ha új programot égetek bele.
(most látom, hogy az inc állományokat kihagyta, de természetesen benne van).
(#) watt válasza andriopulos hozzászólására (») Júl 5, 2011 /
 
Nem teljesen értem amit írsz, de talán mindegy is, mert amit beleírsz, annak ott kell maradnia, akkor és mindöröké. Én így oldom meg az EEPROM írását:

  1. /*____________________________________
  2.         EEPROM rutinok prototípusai                                    */
  3.         unsigned char ReadEEPROM(unsigned int address);
  4.         void WriteEEPROM(unsigned int address, unsigned char data);

  1. //==================================
  2. // EEPROM olvasás rutin
  3.  
  4. unsigned char ReadEEPROM(unsigned int Address)
  5. {
  6.         EEADRH = (unsigned char)(Address>>8); // Felső EEPROM cím betöltése
  7.         EEADR = (unsigned char)Address; // Alsó EEPROM cím betöltése
  8.         EECON1bits.EEPGD = 0;   //EEPROM kiválasztása
  9.         EECON1bits.CFGS = 0;    //Flash/EEPROM kiválasztása
  10.         EECON1bits.RD = 1; // Olvasás indítása
  11.         return EEDATA; // Visszatérés a beolvasott adattal
  12. }
  13.  
  14. //==================================
  15. // EEPROM írás rutin
  16.  
  17. void WriteEEPROM(unsigned int Address, unsigned char Data)
  18. {
  19.         static unsigned char GIE_Status; // Változó a globális megszakítás bit tárolására
  20.  
  21.         EEADRH = (unsigned char)(Address>>8); // Felső EEPROM cím betöltése
  22.         EEADR = (unsigned char)Address; // Alsó EEPROM cím betöltése
  23.         EEDATA = Data; // Átadott EEPROM adat betöltése
  24.         EECON1bits.EEPGD = 0;   //EEPROM kiválasztása
  25.         EECON1bits.CFGS = 0;    //Flash/EEPROM kiválasztása
  26.         EECON1bits.WREN = 1; // EEPROM írás engedélyezése
  27.         GIE_Status = INTCONbits.GIE; // Megszakítást engedélyező bit mentése
  28.         INTCONbits.GIE = 0; // Globális megszakítás tiltása
  29.         EECON2 = 0x55; // Szükséges szekvencia az írás indításához
  30.         EECON2 = 0xAA; // Szükséges szekvencia az írás indításához
  31.         EECON1bits.WR = 1; // Írás indítása
  32.         INTCONbits.GIE = GIE_Status; // Globális megszakítás bit visszaállítása
  33.         EECON1bits.WREN = 0; // EEPROM írás engedély törlése
  34.         while (EECON1bits.WR); // Írási folyamat befejezésére várakozás
  35. }


Ha kódot akarsz beilleszteni, akkor használd a Kód gombot, vagy csatold a fájlt, ha hosszú!
Következő: »»   3 / 4
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem