Fórum témák

» Több friss téma
Fórum » PIC EEPROM írás nem megy
Lapozás: OK   2 / 4
(#) ldani válasza szilva hozzászólására (») Jan 14, 2009 /
 
Próbáltam azt is szintaktikai hibát jelez a fordító.
SFR szimbólikus név alatt mit értesz? pl EECON2? Sajnos érthetetlen okokból nem akart működni: lásd előző hozzászólások
(#) szilva válasza ldani hozzászólására (») Jan 14, 2009 /
 
A (code) és (/code) tag-ek közé kell tenni a beidézett kódot, de a code-nál meg kell adni, hogy asm vagy c forrásként formázza-e: (code=asm) vagy (code=c). Természetesen szögletes zárójelek kellenek, nem kerekek.
(#) szilva válasza ldani hozzászólására (») Jan 14, 2009 /
 
Esetleg "ACCESS" helyett csak "A"-t írva? Igen, arra gondolok, hogy valamilyen formában az EECON2 jelenjen meg ott és ne a 0xA7.
(#) ldani válasza szilva hozzászólására (») Jan 14, 2009 /
 
Megfogadtam Potyo tanácsát, és váltottam Microchip C18-ra...és elsőre sikerült működő kódot írni!

  1. #include <p18f4550.h>
  2. #include <EEP.h>
  3. void main(void)
  4. {
  5.         Write_b_eep(10,10);
  6.         while (1);
  7. }


Köszi Szilva!: egyből ki is próbáltam

Ennek ellenére nem hagy nyugodni a hi-tech-es dolog, szóval az "A"-it is kipróbáltam: ugyanúgy syntax error... :no:
(#) potyo válasza ldani hozzászólására (») Jan 14, 2009 / 4
 
Ez mostmár annyira érdekel, hogy mondd már el privátban, honnan lehetne ezt a fordítót beszerezni. Nekem csak a 16F-hez való van meg.

A 0xFA7-ből A7 onnan ered, hogy a MOVWF utasítás mellett csak nyolc bit van a memória címzésére előlátva, ezért a 0xFA7-ből csak az alsó nyolc bit fér bele, tehát a 0xA7. Mivel nem írtad mellé, hogy az ACCESS vagy a BANKED RAM-ot célzod az utasítással, ezért az alapértelmezettet, vagyis a BANKED memóriát célozta, tehát az EECON2-vel nem csinált semmit. Amikor kiírod, hogy EECON2, akkor abból tudja, hogy az ACCESS ramot kell céloznia, ezért azzal csinálhat valamit.

Az meg, hogy a gyári makró nem képes egymásután tenni a kódban a két EECON2-be történő írást, az számomra elég lenne arra, hogy ne is kisérletezzek tovább ezzel a fordítóval...

A PIC nem PC, itt sokkal kötöttebb szabályok vannak, mint a PC-nél. A PIC sokkal inkább elektronikai áramkör, és csak nagyon kismértékben számítógép.
(#) ldani válasza potyo hozzászólására (») Jan 14, 2009 /
 

Nem is tudom, hogy honnan jött nekem az a Hi-tech dolog, talán még pár évvel ezelőtt amikor elkezdtem ezekkel a dolgokkal egy kicsit babrálni. Aztán sokáig nem is foglalkoztam vele, most újra elővettem:
Hi-tech fordító
Ingyenes változat letölthető többfajta eszközhöz. Van professzionális is, állításuk szeint az gyorsabb és jobban optimalizált kódot készít, de jelentős különbség nincs. (csak annyi, hogy lehet, hogy ott működne az eepromba írás )


Ok, azt hiszem meg vagyok győzve: marad a Microchip fordítója; mégiscsak ő ismeri legjobban a saját termékét, vagy mi...
(#) icserny válasza potyo hozzászólására (») Jan 14, 2009 /
 
Idézet:
„mondd már el privátban, honnan lehetne ezt a fordítót beszerezni”

Mármint a Hitech C fordítót?
innen

Az ún. Lite módja ingyenes, ami a C18 student verzióhoz hhasonlóan korlátozottan optimalizál.
(#) potyo válasza icserny hozzászólására (») Jan 14, 2009 /
 
Azt hittem, nem az ingyenes verzió van neki, azért kérdeztem...
(#) trudnai válasza ldani hozzászólására (») Jan 14, 2009 /
 
Idézet:
„Ok, azt hiszem meg vagyok győzve: marad a Microchip fordítója; mégiscsak ő ismeri legjobban a saját termékét, vagy mi...”


Noha ez igaz, azt is figyelembe kell venni, hogy a Microchip chipek gyartasaval foglalkozik. Szoftverek gyartasahoz nem ert igazan es ez meg is mutatkozik minden teren. Sot, megkockaztatom, hogy meg a peldak, appnote-ok stb sem igazan kielegitok minden esetben, nem beszelve az USB framework-rol.

HiTech forditoit az egyik legjobbkent szoktak emlegetni, talan utana jon a ByteCraft.

A Microchip C18-nak amugy az egyik nagy hatranya, hogy nem tudja automatan kialakitani a pseudo-stack-et. Ok erre az overlay kifejezest hasznaljak es sok esetben eleg nehez manualisan kibogozni mi mehet overlay tarolasi osztalyba es mi auto-ba. Ezeket HiTech es ByteCraft teljesen automatan lekezeli, de mas eleg jo optimalizalasi technologiat is hasznalnak ami nincs ennyire kiforrva az MC18-ban.
(#) ldani válasza trudnai hozzászólására (») Jan 14, 2009 /
 
Közben feldobtam a témát a Hitech oldalára is.
Megszületett a végleges, immár tényleg működő megoldás. Az asm szakaszban MOVWF 0xFA7, c formulát kell alkalmazni, hogy helyesen forduljon a cím.

Megoldások:
Hi-Tech módra (itt sem a beépített macro, sem a beépített függvény nem működött, ezért készült saját függvény):
  1. #include <htc.h>
  2.  
  3. //sajat eepromba rogziti az adott erteket
  4. void eewritebyte(unsigned char addr, unsigned char value)
  5. {      
  6.         EEADR                   =addr;  //cím rögzítése
  7.         EEDATA                  =value; //érték rögzítése 
  8.         EECON1bits.EEPGD=0;             //adatmemoriaba irunk
  9.         EECON1bits.CFGS =0;             //nem konfigot, hanem adatot akarunk irni      
  10.         EECON1bits.WREN =1;             //írás engedélyezése       
  11.         char gie;
  12.         if (INTCONbits.GIE) gie=1;      //globális interrupt mentése
  13.         INTCONbits.GIE  =0;             //globális interrupt tiltása az írás idejére
  14.         #asm                                    //indítási szekvencia
  15.                 MOVLW 0x55
  16.                 MOVWF 0xFA7, c          //EECON2
  17.                 MOVLW 0xAA
  18.                 MOVWF 0xFA7, c          //EECON2
  19.                 BSF 0x0FA6, 0x1, c              //EECON1, WR           
  20.         #endasm
  21.         while (EECON1bits.WR);          //várunk, amíg befejeződik az írás: ekkor WR 0 lesz
  22. //      while (!PIR2bits.EEIF);         //várunk, amíg befejeződik az írás: ekkor EEIF 1 lesz
  23.         PIR2bits.EEIF   =0;                     //töröljük az írásvége jelet
  24.         EECON1bits.WREN =0;             //írás engedély visszavonása       
  25.         if (gie) INTCONbits.GIE =1;     //globális interrupt visszaállítása
  26. }


Microchip C esetén megy a beépített függvény:
  1. #include <p18f4550.h>
  2. #include <EEP.h>
  3.  
  4. void main(void)
  5. {
  6.         Write_b_eep(10,10);             //cím, adat
  7.         while (1);
  8. }



Egy moderátor bekertezné ezt a hozzászólást, hogy később, ha keresgél vki, akkor a megoldás összegyűjtve ki legyen emelve?
(#) watt válasza trudnai hozzászólására (») Jan 15, 2009 /
 
Idézet:
„Sot, megkockaztatom, hogy meg a peldak, appnote-ok stb sem igazan kielegitok minden esetben, nem beszelve az USB framework-rol.”

Idézet:
„HiTech forditoit az egyik legjobbkent szoktak emlegetni”

Egyetértek(annak szokták emlegetni), annak ellenére, hogy ez az eeprom-os probléma jól rácáfol a véleményedre.
(#) watt válasza ldani hozzászólására (») Jan 15, 2009 /
 
Feldobom tárgyalásra, hogy mi van akkor, ha a 21. sorban nem teljesül a feltétel hiba miatt(nem néztem még, hogy a C18 hogyan oldja meg a beépített függvényében...)?
A másik felvetésem, hogy a 25. sorban nem lenne elég egy INTCONbits.GIE = gie; ? Gyorsabban lefut és a gie már tartalmazza a megfelelő állapotot.
(#) szilva válasza watt hozzászólására (») Jan 15, 2009 /
 
A pontos körülményeket nem lenne rossz ismerni. Tegnap ugyanis tettem egy kísérletet, letöltöttem a Hi-tech PICC18 Pro fordítóját, és megnéztem a generált kódot lite majd 45 napra aktivált full módban is.

Lite módban használva elvileg minden optimalizáció kikapcsolása mellett korlátlan méretű kódot lehet vele gyártani. Erősen kétséges azonban, hogy így használható lenne valamire is, mivel az asm kódban minden utasítás után 2 teljesen feleleges MOVLB volt, valamint időnként még szerintem oda nem illő MOVLW-k is. Nem véletlen tehát, hogy figyelmeztet is a fordító: a teljes verziónál sokszor hosszabb és lassabb az így kapott kód. Ha esetleg ilyen módban próbálsz meg C utasításokkal EEPROM-ot írni, az biztos nem lesz jó, kizárt dolog, hogy a 0x55-0xAA szevkencia megfelelő időzítéssel kiküldésre kerüljön.

Teljes üzemmódban az egyszerű main-emet, amiben csak nem használt változókkal csináltam ezt-azt, úgy kioptimalizálta, hogy mindössze egy önmagára ugró GOTO maradt belőle (while(1){} -ben voltak az amúgy értelmetlen, számolásos műveletek). Igaz, EEPROM-os kódot nem próbáltam így generálni vele, de lenne esélye, hogy ilyenkor akár C utasításokkal is megfelelő lenne a szekvencia.
(#) szilva válasza watt hozzászólására (») Jan 15, 2009 /
 
Létezhet olyan, hogy nem esik vissza az a bit nullára? Ha igen, akkor az elég gáz, akkor valami timeoutot be kellene építeni.

Ha jól emlékszem, van egy WRERR bit valamelyik regiszterben, ha hiba történik, akkor talán annak kellene jeleznie, de a WR-nek szerintem illene visszaállnia 0-ra a beépített időzítés leketyegése után. De ezt most nem az adatlap alapján mondom, azt el kellene olvasni, de most nincs előttem.
(#) ldani válasza watt hozzászólására (») Jan 15, 2009 /
 
Teljesen jogos az észrevételed a végtelen ciklus miatt.
Én két megoldást tudok elképzelni:
-Talán a könyebb megoldás, hogy a ciklus belsejében egy int-et inkrementálunk és a ciklusfeltételben kilpésnek számít az írás befejezése, vagy a változó maxint-té válása. Következő utasításban vizsgálandó a változó, amely ha maxint, akkor hiba volt és false-al visszatérünk (persze ekkor nem void lesz a fgv) ellenkező esetben folytatódhat a program.

-Csinálunk egy globális bit változót pl error néven, amely alapesetben 0. while előtt indítunk egy timert, melynek lejárása bebillenti error-t 1. ciklusfeltétel szintén változik az error változót is elevéve. A while után, ha error==1, akkor visszatértünk hibával, egybként folytatódhat a függvény.

A GIE-es dolgot én is eredetileg úgy írtam, ahogyan te említed, vki javasolta, h írjam át, amikor még nem ment progi, azóta meg így maradt De tényleg egyszerüsíthető!
(#) ldani válasza szilva hozzászólására (») Jan 15, 2009 /
 
Oops tényleg!
Hiszen az elején, amikor nem ment a progi (mert rossz volt az előírt asm seq), akkor mindig kilépett a kérdéses while-ból és bebillent a WRERR. Szóval előző hozáaszólásom csak annyiban módosul, hogy nem kell timer sem és glob.változó sem, viszont a fgvnek nem void kell és a while után figyelni kell WRERR-t és annak fügvényében esetleg hibával visszatérni!
(#) trudnai válasza watt hozzászólására (») Jan 15, 2009 /
 
Csak halkan jegyzem meg, hogy voltak olyan PIC-ek, ahol gond volt az EEPROM irasaval - ha jol emlekszem egy mid-range szeria volt, ill az osszes olyan mid-range ami ugyanarra az eeprom modulra epitkezett rendelkezett a problemaval.

Annak az volt a kovetkezmenye, hogy az iras inditasa utan azonnal ugy erzekelte az iras befejezodott mar. Namost mikor tobb adatot is akart az emberke kiirni akkor emiatt a kiiras sikertelen lett. A megoldas valami jatek volt a sleep korul, most pontosan nem ugrik be mi is volt - ill. a masik megoldas mikor az ember besaccolta, hogy kell neki 5-10ms es kenyszer varakozassal, a bit figyelese nelkul irta ki a cuccot.
(#) trudnai válasza trudnai hozzászólására (») Jan 15, 2009 /
 
Idézet:
„Ha igen, akkor az elég gáz, akkor valami timeoutot be kellene építeni.”


Pontosan ilyenekre valo a WDT Teszt rendszerben a resetre ra lehet aggatni debug LED-eket, amik meg azt is jelzik miert tortent reset. Tehat EEPROM irasa elott beallit a paciens egy belso flag-et, hogy milyen kritikus muvelet kovetkezik, es WDT reset eseten a megfelelo LED kodot kivilagitja igy azonnal diagnosztizalhato miert tortent a WDT.

Elesben pedig a hiba kivedesere kivalo. Nyilvan nem arra kell hasznalni, hogy uzemszeruen igy mukodjon, de ilyen jellegu problemakat eleg jol lehet ezzel diagnosztizalni ill. elesben az eszkozt mukodo allapotban tartani anelkul, hogy barmifele overhead-je legyen az alkalmazasunknak.
(#) watt válasza ldani hozzászólására (») Jan 15, 2009 /
 
WRERR-el kapcsolatban neked is és szilvának is igaza van! De figyelni érdemes szerintem. A gyári rutint megnézem majd, mert kíváncsi vagyok hogy oldják meg a nagyok!
(#) watt válasza trudnai hozzászólására (») Jan 15, 2009 /
 
Ilyen PIC-el nem hozott össze a jó sors, de ezt is elteszem a hasznos infók közé a polcra!
(#) potyo hozzászólása Jan 15, 2009 /
 
Amúgy most csináltam 12F683-ra ilyen mérést, hogy valós körülmények között maximum meddig tart egy rutin lefutása. Ez az eeprom-ba írja be az időtartamot, és simán elsőre megy. Csak azért említem, mert a Hi-Tech fordítóval csináltam. Bár azthiszem, ez nem az ingyenes verzió, ezért megyek is a sarokba, és legközelebb SDCC-vel csinálok ilyesmit.
(#) szilva válasza potyo hozzászólására (») Jan 15, 2009 /
 
Én ma délben olvasgattam a Hi-tech PICC18 user manualját. Abban egyértelműen van hivatkorás arra, hogy az EEPROM-ot EEPROM_WRITE és EEPROM_READ makrókkal kell kezelni. Megnéztem, a PICC doksiban még a kisbetűs, eeprom_write és eeprom_read függvényeket is emlegeti, a 18-as verzióban nem.

Ennek ellenére a kis próbaprogramomba (18F4550 CPU-t kiválasztva) beírtam kis- és nagybetűvel is, megnéztem, mit fordít belőle (ez a 45 napos, teljes értékű PICC18). A függvényes verzió úgy került bele a lefordított kódba, hogy paraméterfeltöltés után hív egy rutint, amiben a nagybetűs makró van kifejtve. A makró pedig inline belekerül fordításkor a kódba, nincs call. Az EEPROM írását engedélyező szekvencia mindkét helyen tökéletesnek látszik (igazi CPU-val itt nem tudom kipróbálni).

Most már csak arra nem emlékszem, hogy miért is nem volt jó a gyárilag beépített módszer?
(#) potyo válasza szilva hozzászólására (») Jan 19, 2009 /
 
Most próbáltam ki a Lite verzióval a cuccomat, és ezt kaptam a gyári illetve kézi módszerre (természetesen az EEPROM-ba nem kerül bele semmi).

És még ezt odaírja a Build ablakba: Running this compiler in PRO mode, with Omniscient Code Generation enabled,
produces code which is typically 52% smaller than in Lite mode.

Hát ha csak kihagyja a szemetet, már akkor harmadára esik legalább a kódméret...
(#) wik hozzászólása Jan 30, 2009 /
 
Sziasztok!

Nem tudom hol tart a project, megosztom az én ilyen irányú tapasztalatom, hátha segítek vele:
Én egy 16F pic memoriáját írogattam, a FLASH-t.. ott tároltam némi infot.. a problémám ugyan ez volt, majd az adatlap (a PIC) tüzetes áttekintése után, rájöttem, hogy a memoriába 1 szót nem lehet írni, csak egy bizonyos mennyiséget, nálam pl minimum 8 szót lehet csak égetni!
Javaslom nézd meg az erre vonatkozó részt az adatlapban!
(#) potyo válasza wik hozzászólására (») Jan 30, 2009 / 4
 
A probléma azóta megoldódott, mert mint kiderült, az ingyenes fordító tesz be mindenféleképpen plusz utasításokat, amik miatt az adatlapban megadott utasítások nem futnak le egymás után, és így nem íródik be az adat az eepromba.

Most nem kötözködésképpen, de ha én akarok valamit csinálni, akkor azzal kezdem, hogy elolvasom az arra vonatkozó részt az adatlapban. Flash írást még sosem csináltam, de erre emlékszem, hogy olvastam, hogy egyszerre több szót muszáj írni.
(#) wik válasza potyo hozzászólására (») Jan 30, 2009 /
 
Oké, bocs, azt hittem segítek...
(#) robbbb hozzászólása Jan 30, 2009 /
 
Sziasztok!

Pickit 2-vel szeretnék egy 8lábú epromot égetni(24lc256-ot).
Légyszi aki ért hozzá segítsen nekem,hogy a csatolt rajzon lévő összekötés megfelelő-e.

Előre is köszönöm!

robbbb
(#) icserny válasza robbbb hozzászólására (») Jan 30, 2009 /
 
A PICkit2 README.TX állományt kell megnézni. Eszerint pedig nem jó, mert nem a 4,5 hanem az 5,6 lábakat kell használni.

  1. Connections for 24LC devices
  2.         ---------------------------------------
  3.         PICkit 2 Pin             24LC Device Pin (DIP)
  4.         (2) Vdd !                8 Vcc
  5.         (3) GND                  4 Vss
  6.         (5) PGC                  6 SCL (driven as push-pull)
  7.         (6) AUX                  5 SDA (requires pullup)
  8.                                  7 WP - disabled (GND)
  9.                                  1, 2, 3 Ax pins
  10.                                     Connect to Vdd or GND per
  11.                                     datasheet and to set address
  12.  
  13.         ! 24LC devices may not program properly below 3.6V VDD.
  14.           This is a limitation of the PICkit 2 AUX IO pin.
(#) rakos28 hozzászólása Márc 27, 2009 /
 
Sziasztok!

Kicsit Off lennék, de megpróbálok témánál maradni,
Tudna-e nekem valaki készíteni egy eprom égetőt?
Persze nem ingyen kérem!
Valami olyan kellene ami a proszesszortól független,
mert én mint "láma" csináltattam egy jdm-et de meg se nyikkan!
Előre is köszi a segítségetekért!
emailem:rakos@koosk-misk.sulinet.hu
(#) icserny válasza rakos28 hozzászólására (») Márc 27, 2009 /
 
Ezzel az égetővel is próbálkozhatsz, vagy keresd meg Szilva fórumtársunkat, ha PICkit2 klónt szeretnél!
Következő: »»   2 / 4
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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