Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Programování PICů v C (XC8)
Jdi na stránku 1, 2, 3  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
forbidden



Založen: Feb 14, 2005
Příspěvky: 8975
Bydliště: Brno (JN89GF)

PříspěvekZaslal: út prosinec 06 2016, 21:56    Předmět: Programování PICů v C (XC8) Citovat

Protože mě už nebaví matlat se s assemblerem, začal jsem se učit Cčko. Problémky průběžně řeším hlavně s Googlem. Very Happy Ale teď jsem narazil na zajímavost, kterou nechápu.
Mám jednoduchej kód pro výpis textů na LCD:
kód:
void main ()
{
    LCDinit ();
    printf ("Test HD44780");
    LCDctrl (0xC0);                 // druhy radek prvni znak
   
    //LCDcursor (1);
   
    char a=8, b=9, c=255, d=19;
    printf ("%u", a);
    printf ("%u", b);
    printf ("%X", c);
    printf ("%u", d);
   
    while (1);
}


Pokud vypisuju jen texty v ASCII ("Test HD44780") tak má program zabráno 9 % programové a 8 % datové paměti. Jakmile chci použít formátování, tak s každým dalším použitým formátem (%u, %X drasticky narůstá zabraná paměť. V tomto případě 29 % programové a 16 % datové. Čím to sakra je?
Shocked
Mám to jen v PIC16F628A s 2 "kB", je to jen zkoušení. XC8 je free verze, je možný, že je to tím?
Dík.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
mikollar



Založen: Dec 26, 2004
Příspěvky: 1425
Bydliště: Košice - okolie

PříspěvekZaslal: út prosinec 06 2016, 22:07    Předmět: Citovat

printf a podobne fcie ako sprintf zaberaju samotne vela miesta. Pre male picky resp ak chyba miesto, je lepsie si napisat vlastnu kniznicu pre konverziu.

Edit: Pri tejto picke to bude este vyraznejsie aj preto, ze je to len 8bit s minimom instrukcii.

Osobne som uz prestal pouzivat radu 16F a 18F a pouzivam len 24F..., cena je tam porovnatelna mozno trosku vyssia, ale zato vykon a funkcnost nasobne vacsia
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8975
Bydliště: Brno (JN89GF)

PříspěvekZaslal: út prosinec 06 2016, 22:24    Předmět: Citovat

Hmm, to jsou teda pěkně neefektivní konverze. Jinak tu mám i výkonnější typy ale jen tu řadu 18F. Mě to zatím na ty moje hlouposti stačí. Uvidíme časem.
Díky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Atlan



Založen: May 10, 2004
Příspěvky: 4507
Bydliště: Košice

PříspěvekZaslal: st prosinec 07 2016, 18:33    Předmět: Citovat

A este si odsimuluj kolko trva ten tvoj fprint s konverziou aby si sa nedivil.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st prosinec 07 2016, 18:41    Předmět: Citovat

Pro jednoduché konverze je lepší si napsat nějaké rutiny sám. Například:
kód:
void word2dec(u16 val, char *s) 
{
  s[0] = '0' + (val / 10000);
  s[1] = '0' + (val % 10000) / 1000;
  s[2] = '0' + (val % 1000) / 100;
  s[3] = '0' + (val % 100) / 10;
  s[4] = '0' + (val % 10);
  s[5]=0;
}

Další příklady lze nalézt v adresáří conv v projektu generátoru s AD9851 - odkaz v sekci součástky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 33860
Bydliště: Bratislava

PříspěvekZaslal: st prosinec 07 2016, 18:52    Předmět: Citovat

Funkcia printf je velky moloch, ktory ma vela moznosti. Na PC to je jedno, pretoze je v standardnej kniznici, takze je v pamati iba raz aj ked ju pouziva mnoho programov. Ale na vypisovanie neformatovanych textov alebo jednoduchych cisiel v malom MCU je to overkill.

BTW. Je dolezite pochopit, ze C nepozna retazce - uz aj pre spravne pouzitie funkcie word2dec() od mtajovskeho.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8975
Bydliště: Brno (JN89GF)

PříspěvekZaslal: st prosinec 07 2016, 21:35    Předmět: Citovat

Však uvidíme, jak to půjde časem, zatím se bavím psaním knihoven pro obsluhu všeho možnýho. Mám hotový to HD44780 a teď jsem dopsal sw implementaci 1-Wire.

rnbw napsal(a):

BTW. Je dolezite pochopit, ze C nepozna retazce - uz aj pre spravne pouzitie funkcie word2dec() od mtajovskeho.


Tomu nerozumím, jak mám chápat, že nezná řetězce?

kód:
char *s = "hello world";


Je řetězec ne?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st prosinec 07 2016, 23:10    Předmět: Citovat

To se myslí tak, že v C není syntakticky nic, co by popisovalo řetězec. C má jen pointer na začátek úseku paměti, kde se předpokládá obsah řetězce znaků ukončený nulou. Samotný pointer nic neříká o délce řetězce a ukončení nulou je jen konvence z nouze.

Na rozdíl od možností C++, kde máme standardní knihovní šablonu pro řetězce (obecně jakýchkoliv objektů, ne jen znaků) std::basic_string a její specializaci pro znaky - typedef std::basic_string<char> string;

Nebo C#, kde je přímo třída String. Tyto záležitosti pak samy o sobě obsahují vše - datový obsah, jeho velikost a potřebné operace nad daty.


Naposledy upravil mtajovsky dne st prosinec 07 2016, 23:14, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 33860
Bydliště: Bratislava

PříspěvekZaslal: st prosinec 07 2016, 23:13    Předmět: Citovat

forbidden napsal(a):
Tomu nerozumím, jak mám chápat, že nezná řetězce?
kód:
char *s = "hello world";

Je řetězec ne?

s je pointer typu char, ktory ukazuje na adresu, kde sa nachadza danych 11 znakov textu a za nimi nulovy byte. Mozes na to pouzit rozne retazcove funkcie z kniznice, ale je to len obycajny pointer.

Cize keby si tam mal este
kód:
char *s2 = "test";

a nasledne urobil:
kód:
s = s2;

tak pointer s bude ukazovat na rovnaku adresu ako s2. Takze printf(s) aj printf(s2) vypise "test" - rovnako ako keby to boli v inom jazyku retazce a urobil si priradenie. Ale ked teraz urobis
kód:
s[0] = 'x';

tak oba vypisu "xest", pretoze si nezmenil prvy znak retazca s, ale byte na adrese s, na ktoru ukazuje aj s2.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Wolfik



Založen: Jul 28, 2009
Příspěvky: 1090

PříspěvekZaslal: čt prosinec 08 2016, 7:57    Předmět: Citovat

forbidden - nepoužívej io funkce standartní knihovny (stdio), ale odlehčené funkce kompilátoru pro mcu. Většina moderních křížových kompilátorů by něco takového měla mít, při nejhorším pogoogli po nějakých implementacích a naportuj to na toho PICe...

nebo jak tu někdo poznamenal - napiš si vlasní. Takhle se hodně naučíš.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8975
Bydliště: Brno (JN89GF)

PříspěvekZaslal: čt prosinec 08 2016, 9:46    Předmět: Citovat

OK, v tom se budu muset zorientovat a zažít si to. A hlavně prostě zkoušet. Díky oběma.

Longin: manuál k XC8 má 600 stran, zatím jsem do něho radši nekoukal. Učím se to z knížky od Matouška a i když není až tak stará, tak tam používá třeba MCC18 na překlady, ale to se právě v některých věcech od XC8 liší. Takže semtam něco nefunguje a musím bádat proč a jak. Takže je možný, že XC8 odlehčený funkce obsahuje, když je určený pro 8-mi biťáky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Wolfik



Založen: Jul 28, 2009
Příspěvky: 1090

PříspěvekZaslal: čt prosinec 08 2016, 11:57    Předmět: Citovat

Letmo jsem koukal do manuálu toho kompileru a zdá, že maj prostě tu svoji implementaci stdio tvrdě zadrátovanou.

Otázka je, jestli portací nějaké externí odlehčené knihovny si pomůžeš (newlib, embedded printf) apod.

Většinou jde jenom to, že implementuješ nějakou obdobu funkce putchar() a pak to přesměruješ na standartní výstup.

Ve tvým kompilátoru je třeba naznačeno tohle s UARTem
kód:

void putch(char data) {
  while( ! TXIF)  // check buffer
    continue;     // wait till ready
  TXREG = data;   // send data
}


přesměrování standartního výstupu se u GNU AVR Cdělá třeba takhle:
kód:

#include <stdio.h>
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
                                         _FDEV_SETUP_WRITE);
static int
uart_putchar(char c, FILE *stream)
{
  if (c == '\n')
    uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}
int
main(void)
{
  init_uart();
  stdout = &mystdout;
  printf("Hello, world!\n");
  return 0;
}


Ten tvůj PIC má 2kB FLASHky. To je na hrátky s printf a sprintf dost málo Very Happy
Další kámen úrazu je v v datové paměti, kde si podle mě zbytečně ukládáš konstatní řetězce - jednou jsou ve programové paměti a podruhé v datové zbytečně. Kompilátor by měl umět vytvářet a přistupovat ke konstatním proměnným jenom ve FLASHCe, ale pochybuju, že toho dosáhneš použitím const v Cčku.

Trošku OT:
Chápu, že se chceš asi urputně držet svých 8-bitových PICů, co jsou za zenitem, ale možná by stálo za úvahu pouvažovat o nějakých modernějších 8-bitových mcučkách, které nemají takové paměťové limitace, periferie jako ten PIC a nemají krkolomný přístup k programování v C...a stojej zhruba stejně.

Například nové STM8 jsou dobrý (k SDCC kompilátoru máš slušný příklady), AVR8 nebo modernější PIC8, když už seš zvyklý na PICy...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
forbidden



Založen: Feb 14, 2005
Příspěvky: 8975
Bydliště: Brno (JN89GF)

PříspěvekZaslal: čt prosinec 08 2016, 12:10    Předmět: Citovat

Však já mám tu printf přesměrovanou na LCD právě pomocí putch.
A konstatnty, který není nutno držet v datové samozřejmě jen do programové nacpu, to není problém. To jde bez problémů.
Ten kód zatím nemá žádnej hlubší smysl, jen si tak zkouším, takže zbytečně obsazená datová paměť mě momentálně netrápí. Mě jen překvapilo, jak moc to naroste při použití těch formátovaných výstupů.
A na osmibiťácích taky netrvám, jen jich mám v šuplíku hodně a chci je využít. A taky jsem si říkal, že začnu na těch nejjednodušších. Nicméně PICů se chci držet už jen ze zvyku. Pro mě momentálně nemá smysl začínat s něčím novým. Jestli napíšu 5 programů za rok, myslím smysluplných projektů, který někde použiju, tak je to moc. Mám to jen jako zábavu, není moc času se tomu věnovat.
Leda bych změnil zaměstnání, kde bych elektroniku využil, to by byla jiná.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
forbidden



Založen: Feb 14, 2005
Příspěvky: 8975
Bydliště: Brno (JN89GF)

PříspěvekZaslal: pá prosinec 09 2016, 10:39    Předmět: Citovat

Tak jsem trochu zklamanej celkovou efektivitou překladu. Blbej výpočet třeba: t=625*(LSB+(256*MSB)) zabere v tom osmibitu taky hodně místa.
Tak to vypadá, že si zas budu hrát hlavně s logickýma bitovýma operacema, akorát místo v assembleru, tak v Cčku.
Anebo se fakt vybodnout na malý osmibity a užívat si komfortu rozežraných funkcí na něčem výkonnějším. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
rnbw



Založen: Mar 21, 2006
Příspěvky: 33860
Bydliště: Bratislava

PříspěvekZaslal: pá prosinec 09 2016, 10:46    Předmět: Citovat

Ma vobec ten kompilator optimalizaciu na velkost?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.16 sekund