C18: Definování dat v EEPROM, které budou po kompilaci v HEX

Dobrý den, začínám s programováním v C 18 a nevím jak provést zápis dat do EEPROM již během kompilace programu. V asambleru to nebyl problém při použití zápisu.
#include p18f46k20
org 0xF00000
de 0x02, 0x04, 0x1E, 0x01, 0x0F, 0x11, 0x0F, 0x00 ; znak á

Já nevím jak tento zápis udělat v C. Bude to složit k uložení českých znaků do EEprom pro výpis na LCD display.

Předem děkuji

:arrow_right: administrator: přejmenováno z "Zápis do EEPROM"

Mam stejny dotaz. Jak nadefinovat data do eeprom PIC v C?

U mě to funguje takto, bude záležet i na překladači:

#pragma DATA _EEPROM, 0x02, 0x04, 0x1E, 0x01, 0x0F, 0x11, 0x0F, 0x00;

Práce s eeprom je to co mně štve na PICech - spíš vinou compillerů - dost to zdržuje - musíte si určit sami adresy proměnných, pro jejich zápis/čtení volat funkce, prostě přístup stejný jako do externí paěmti.

Vadí mi to proto, že třeba u takového CodeVisionu pro AVRka si prostě definujete proměnnou, pole, strukturu - cokoliv - klíčovým slovem “eeprom” a dál se o víc nestaráte a pracujete s nima jako s jinýma proměnnýma.

eeprom char cislo;

eeprom struct

{
char kod1[4]={1,2,3,4};
char kod2[4]={9,9,9,9};
char kod3[4]={0,0,0,0};
}Kody


.....................

.....................

cislo=Kody.kod1[0];
 

//atd........


když chci u PICu naplnit eeprom nějakými počátečními hodnotami, které se mi ale zapíšou jen po prvním resetu po natažení programu - požívám následující postup:

byte na nejnižší adrese 0x00 v eeprom rezervuju pro příznak, který zablokuje přepsání paměti při dalších resetech.

pro zápis a čtení eeprom mám funkce:
void write_eeprom(unsigned int adresa,unsigned char data)
unsigned char read_eeprom(unsigned int adresa)

//definice "ukazatelů" do eeprom

char kodAdr1=0x01;
char kodAdr2=0x05;
char kodAdr3=0x09;

char Kod1[4];
char Kod2[4];
char Kod3[4];

.................
.................
.................

void main()
{
//nejaka inicializace
........

........
// 

if(read_eeprom(0x00))//měla by být FF
 {
  for(i=0;i<4;i++)write_eeprom(kodAdr1+i,1);
  for(i=0;i<4;i++)write_eeprom(kodAdr2+i,2);
  for(i=0;i<4;i++)write_eeprom(kodAdr3+i,3);
  write_eeprom(0x00,0);  //zablokuje další přepsání po resetu
 }

//přetažení dat z eeprom do RAM
for(i=0;i<4;i++)Kod1*=read_eeprom(kodAdr1+i);
for(i=0;i<4;i++)Kod2*=read_eeprom(kodAdr2+i);
for(i=0;i<4;i++)Kod3*=read_eeprom(kodAdr3+i);

while(1)
 {
  .......
  .......
  }
}

**

Jak je z mojeho příkladu vidět eeproma by měla sloužit spíš k ukládání proměnných u kterých potřebujeme zachovat jejich hodnoty i po výpadku napájení - ty ji ale chceš spíše použít pro uložení konstant - podle mně zbytečně - těch 64 bytů pro 8 uživatelských znaků, které můžeš pro displej maximálně definovat ti už tolik místa v programové paměti nezabere :slight_smile:*

To mi nefunguje, nebo dělám něco špatně. Překladač je C18 od Microchipu.
Při překladu hlásí Warning [2002] unknown pragma ‘DATA’.

To bude tím, že Petr používá jiný překladač.

Možná, když s Céčkem začínáš tak nevíš, že v C18 můžeš psát i v asm - to píšeš, že ti jde v pohodě, tak si prostě ten kousek napiš v asembleru :slight_smile:

_asm //kód v asm _endasm

To jsem našel v helpu, že jde vložit do céčka ASM. Ale nefungovalo to. Nějaký syntax error na řádku s instrukcí _asm .
Ještě to zkusím znova, až budu u počítače s MPLabem.

Kdepak, nejde. Kde dělám chybu?
Ani v testovacím prográmku to nemohu rozchodit. Pořád syntax error. Ani když ASM kód uvedu do void. …
Zkoušel to napsat i podle dics.voicecontrol.ro/process_mai … tives.html a nic

a nevztahuje se ten syntax error na tohle

de 0xF5F,0x65,0xFF,0xFF… ?

jinak ten odkaz máš na HiTech - to je ten překladač co s ním asi dělá Petr.

V tom odkaze níž na stránce se baví i o C18. Syntax error hlásí už u příkazu _asm, první řádky programu na obzázku nejsou vidět.

našel jsem diskuzi microchip.com/forums/tm.aspx?m=39367

#pragma romdata eedata_scn=0xf00000
rom unsigned char eedata_values[16] = {0xAA, 1, 2, 3, 4, 5, 6, 0xAA, 0xAA, 0xFF, 2, 3, 4, 5, 6, 0xAA};
#pragma romdata

Tento zkušební (nelekejte se) kód asi funguje, po načtení do IC-prog se objeví v okně pro eeprom.

Ještě jak ho rozdělit, aby byl přehledně zapsaný po osmi bajtech na řádku jako u ASM?

už to asi mám microchip.com/forums/m587333-print.aspx

#pragma romdata eeprom_data=0xf00000 rom unsigned char eedata_values] = { 0x96,0x00,0x00,0x00,0xA0,0x0F,0x00,0x00, 0xAA,0x00,0x00,0x00,0xA0,0x0F,0xAA,0xAA, 0x96,0x00,0x00,0x00,0xA0,0x0F,0x00,0x00, 0x96,0x00,0x00,0x00,0xA0,0x0F,0x00,0x00, 0x96,0x00,0x00,0x00,0xA0,0x0F,0x00,0x00, 0xAA,0x00,0x00,0x00,0xA0,0x0F,0xAA,0xAA, 0xAA,0x00,0x00,0x00,0xA0,0x0F,0xAA,0xAA, 0xD0,0x07,0x00,0x00,0x21,0x00,0x00,0x00}; #pragma code

Dnes jsem to zjišťoval u zkušenějších PICařu- ale Venca mně předešel - je to tak jak píše a funkční.
Tou direktivou se překladači řekne, na které adrese budou začínat romdata - to jsou ty definované jako “rom” (rom char, const rom int, atd…). Můžeš tedy v eepromě definovat jakýkoliv datový typ, což jsem si do dneška myslel, že nejde - no člověk se pořád něco učí :slight_smile: .

Jen si musíš ověřit v DS, kde začíná eeproma u tvojeho typu - nemusí to být nutně na 0xf00000, ale pravděpodobně bude.