[ mnn @ 12.07.2011. 18:24 ] @
Kako upisujete promenljive tipa integer ili double u interni eeprom mikrokontrolera ?Kod upisa promenljivih tipa char koristim standardno
Code:

vrednost = read_eeprom (adresa);

odnosno

Code:


write_eeprom (adresa, vrednost);

Kod upisa tipa integer prvo sam razbijao promenljivu na jedinice ,desetice...,pa ih posebno upisivao na pojedinacna mesta.Kad imam malo promenljivih to mi ne smeta ,ali kad treba da upisem promenljivu tipa double to mi izgleda glupavo ,pa me zanima kako to ostali resavaju.
[ rsinisa @ 12.07.2011. 18:37 ] @
O kom jeziku je reč? Neki imaju mogućnost da smeste sve bajtove odjednom (ako je višebajtna promenljiva), a kod nekih mora jedan po jedan bajt.

Pozdrav.
Sinisha
[ mnn @ 12.07.2011. 18:57 ] @
U pitanju je C , Hi Tech C.
[ rsinisa @ 12.07.2011. 19:21 ] @
Ne pričam taj jezik, ali za par minuta pretrage po netu sam video da sintaksa podržava samo upis i čitanje jednog bajta.

Pozdrav.
Sinisha
[ bogdan.kecman @ 13.07.2011. 06:46 ] @
jedinice, desetice ?!?!?!?

treba da znas koliko bajtova je koja promenjljiva ... int je kod vecine kompajlera za 8bitne mcu-e 2 bajta, ja volim da koristim "sigurne" tipove tipa int8, int16, int32 ili BYTE, WORD, DWORD

najlakse da pristupas bajt po bajt .. ako se dobro secam hitech to ume (ja preferiram ccs kod njega to radi)
isto ovo radi i za WORD i za DWORD i float i double i ..

Code:

BYTE *p;
BYTE i, adresa;
double x; 

x = 123.123; // vrednost koju hoces da zapamtis
adresa = 10; // adresa gde hoces da zapamtis
p = (unsigned char *) &x;
for (i = sizeof(double); i != 0; i--) eeprom_write(adresa++, *p++);

adresa = 10;
p = (unsigned char *) &x;
for (i = sizeof(double); i != 0; i--) *p++ = eeprom_read(adresa++); 


[ goran_68 @ 13.07.2011. 07:54 ] @
Ako promenljive deklarišeš ovako:

unsigned char adresa;
unsigned long vrednost;

union lng
{
long l;
unsigned long ul;
int i[2];
unsigned int ui[2];
char b[4];
unsigned char ub[4];
}ltmp;


Onda kod može da izgleda ovako:

ltmp.ul = vrednost;

write_eeprom(adresa, ltmp.ub[0]);
write_eeprom(adresa + 1, ltmp.ub[1]);
write_eeprom(adresa + 2, ltmp.ub[2]);
write_eeprom(adresa + 3, ltmp.ub[3]);

isto je i za read





[ mnn @ 14.07.2011. 18:14 ] @
Bogdanovo resenje radi,a ovo goranovo_68 nisam probao.
Nadam se da će ovo još nekome pomoći.
Pozdrav
[ tox!e @ 21.10.2011. 16:30 ] @
Takodje imam problema sa upisom u interni eeprom kod pic16f887 . Citanje je ok, probavao razlicite kodove, citao datasheet od istog sve radim kako treba.
Koristio custom funkcije, a pokusavao sam i sa Hi-Tech C compilerovim funkcijama eeprom_write(address, data) , kao i njihov macro EEPROM_WRITE(address, data) .
Ako upisem rucno ili inicijalizujem neke vrednosti, onda ih on iscita kako treba, ali meni treba da program moze da vrsi citanje i upis.

Code:
void eeprom_wr(unsigned char address, unsigned char data) 

GIE=0;
while (WR) continue;
EEADR = 0x01;

EECON1 == 0x7F;
WREN=1;
EEDATA = 0x02;

EECON2    =    0X55; 
EECON2    =    0XAA; 
WR     =    1; 
WREN    =    0;
GIE    =    1; 

/*    
    while (WR) continue;
    EEADR    =    address; 
    EEDATA    =    data; 
    RP0    = 1;
    EEPGD    =    0; 
    WREN    =    1; 
        GIE     =    0; 
    EECON2    =    0X55; 
    EECON2    =    0XAA; 
    WR     =    1; 
    GIE    =    1; 
    WREN    =    0;
*/    



Ni jedan ne radi upis, dok u proteusu rade obe varijante i komentarisana i nekomentarisana.

Da li je neko imao slican slucaj sa ovim kontrolerom? Citao errata za ovaj kontroler, nisam naisao da spominju tako nesto.
[ goran_68 @ 21.10.2011. 18:13 ] @
Proveri konfiguracione bitove.
[ tox!e @ 21.10.2011. 18:30 ] @
__CONFIG(XT & WDTDIS & PWRTDIS & UNPROTECT & LVPDIS);
Oscillator : XT
Watchdog Timer : Off
Power Up Timer : Off
MCLR : /MCLR is external
Code protect : Off, probao i on
Data EE Read Protect : Off, probao i on
Brown Out Detect : BOD Enabled, SBOREN Disabled
Internal External Switch Over Mode : Enabled
Monitor Clock Fail-safe : Enabled
LVP : Disabled
Brown Out Reset Sel Bit : Brown out at 4.0V
Self Write Enable : No protection

[ ZAS011 @ 21.10.2011. 19:35 ] @
Citat:
tox!e: __CONFIG(XT & WDTDIS & PWRTDIS & UNPROTECT & LVPDIS);
Oscillator : XT
Watchdog Timer : Off
Power Up Timer : ON
MCLR : /MCLR is external
Code protect : Off, probao i on
Data EE Read Protect : Off, probao i on
Brown Out Detect : BOD Enabled, SBOREN Disabled
Internal External Switch Over Mode : Disabled
Monitor Clock Fail-safe : Disabled
LVP : Disabled
Brown Out Reset Sel Bit : Brown out at 4.0V
Self Write Enable : No protection


Ajde promeni u gore naznacene vrednosti
[ ZAS011 @ 21.10.2011. 19:39 ] @
Ex, da, zaboravih da dodam, Proteus je proteus a pravi hardver je nesto drugo. I najbolji simulator je tri puta losiji od PRAVOG hardvera
[ goran_68 @ 21.10.2011. 20:05 ] @
Proveri da li ono UNPROTECT zaista postavi bitove kako treba. Nalazio sam greške u include fajlovima.
[ tox!e @ 21.10.2011. 20:32 ] @
Slazem se da je pravi hardver najbolji od bilo kog simulatora, ali sa njim sam poceo da razvijam, dok mi nije stigao doticni kontroler. Takodje mnogo mi je komotnije da koristim in circuit debugging nego preko simulacije, ali ok.
Probao sam da namestim konfiguracione bitove, ali isto se desava. Gledao sam i UNPROTECT u pic16f887.h vrednost 0x3fff sto je koliko znam ok.

Isto probao sa kompajlerovim funkcijama, a i sa ovim, koje sam postavio.
Ali i dalje nece. :(

[ goran_68 @ 21.10.2011. 23:01 ] @
Ovaj izraz ti nije dobar:
EECON1 == 0x7F;

Takođe, po meni nepotrebno:
RP0 = 1;


void eeprom_wr(unsigned char address, unsigned char data)
{
EEADR = address;
EEDATA = data;
EEPGD = 0;
WREN = 1;
GIE = 0;
while(GIE){};
EECON2 = 0X55;
EECON2 = 0XAA;
WR = 1;
GIE = 1;
WREN = 0;
}

Kako i kada proveravaš da li ti je upisan željeni sadržaj u eeprom?
[ tox!e @ 21.10.2011. 23:07 ] @
Pazi, ali nece ni kompajlerova eeprom_write funkcija da radim, ali sadcu da probam i ovo.
Sto se sadrzaja tice proveru vrsim na vise nacina:
1. pustim program da radi, zatim sa pickit2 iscitam eeprom
2. idem preko debuggera, postavim bp na funkciju za upis, kada se ona izvrsi pustim jos da radi program, pa pauziram i opet iscitavam vrednosti
3. softverski znam sta sam upisao, i na tu kombinaciju tastera, treba da odreaguje. ako odreaguje onda ok, ako ne onda nevalja. to znam da 100% radi, jel ako upisem rucno u eeprom onda fercera, ali mi to nije resenje, jel treba i on s vremena na vreme da menja sadrzaj eeproma.

Mada kako gledam Microchipov forum, dosta ljudi ima slicnih problema. No ujutru cu probati sa eksternim napajanjem, a i pregledacu kondenzatore na oba Vcc i Vss od kontrolera. Mozda ga to muci.

[Ovu poruku je menjao tox!e dana 22.10.2011. u 00:19 GMT+1]
[ bogdan.kecman @ 22.10.2011. 00:17 ] @
ako ne mozes da upises u 16F-ov EEPROM obicno je

1. nemas eeprom (da ima i takvih 16F-ova)
2. nisi stavio decoupling kondove
3. zabranio si pisanje po epromu (fuse bitovi)
4. crko ti eeprom (oce i to da se desi)

Ako sam ja dobro shvatio ti pokusavas to sa PIC16F887 ?

Da li koristis interni oscilator ili externi? Ako je externi koji?
[ tox!e @ 22.10.2011. 07:37 ] @
Koristim externi. Kristal od 8MHz i 2 kondenzatora od 22pF. Nije valjda da sam takve srece da uzmem nov kontroler i da mu je gotov EEPROM. Koje vrednosti preporucujes za decoupling kond. 100nF ?
[ goran_68 @ 22.10.2011. 08:41 ] @
Za probu ti preporucujem da napravis zaseban projekat u kome ces u while petlji najpre upisivati nesto u eeprom a potom posle nesto vremena procitati sadrzaj te lokacije. Ukoliko se sadrzaj poklapa sa zeljenim digni ili spusti neki pin. I tako za sve lokacije internog eeproma. Samo to i nista vise. Zabrani interrupt-e, bez perferija, bez debugger-a, iskljuci watchdog i sl.Obezbedi na pocetku programa nekoliko sekundi pauze pa kreni u while. Ja nikada nisam imao problem sa internim eepromom ali ko zna moguce je da nesto kod tog pica nije u redu.
[ bogdan.kecman @ 22.10.2011. 13:02 ] @
100n je ok za decoupling
na novom mi se nikad nije desilo da ne radi eeprom
evo ti jednostavan kod i hex (picc) pa probaj .. napeci ga, pusti da radi par sekundi i onda ga iskaci i procitaj sta psie u eepromu .. (rece da imas pickit) ... ja sam sad probao na 887 i radi

Code:

#include <16F887.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES LVP                      //Low voltage prgming, B3(PIC16) or B5(PIC18) NOT available for I/O

#use delay(clock=8000000)

void main()
{
  unsigned char i;
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard

   while(1){
      for (i = 0; i < 100; i++) write_eeprom(i, i);
      delay_ms(1000);
   }   
}


HEX:
Code:

:1000000000308A001A28000023308400831300087F
:10001000031917280230F800F701F70B0D28F80B29
:100020000C289730F700F70B1328800B0A288A1149
:100030000A125A28840183131F308305831603177D
:100040000908C039890003131F129F1200300317DB
:10005000880083128701880189018701880189014D
:100060000313A1012108633C031C55282108031731
:100070008D000313210803178C0083168C130C15B5
:10008000831203130B08F7008B13831603175530E5
:100090008D00AA308D008C148C184C280C11770818
:1000A000831203138B04A10A32280430A200FA3011
:0C00B000A3000428A20B5728312863008D
:04400E00C230FF3F7E
:00000001FF
;PIC16F887
;CRC=A4AF  CREATED="22-Oct-11 14:00"

[ tox!e @ 22.10.2011. 13:30 ] @
Hvala na hexu. EEPROM jeste upisan, vrednosti od 0x00 do 0x63 .
To me dovodi do zakljucka, da kompajler nesto pobrka ili kod nesto ne radi kako treba.
Probao iste fuse bitove kao sto je kod tebe u kodu i isto se ponasa, nema upisa. Rece mi da koristis PICC .
Meni u ovom stadijumu bas i ne bi godilo prelazak na drugi kompajler, posto mi je projekat vec pri kraju, samo mi eeprom deo nedostaje. No smislicu nesto, ako nista drugo jedino resenje ce biti da se uzme objekat od eeprom_write funkcije i da se koristi u Hi-Tech C-u.
[ bogdan.kecman @ 22.10.2011. 13:46 ] @
Citat:
tox!e
Meni u ovom stadijumu bas i ne bi godilo prelazak na drugi kompajler, posto mi je projekat vec pri kraju, samo mi eeprom deo nedostaje. No smislicu nesto, ako nista drugo jedino resenje ce biti da se uzme objekat od eeprom_write funkcije i da se koristi u Hi-Tech C-u.


probaj da napravis isti kod kao sto sam ja stavio u picc-u, dakle samo upisi nesto u eeprom, da vidis da li to radi ok .. budi siguran da koristis unsigned char .. probaj dakle bez tvoje aplikacije, pa onda ako radi uporedi sa tvojom aplikacijom
[ tox!e @ 22.10.2011. 15:47 ] @
Bice da je do kompajera.
Sada bas gledam meni je PICC verzije V9.60 sada skidam novi, pa cu da vidim, sta kaze. Imao sam slucaj sa CCS C kompajlerom da kod koji sam napisao je radio, u medjuvremenu stavio drugu verziju kompajlera, i nece pa nece taj kod da radi, iako ga ok iskompajlira. Tek kada sam vratio tu stariju verziju, proradilo je sve kako treba. Javljam sta sam uspeo.

Jeste do kompajlera je bilo. Sada sam stavio 9.83 i upisuje kako treba. Hvala u svakom slucaju na pomoci :)

[Ovu poruku je menjao tox!e dana 22.10.2011. u 17:06 GMT+1]

[Ovu poruku je menjao tox!e dana 22.10.2011. u 20:12 GMT+1]