![Smile :)](./images/smilies/icon_smile.gif)
Programování PICů v C (XC8)
Moderátor: Moderátoři
- forbidden
- Příspěvky: 8808
- Registrován: 14 úno 2005, 01:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
Tak asi před dvěma lety jsem trošku začal s C++ na PC, ale potřeboval jsem jen udělat jednu konzolovou aplikaci na komunikaci s COM portem. Pak už jsem na to zas nešáhl. Nemám ambice v tom být dobrej, jen umět alespoň základy a případně se doučovat, co bude třeba, za pochodu.
GCC je nějakej free překladač? MPLAB se mi líbí, že je celkem komfortní a provázanej a vše tak nějak funguje. Akorát je to děsnej moloch, je to v javě a žere 1,3 GB RAMky.![Shocked 8O](./images/smilies/icon_eek.gif)
Asi jsem našel GCC fo PIC, ale je ve fázi plánování. Moc se mi nechce začínat s něčím novým, nevyzkoušeným a místo hledání chyb v programu hledat chyby v překladači.
GCC je nějakej free překladač? MPLAB se mi líbí, že je celkem komfortní a provázanej a vše tak nějak funguje. Akorát je to děsnej moloch, je to v javě a žere 1,3 GB RAMky.
![Shocked 8O](./images/smilies/icon_eek.gif)
Asi jsem našel GCC fo PIC, ale je ve fázi plánování. Moc se mi nechce začínat s něčím novým, nevyzkoušeným a místo hledání chyb v programu hledat chyby v překladači.
koukám, že s těma open source toolchainama pro Microchip to je pěkne naprd...
jediný, co mi něco říká je SDCC (ve vedlejším vláknu myslím nějaká uživatelka portila Linux na Z80)
tady jsou nějaký příklady
https://github.com/diegoherranz/sdcc-examples
Ale je to stále v testovací fázi, takže určitě nic pro tebe![Very Happy :D](./images/smilies/icon_biggrin.gif)
Jinak jak už jsem psal. Ty sice začínáš na "nejjednodušších" mikrokontrolérech, ale zároveň mrtě zastaralých. Na tvým místě bych se koukl po modernějších PIC8, AVR8, STM8 či NXP8 mcučkách, kde máš volně dostupný neomezený toolchain. Ten MPLAB je free, ale je to pomalá za*raná Java se zadrátovanými toolchainy v sobě.
Ještě k těm konstantám jenom ve Flashce...seš si tak jistej, že to kompiler dělá? Přečetl sis obsah datové paměti po spuštění programu?
jediný, co mi něco říká je SDCC (ve vedlejším vláknu myslím nějaká uživatelka portila Linux na Z80)
tady jsou nějaký příklady
https://github.com/diegoherranz/sdcc-examples
Ale je to stále v testovací fázi, takže určitě nic pro tebe
![Very Happy :D](./images/smilies/icon_biggrin.gif)
Jinak jak už jsem psal. Ty sice začínáš na "nejjednodušších" mikrokontrolérech, ale zároveň mrtě zastaralých. Na tvým místě bych se koukl po modernějších PIC8, AVR8, STM8 či NXP8 mcučkách, kde máš volně dostupný neomezený toolchain. Ten MPLAB je free, ale je to pomalá za*raná Java se zadrátovanými toolchainy v sobě.
Ještě k těm konstantám jenom ve Flashce...seš si tak jistej, že to kompiler dělá? Přečetl sis obsah datové paměti po spuštění programu?
forbidden píše:GCC je nějakej free překladač?
![Smile :)](./images/smilies/icon_smile.gif)
Je to asi jeden z nejznámějších překladačů vůbec, zahrnuje velké množství platforem od MCU až po velké stroje od Sun a HP. Na platformách s Linux asi nejpoužívanější kompilátor. PICy neznám a tak mě trochu zaráží, že nejsou v jeho portfoliu. V každém případě, pro platformu Atmel, STM8, STM32 je k dispozici. A taky pro všechny dnes užívané Intely a AMD.
Protože je to definováno jako konstanta. Ovšem:forbidden píše:Když napíšu const int x=5; tak bude uložená jen v programové paměti. Mám to vyzkoušený tak, že se po kompilaci ani nehne velikost zabrané datové paměti.
char* hello = "Hello";
bude ležet jak v kódové paměti tak v RAM, kam se dostane pomocí start-up kódu.
Tak to musí mít XC8 nějakou vychytávku. Protože přístup na data v programové paměti jsou jiné instrukce, než přístup na data v RAM. Potom čtení takového řetězce by se muselo překládat jinak. Například
char* hello1 = "Hello";
char hello2[6] = "Hello";
bude u AVR pořád v RAM. Pokud chceme dostat data do kódové paměti, použije se pro gcc syntaxe:
char hello2[6] PROGMEM = "Hello";
a přístup je taky jiný:
pro RAM: char treti_znak = hello[3];
pro FLASH: char treti_znak = pgm_read_byte(hello + 3); což se přeloží na instrukci LPM (load program memory).
char* hello1 = "Hello";
char hello2[6] = "Hello";
bude u AVR pořád v RAM. Pokud chceme dostat data do kódové paměti, použije se pro gcc syntaxe:
char hello2[6] PROGMEM = "Hello";
a přístup je taky jiný:
pro RAM: char treti_znak = hello[3];
pro FLASH: char treti_znak = pgm_read_byte(hello + 3); což se přeloží na instrukci LPM (load program memory).