Začátečník s GCC - Jaký tutoriál?

Martine tleskam. Lepší srovnání snad napsat ani nejde. :wink:

Snad jen k ASM. Má pravdu. Jsem ještě také pořád v GCC na začátku ale už se tolik netrápím jako na začátku. Ze začátku jsem taky dělal kombinace C + ASM po čase jsem se v tom co jsem napsal začal ztrácet a tak jsem téměr všechny knihy ASM ze stolu shodil a řešim vše v C. Vždycky je řešení a věřte kratší a jasnější . Navíc při používání ASM a C najednou jsem si vždycky lámal hlavu tim jestli tak nebo tak. Takže to jsem taky vyřešil.

Jinak u mě se MCU zatim ještě stíhá flákat a škrábat se nožičkou v nose. :smiley:

MPLAB má taky C-kompilér

musíš si od microchipu stáhnout MPLAB C Compiler for PIC18 MCUs -je to ale taky evaulation verze - omezená , myslím 4k kódu, ale je nutné mít nainstalovaný MPLAB IDE

odkaz na mikrokontroler. net- nevim čím to je ale místo tutorialu GCC se mi tam zjevují vany a pisoáry :question:

jinak včera jsem brouzdal v knihovnách CVAVR a našel zajímavý soubor “avr_compiler.h” - a tam se dočetl, že při vložení tohoto souboru do kódu vytvořeného v IAR, nebo GCC!!! je CVAVR schopný přeložit i kódy z výše zmíněných compillerů - jen je třeba v Configure projects/C compiler/Paths nastavit cestu do knihoven WinAVR.

Martine, děkuji za vyčerpávající odpověď. Jinak v podstatě se vším souhlasím.
To asm v C kódu jsem chtěl kvůli knihovně pro LCD s řadičem HD44780, kterou mám. Tak jsem jí přepsal do C. Výsledek není nic moc, opět se na něco kompilátor “vykašle” když ho donutím tak to kopíruje a když náhodou ne tak tam nafláká milion PUSH a POP a předává data zbytečně sem a tam. Ale to už řešit nebudu. Budu nadávat až se mě to tam jako vždy nevejde :slight_smile:

Nenašel jsem ten pdf manuál o kterém všichni mluvíte. (akorát nějaká html stránka a nejde tam vyhledávat) Něco jsem i stáhnul (*.pdf.něco) ale nejde mi to otevřít. Tak že se na problémy líně a výhodně zeptám. Ale jsou to podle mě užitečné věci tak že se to určitě bude hodit i jiným, jestli poradíte. A navíc prakticky a v češtině :slight_smile:

Tak že moji LCD rutinu jsem dotáhl až po funkce nastavovací a funkci která zobrazí znak. (mimochodem 6% ATMega8 :frowning: ) A nyní bych chtěl celé texty a hodnoty i s desetinou čárkou. S tím se zkusím poprat pomocí fce itoa jako je v CV akorát tady nějaká sofistikovanější. (asi)
Možná bych bral i originál rutinu pro lcd (kdyby šla snadno upravit pro 3vodičové zapojení a to klidně všechny 3 na jiném portu)

chtěl bych volat např. lcd_putsf(‘ahoj’); aby se ahoj uložilo do Flash což se uloží, aby kompilátor poznal stejný výskyt řetězce a už ho do flash neukládal. A pak hlavně jak to dostat na displej. Tak že jak se v GCC udělá pointr na char do flash paměti. A pro jistotu i do ram. Nějak mě to nechodí. Jestli řetězec automaticky ukončuje nějakým určitým znakem nebo si tam mám nějaký přihodit a jak.

A pak hurá na přerušení. Představuju si to tak např. takhle
#include <avr/interrupt.h>
ISR(INT0_vect)
{
//nějaký kód
}

(jako je v html manuálu) v inicializaci si nastavím HW omáčku a už to funguje? je toho tam nějak víc a mate mě to. Ty alias jsou když chci aby z ruzných zdrojů přerušení se volal stejný kód? Naked je pro “zapomenuté” přerušení aby to nezkolabovalo kdyby přesto nastalo?

Děkuji za praktické rady.

Ten manuál je konkrétně u mne C:\Program Files\WinAVR-20090313\doc\avr-libc\avr-libc-user-manual.pdf

Jesli není ta knihovna tajná a moc velká, tak ji přilož jako soubor. Když se bude někdo nudit, třeba ti ji pomůže zoptimalizovat :wink:

S tim přerušením si to představuješ správně, jen najít správný vektor. Zase se dá najít v tom manuálu, ale je to zdlouhavější. Rychlejší je podívat se v AVRstudiu v projct exploreru na “external dependencies”. Tam je definiční soubor použitýho MCU a v něm ty vektory jsou.
Jesli se dobře pamatuji, tak “naked” je přerušení, který nic nedělá. Jeho využití je např. na probuzení procesoru.
Co myslíš tím aliasem? “INT0_vect”? to je definice toho vektoru.
Pro víc přerušení sdílejících stejný kód tam taky je popis implementace, jen to zrovna teď nemůžu hledat, musim na chvíli zmizet…

Freedy čti soukromé zprávy, nejsem si jist zda-li to můžu normálně je tak zveřejnit. Dám ti sem jednu moji knihovnu na inicializaci displeje LCD 2x16znaků a jeho ovládáním i s nějakýma komentářema a makrama na ovládání bitů co jsem napsal již dříve když jsem začínal a stále začínám. Nemám na programování mnoho času a mám to jako hobby a s 3měsíčním capartem toho vela neudělám. Přikládám i jednoduchý rozpracovaný program časovače. To co je napsáno funguje ještě tam bude nastavení času tlačítkama a bude to ovládat výstup s triakem a tím že bude nastavitelná doba sepnutí a doba rozepnutí. Přeložený to má.

AVR Memory Usage

Device: atmega8

Program: 900 bytes (11.0% Full)
(.text + .data + .bootloader)

Data: 38 bytes (3.7% Full)
(.data + .bss + .noinit)

Build succeeded with 0 Warnings…

Tak hodně úspěchů.

Upozorňuji co se generuje za výsledný kód zatim moc neřesim páč mám místa stále dost. A s časem taky problém nemám “zatim”. Budu to řešit až na to dojde.

Upraveno: Jen upozornení kdyby nekdo pouzil tu moji knihovnu musi se prepsat vsechny casove smycky z cekej_us/ms na _delay_us/ms. Protože jsem si v delay.h zmenil to _delay_us/ms na cekej_us/ms otravovali mě ty dvě podtržítka.
Casovac.c (1.66 KB)
gogin.h (5.57 KB)

Ak ti prekladac nieco vyhodil, tak to pre beh programu nie je potrebne. Sam so sa na niektych prikladoch na zaciatku mojho badania divil, preco mi cele kusy “funkcneho” kodu GCC poslalo do mrne. Az kym som nezistil, ze som tam spravil nejaku nepatrnu chybycku, z ktorej implicitne vyplynula zbytocnost celych kusov kodu. Najprv som robil okolo seba paniku (niekolko krat), ze ake som to uz nasiel chyby v prekladaci, kym som nezistil, ze este neviem poriadne programovat v C :slight_smile:

kniznicu v ASM zarad do C-cka inym sposobom. Nezvykni si programovat systemom jedna uloha - jeden velky C-ckovy kod. To je kravina. Nauc sa vyuzivat hned od zaciatku (ak to uz nevyuzivas) vyhody projektu s viacerymi samostanymi C-ckami pre kazdu ulohu (AD, DA, display, klavesnica, …). V mojich projektoch je cca 5-10 C-ckovych suborov a 5-10 headrov. pri vyslednom kode od 12 do 30kB

K novemu projektu si vyskladam C-cka tak ako ich potrebujem. Dopisem iba to jedno C-cko, ktore je ine od predchadzajucich projektov. Samozrejme tie C-cka tak musia byt napisane, aby do seba zapadali. Tieto skusenosti sa velmi tazko a neohrabane odovzdavaju cez takuto konferenciu. Nie ze by som nechcel, ale uz som sa niekolko krat presvedcil, ze to nema efekt. Ale budem sa snazit na vsetky otazky podla moznosti zrozumitelne odpovedat.

skusim upresnit ten odkaz na celkom dobry popis GCC-cka pre AVR

tento odkaz normalne funguje

mikrocontroller.net/articles … C-Tutorial

ziadne vanicky,krhlicky a trpazlicky :slight_smile:

daj vediet ako si dopadol

Tentokrát dobře.
On je totiž trošku rozdíl mezi mikrocontroller a mikrokontroler :smiley:

Překladač mě vyhodil hodiny do posuvného registu. Ale jak píšeš, tak jsem se s tím pomalu učím žít. Například u krátkého delay (který už stejně nepoužívám) jsem ho donutil takto:

while(time--);   //vyhodil ale..

do{
}while(time--); // už nevyhodil :-) 

JJ přesně tak to dělám. Od toho ty vyšší jazyky přeci jsou :slight_smile:. V asm se “knihovny” dělaly hůř ale taky to šlo.

Ale knihovnu na LCD display jsem celou přepsal v GCC a naprostá spokojenost. Mám z toho radost :slight_smile:. V průběhu to rostlo rostlo a pak najednou to bylo o polovičku menší a přitom jsem pořád přidával. Do asm už nekoukám. Akorát když se mě to nějak nezdá velikostně tak to napíšu trochu jinak a mrknu o kolik se to zlepšilo nebo zhoršilo. Na krátké zpoždění používám #include <util/delay.h> ještě si udělám automatický přepočet potřebného času podle taktování procesoru. Protože např. u 1MHz delay vůbec není potřeba. Surový přenos dat do displeje totiž zabere pri 1MHz asi 35us. Kdyby to tam nebylo tak tam stejně musí být čekání ale místo toho tam je z mého pohledu užitečný kód, který zredukuje potřebu pinů na procesoru pro displej na pouhé 3. Umí to vše kromě čtení z displeje ale stejně nevím na co bych to využil.

Texty z flash paměti tisknu takto:
prog_char text1]={“ahoj, funguje to?”};

lcd_putsf(text1);

Má to výhodu že se snadněji aplikace překládá do jiných jazyků. Ale chtěl bych to umět i jinak třeba nějak takhle:

lcd_putsf(“pokusny text”);

nevíte jak na to?

Děkuji.

No super, blahozelam v pokrokoch. :slight_smile:
Sam som si tym presiel, tak velmi dobre viem o com pises.
O tych zaciatocnych porovnavaniach C-cka s ASM a nakoniec uznania, ze to nie je vobec potrebne, staci ciste C :slight_smile: (pre sturalov dodavam ze v drvivej vacsie :slight_smile: )

na zobrazenie textu na display v procesore, kde su texty najlepsie ulozene vo Flashke to nie je uplne najvhodnejsi pristup.
C-cko nepozna premennu typu string. Pozna iba char. String sa ralizuje tak, ze sa za string povazuje pole charov ukoncenych \0.

skus preto nieco taketo


#define DISP_MAX_POCET_ZNAKOV_NA_RIADOK 16
#define MENU1 0
#define MENU2 1
#define MENU3 2

const char text_1] PROGMEM = "Menu HODNOTY";
const char text_2] PROGMEM = "Menu PARAMETRE";
const char text_3] PROGMEM = "Menu SERVIS";


// ...

// niekde v kode, na zaklade stlacenia tlacitka
polozka_v_menu = MENU1;

//...

switch (polozka_v_menu) {
    case MENU1 : {
      strcpy_P((char*)&data_znaky[2*DISP_MAX_POCET_ZNAKOV_NA_RIADOK], (char *)text_1;
      break;
   }
    case MENU2 : {
      strcpy_P((char*)&data_znaky[2*DISP_MAX_POCET_ZNAKOV_NA_RIADOK], (char *)text_2);
      break;
   }
    case MENU3 : {
      strcpy_P((char*)&data_znaky[2*DISP_MAX_POCET_ZNAKOV_NA_RIADOK], (char *)text_3);
      break;
   }
}
//...

no a niekde inde pravidelne kopiruj obsah pola data_znaky] do displaya

Martine, o podobném přístupu jsem taky už uvažoval. Ty to takhle děláš běžně? Není problém to udělat, pro tisk stringu z ram paměti mám taky funkci. Myslel jsem spíš že by texty byly přímo v kódu. To ale zřejmě udělat nejde nebo nějak v kombinaci s funkcí printf. Ta potřeba u mě vznikla z komfortu v CodeVisionAVR kde se to zapíše jednoduše lcd_putsf(“text 1”);
přičemž kompilátor uloží text1 do flashe a pokud se někde jinde v té funkci vyskytne stejný řetězec, už ho znovu do flashky neukládá.

Ale to už asi nemá smysl řešit. Stejně je lepší mít texty zvlášť kvůli překladu a úpravám. A mít to universálně :slight_smile:. Tak že půjdu hlavně cestou univerzálnosti… To šetří čas, peníze a nervy :slight_smile:

Ale ved tie texty predsa vo Flashi su, preto som to uviedol!

pozri si deklaraciu poli, su ulozene v PROGMEM
funkcia pre kopirovanie obsahu nie je strcpy(), ale strcpy_P()

Aby premenne ostali iba vo Flash, treba k nim presne tymto sposobom pristupovat. Moze sa to zdat niekomu krkolomne, ale takto to je. :slight_smile:
Je to (mozno) cena za komaptibilitu s GCC napriec roznymi procesorovymi platformami.

No a ine prekladace ficury typu PROGMEM a strcpy_P nemusia poznat a v tom su tie nekompatibility medzi roznymi prekladacmi.

Vždyť já to ve flash mám taky :slight_smile:. Chtěl jsem jen jestli to jde mít ten text přímo ve volání funkce, ne tam mít pointr. Zkopírovat string do ramky a pak na displej taky není problém. (je to sice zbytečné tahání sem tam, ale taky to může být někdy výhodné)Ale pořád ten string máš inicializovaný na začátku.
To celé je jen v rámci tréningu programování. Nejde mě o to jestli to je výhodné nebo ne. Jen jestli to jde udělat a jak :slight_smile: Asi by to šlo s nějakou odnoží funkcí print. Což by asi znamenalo includovaní balíku kódu, tak že se v tom nebudu dál vrtat :slight_smile: .

ANO. Ten text může být přímo ve volání funkce.
V podstatě pak ten ukazatel neukazuje na RAM, ale na FLASH.