Programování PICů v C (XC8)

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#31 Příspěvek od lesana87 »

S PICama děláš teprve týden? Já myslela, že už léta a že bys teda mohl vědět, jak se leze ke konstantám v programové paměti. :oops:

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#32 Příspěvek od forbidden »

S PICama jo, ale s Cčkem týden. V assembleru mám konstanty v programové paměti prostě jako literály. Nemám je definovaný jako proměnný.

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#33 Příspěvek od lesana87 »

SDCC pro Z80 taky dává konstantní řetězce automaticky do programové paměti. Ale Z80 nemá oddělený programový a datový adresní prostor jako AVR nebo PIC, takže ke konstantnímu řetězci přistupuje přes pointer stejně jako k proměnnému řetězci. AVR má pro čtení z programové paměti instrukci LPM, takže se k tomu řetězci v programové paměti dostane oklikou, jak popsal mtajovsky. Ale jak to dělá PIC, když žádnou instrukci pro čtení programové paměti nemá?
Ten C překladač pro PIC negeneruje při překladu jako mezikrok kód v assembleru? Že by se to z něj dalo vykoukat.

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#34 Příspěvek od forbidden »

Konečně jsem pochopil, na co se ptáš. :) Prolezl jsem celou složku projektu, ale asm jsem neobjevil.
Možná to dělá pomocí registrů pro nepřímý adresování FSR a INDF, ale je pravda, že neznám jak nastavit pointer FSR na programovou paměť. Ani v datasheetu o tom nic nepíšou. Vůbec by mě nenapadlo o tom přemýšlet, dokud jsi se nezeptala.

Zkusil jsem ještě jednou nadefinovat:
unsigned char *test = "test promenne ulozene v programove pameti PIC16F628A";
a po zkompilování se zabraná datová paměť zvětšila a o 1 B, programová o 53 B.
Pokud dobře počítám, tak to sedí, včetně té nuly na konci. Proč se zvětšila datová o 1 B nevím, tipoval bych ten pointer, ale nesedí mi velikost, měly by to být dva B. :?

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#35 Příspěvek od lesana87 »

A jseš si jistý, že to je v programové paměti? Není to v EEPROM paměti? Programová paměť má přece 14 bitů na slovo, tak by to nezabíralo 53 bytů ale (2x?) víc. EEPROM má 8 bitů na slovo a navíc má velikost méně než 256B, takže stačí 8 bitový pointer.

Edit: Na netu píšou: The compiler implements ROM arrays with an ADDWF PC instruction followed by a series of RETLW instructions. To read an array element, the compiler places the index in the W register and generates a CALL to the start of the array. The compiler then adds the W register to the program counter and a RETLW returns the value in the W register.
Pak by ten 52 znakový string musel zabírat víc než 53 bytů.
Naposledy upravil(a) lesana87 dne 10 pro 2016, 13:22, celkem upraveno 1 x.

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#36 Příspěvek od forbidden »

EEPROM tu vůbec nepoužívám, dost pochybuju, že by ji ten překladač začal používat sám od sebe. Má to takovejto hezkej ukazatel, tak leda že by kecal.
Třeba se to v té programové ukládá kontinuálně za sebou po osmi bitech, kvůli šetření místem. :) Nepravděpodobný, vím.
Přílohy
paměť.gif
ukazatel
(19.37 KiB) Staženo 83 x
Naposledy upravil(a) forbidden dne 10 pro 2016, 13:23, celkem upraveno 1 x.

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#37 Příspěvek od lesana87 »

Aha, takže ten string nezabírá 53 bytů ale 53 wordů, tj. 53x 14bitů. Ukazatel je ve wordech.
Naposledy upravil(a) lesana87 dne 10 pro 2016, 13:24, celkem upraveno 1 x.

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#38 Příspěvek od forbidden »

No jasně, moje věčná chyba.
Tak koukám, že jsi to už našla, jak to dělá. Uvědomil jsem si, že toto vlastně používám taky. Mám tabulku a v ní uložený hodnoty, který čtu pomocí CALL a RETLW. Já programuju tak málo, že skoro s každým projektem si musím osvěžit zapomenutý základy.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“