Počkej na C.Když nebudeš vědět, napiš
To jsem četl že se assembler propojuje s jazykem C .C je jednoduší a to se napiše program v C a pak se překladá do assembleru nebo jak to je ?
Jak to je s C, nevím, taky bych se ho chtěl naučit, ale moc literatury na to v cz není, jestli vůbec nějaká, ale v assembleru máš 35 instrukcí a to není tak těžké.
Myslim, ze C je (aspon v zakladnych prikazoch) jednoduchsie na pochopenie, lebo syntax je zrozumitelnejsia ludskemu vnimaniu reality. Preto su vymyslene rozne vyssie programovacie jazyky, aby sa programator mohol viac sustredit na implementaciu algoritmu ako na “nepomylenie sa” pri pisani asembleru.
Kazdy procesor rozumie IBA svojim stojovym instrukciam.
Aby si ludia nemuseli pamatat ich hexa kody, bol “vymysleny” asembler, co nie je nic ine ako strojovae instrukcie zapisane pomocou mnemotechnickych kodov (v pomere 1:1). Tak napriklad instrukcia ulozenia ma pseudo kod LD, alebo MOV, alebo niecco podobne. Samozrejme, ze ziadny procesor od nardenia nerozumie zhluku pismen MOV, ale ak dostane na prezutie napr. #3C, tak vie ze nasledujuce bajty ma niekam presunut. Ale kto by si pamatal ze #3C je presun. Radsej do textoveho editoru zapises MOV a prekladac prelozi asembler do strojoveho kodu.
Jedna sa o velmi jednoduchy preklad.
Horsie je to uz s vyssimi programovacimi jazykmi. Napriklad
if (podmienka) then
… nejaka cinnost …
elsif (podmienka) then
… nejaka ina cinnost …
end;
je algoritmicky velmi zrozumitelne a opticky prehladne, aleda sa do strojoveho kodu toh oktoreho procesora prelozit viacerymi sposobmi a to bud s ohladom na rychlost, alebo s ohladom na velkost kodu. To riesia prekladace. Preto je ich viac, lebo kazdy tvorca prekladaca kladie doraz na ine vlastnosti prelozeneho kodu a hlavne musi byt prekladac pre kazdy typ procesora. Prekladac C pre Win nebude vediet prelozit C kod do strojoveho kodu PIC, AVR, ARM. Prekladac C pre AVR nemoze vediet prelozit zdrojovy text do strojoveho kodu napr. x51. Vyhoda vyssich programovacich jazykov je okrem lepsej abstrakcie riesenia problemu aj v tom, ze ked je nejaky algoritmus napisany a odladeny (pri dodrzani urcitych trivialnych podmienok) pre jeden procesorovy rad, staci szdrojovy kod prelozit prekladacom pre iny procesor a algoritmus je rovnako funkcny. Pri jednocipoch sa to komplikuje roznostou periferii a roznym pristupom k nim. Na to treba pri pisani kodu mysliet, aby pripadne zmeny boli zanesene iba do prislusnych *.h suborov, pripadne sa daju osetrit podmienenym prekladom. Ak si clovek neda velky pozor, podmieneny preklad moze lahsie viest i k roznosti algoritmu pre rozne procesorove platformy.
Dnesne prekladace z vyssivh programovacich jazykov prekladaju s efektivitou mozno v okoli 1.5 - 3x pomalost/velkost kodu oproti programovaniu priamo v asembleri. Vyhoda je ale ta, ze ak sa raz clovek nauci C-cko, Javu, Pascal, moze svoje vedomosti vyuzivat v sirsom rozsahu zariadeni, staci iba pouzit spravny prekladac a hlavne zlozitejsiu ulohu ma omnoho rychlejsie naprogramovanu (2-20x i viac, zavisi od zlozitosti ulohy a dostupnych kniznic)a odladenu z dovodu prehladnejsej algoritmizacie ako keby ju robil v asembleri.
Martin
16F628 se dá v pohodě zvládnout assemblerem.
A jak se naučit C pro PIC???Zajimavé je, že na AVR a atd. je PDF spousta ale na PIC jsem nenašel nic, a ani pořádně nevím, co mám hledat. A ještě aby to C bylo použitelné pro 16 18 24 a dsPIC.
Mam(mal) som pic16f628a + programator, a chcel som ho programovat v C, lenze vacsina IDE je platena, alebo obmedzena napr.
Pic C LITE
Jedine co je pouzitelne, a “zadara” je SDCC, trapil som sa s tym tyzden, ako tak som to donutil aby to generovalo “rozumny” hex subor, ale ajtak to nieje ono, lebo je to cez koznolu, a dalsie trapenie je prisposobit IDE, napr Code::Blocks, preto precahdzam na Atmel, kde C prekladac je zadara(GNU/GLP), je to vlastne klon GCC. Ak chces C, a chces to mat legalne, zadara, a da sa povedat kvalitne, tak urcite zacni atmelom, a nie pic.
Je to taky moj postreh, tak neviem, niekto mozno ma s C na PIC lepsie skusenosti ako ja…
Tu mas nejake compilery, vacsina ma aj priklady(samples)
Source Boost
MikroC
CCS
CC5X
SDCC - Je GPL (zadarmo, open source), podporuje Intel 8051, Maxim 80DS390, Zilog Z80, Motorola 68HC08, Microchip PIC16 PIC18.
Edit: Ak by bol zaujem, mozem napisat clanok o C k PIC a ATMEL, nejake porovnanie, priklady atd…
Ale nic z toho neřeší to, jak se Céčko naučit!! Pokud člověk nemá absolutně páru, o co vůbec jde.
Pokud by byl zajem, splasil bych nejaky materialy ze zakladu C ze skoly… ale bylo by to jen pro konzolovy aplikace - proste zaklady C, konkretni vyuziti v nejakem IDE uz by bylo na vas 
PS: jesli se nepletu, tak uplne zakladni verze visual studia se da(nebo aspon dala) stahnout z webu microsoftu zdarma… v tomhle pripade by slo o C++, ale to nicemu nevadi.
Sry, tak…
Zacal by som s tymto kurzom na Programujte.com je to tam rozumne, podrobne popisane , alebo potom naBuilder.cz, C++ od C nema daleko, takze mozte pouzit oba kurzy.Je to zaklad, premenne, cykly, ukazovatele a podobne. Dobre je najprv robit programi pre svoj OS(windows, linux), na tom sa pochopi zaklad, a potom sa da pustit do jednocipou. Nebudem to tu moc rozpisovat, na programujte je to pekne popisane…
a potom, to co som napisal vyzsie…
Jak tak na to koukám, tak zlatej assembler.

Ale nie, kludne zacnie konzolovymi aplikaciami v C. Da sa zacat napriklad Heroutom: Programovaci jazyk C I., II. Daju sa nachytat zakladne skusenosti ako bezi slucka a tak podobne.
Hlavne je tam ako tak kladeny doraz na stabnu kulturu, ktoru velmi vyuzijes pri trochu vacsich projektoch.
Potom by som doporucil AVRstudio s WinAVR.
Po spusteni sa avrstudio opyta, ci chces robit projekt v asmbleri alebo v GCC. povies ze v GCC a na aky procesor a on ti vygeneruje zakladne okno.
Tam si napises prvy program,
napriklad:
#include <stdio.h>
#include <avr/io.h>
//#include <stdlib.h>
//#include <stdint.h>
#include <avr/iom8.h>
#define MAX_HODNOTA 2000
// definovanie makier pre jednoduchsiu pracu s pinom PD4
// v tomto program nie su vsetky #define pouzite
, je to tu pre ukazku
#define IO1 4 /* PD4 */
#define OUT_IO1 (DDRD |= (1<<IO1))
#define IN_IO1 (DDRD &= ~(1<<IO1))
#define SET_IO1 (PORTD |= (1<<IO1))
#define RES_IO1 (PORTD &= ~(1<<IO1))
#define GET_IO1 (PIND & (1<<IO1))
int main(void)
{
uint16_t a;
uint8_t b;
a = 0;
b = 0;
// nastavenie PD4 na vystup
OUT_IO1;
for(;;) {
while (a < MAX_HODNOTA) {
a++;
}
a = 0;
b = 255 - b;
if (b) {
SET_IO1;
}
else {
RES_IO1;
}
}
}
to nevadi, ze vsetkemu nerozumies, ale tento programik Ti podla
hodnoty MAX_HODNOTA bude cvicit s pinom PD4. Ak Ta to zaujme, skumaj preco a modifikuj a modifikuj az budes vediet obsluzit klavesnicu a graficky LCD a v zariadeni budes mat tri UARTy, z toho dva softverove 
to iste sa da zapisat aj ako
int main(void)
{
uint16_t a;
uint8_t b;
// nastavenie PD4 na vystup
OUT_IO1;
b = 0;
for(;;) {
a = MAX_HODNOTA;
while (a) a--;
b = 255 - b;
if (b) RES_IO1;
else SET_IO1;
}
}
co je v konecnom vysledku o 10 bajtov kratsie ako to prehladnejsie predchadzajuce. Doporucujem sa drzat tych prehladnejsich zapisov.
Martin
Jestli se nepletu, tak popisuješ Atmel, ale tady jde o PIC 16F628A
To mi je jasne. Snazil som sa len ukazat ako moze vyzerat jednoduchy program v C.
Myslim ze pre C v PIC az take velke rozdiely nebudu, nejake upravy v #include a v #define, ale kedze sa jedna o C, potom by to malo ist prelozit i pre PIC.
Islo i o demonstraciu jednoduchosti programovania v C a kedze s PICami uz nejaky ten rok nerobim, uviedol som priklad v com som vedel.
Martin
Chtěl bych se zeptat proč to číslo 214 se nepřevede tak jak to čislo 12.
Binarní soustava.doc (23.5 KB)
Sice nechápu tvůj dotaz, ale číslo 12 je 12 (b’00001100’) a 214 je 214 (b’11010110’) 
da se to prevest stejne, jen tam asi chteli ukazat jinej postup 
Tak převadět už bych uměl ale nechapu na co mi to bude.Když je třeba příkaz MOVLW 0xCB tak je to 11001011 a je to číslo 203 .Jaká teda konstanta je tam zadaná 203 nebo cb.Pomohlo by mi pár příkladu dík.
Když třeba zadaváš MOVWF TRISB tak je lepší to dávat v jako b’00001111’, aby jsi věděl, kterej bude vstup a výstup. Když + nebo - tak je lepší v desitkové, a v hex je lepší, pokud nastavuješ např. FSR. Ale to je můj názor, třeba to někdo vidí jinak.
To je nieco ako s cudzimi jzykmi.
Yes Ano Ja Da
su styri rozne tvary toho isteho v roznych jazykovych “sustavach”
Je jedno ci tam napises 203, xCB alebo b11001011
Ty aj tak nepises priamo kod ale znaky v textovom editore a na tie musis postvat prekladac aby z toho vzislo nieco pre procesor zrozumitelne.
A ten prekladac presne vie na zaklade znaku pred cislom, ci sa jedna o zapis dekadicky (nic), hexa (x) alebo binarny (b) a podla toho s nasledujucimi znakmi nalozi, prelozi a ulozi. Ak totiz v texte napises b11001011 je to spolu 9 znakov, nie jeden bajt. Prekladac vsak vie, co si tym myslel (on je sikulka
) a z tych 9 znakov v texte spravi naozaj ten jeden bajt a ulozi ho ako nuly a jednicky. Nic ine totizto v pocitacoch nie je. Iba nuly a jednicky. To, ze na obrazovke sa zobrazuju pre nas zmysluplne znaky a este naviac v takom tvare ze su prehladne citatelne je vec prislusnych zobrazovacich programov a podprogramov.
Treba si uvedomit, ze ked vidis na obrazovke cislicu 1, tak vlastne vydis ikonu ulozenu v pamati (a zlozenu z poriadnej kopy bajtov v zavislosti od fontu ktorym tu jednotku prezentujes), ktora sa ma vykreslit na obsazovke ak sa ma zobrazit hodnota jeden.
Pisal si, ze vies prekladat z roznych ciselnych sustav a ze mas pocit ze ti to je k nicomu.
Pouzivanie roznych sustav ma zmysel cisto esteticky zabezpecujuci lepsiu citatelnost udajov pre ten ktory pripad.
zmysel pouzivania dekadickeho formatu je dufam jasny
zmysel hexa formatu je v peknom zarovnani a tym prehladnom pohlade na hromadu bajtov i v riadkoch pod sebou. Ak sa divas na hodnoty nejakej skupiny bajtov bez dopredu jasnej suvislosti (otvor si v notepade hociaky text dlhsi ako 1kB a prepni si do hexa zobrazenia), vsekty bajty vidis pekne zarovnane v riadkoch stlpcoch bez ohladu na ciselnu velkost jednotlivych bajtov. Okrem toho ak mas vedla seba bajty s hodnotami 127 a 64 (dekadicky) a takto by sa aj zobrazili, nevies ci mas hodnotu citat ako 127 a 64, alebo 32576 ak tie dva bajty reprezentuju dvojbajtove cislo (pri sposobe ulozenia vyssi bajt je prvy). Ak su vsak hodnoty vyjadrene ako 7F40
(hex format), tento problem nemas, lebo citas 7F 40 a to rovnako ci sa jedna o dve hodnoty dvoch samostatnych bajtov alebo o hodnotu dvojbajteveho cisla (wordu).
Zmysel binarneho vyjadrenia cisla je napriklad v pripade nastavovania smeru portu procesora.
Ak chces aby bol treti, stvrty a siety pin vystupny (pocitam od nulteho), potom bude urcite prehladnejsi zapis v tvare
b01011000
ako v tvare 88 (dec) alebo x58
z binarneho tvaru cisla ti je “na prvy pohlad” jasne co je nastavene a co nie.
Tak isto ak si budes chciet vykreslit nejaku ikonku s romerom 8x8pixlov (napriklad dvojitu sipku) na grafickom display
bude asi zrozumitelnejsie (pre teba, nie pre procesor) ak si nakres vyjadris v tvare
b00011000
b00100100
b01100110
b11100111
b00100100
b00100100
b00100100
b00100100
a nie v tvare
24
36
102
231
36
36
36
36
co ale procesor bude chapat presne rovnako a nebude v tom vidiet zidny rozdiel
Rozne vyjadrenia tej istej hodnoty nie je potrebne pre samotny procesor ale pre cloveka, aby sa lepsie orientoval v tom co chce alebo co uz vytvoril
Este pre doplnenie, okrem dekadicke, hexa a binarnej sustavy moze existovat teoreticky neobmedzene mnozstvo ciselnych sustav.
Zavisi to od poctu cislic v jedno rade. desitkova ich ma desat, dvojkova dve. Hexa sustava (pred nou sa pouzivala este aj osmickova, ale uz nema prakticky vyznam, kedze sa ujalo zgrupovanie osmich bitov do bajtov) vznikla ako uspornejsi a praktickejsi zapis dvojkovej sustavy, ked si hodnotu bajtu zapamatas pomocou dvoch znakov, napriklad CB a nemusis si pamatat osem znakov, v tomto pripade konkretne 11001011. Lahsie by si sa pomylil pri diktovani, prepisovani, optickej kontrole, porovnavani, … Takze ako vydis existencia roznych ciselnych sustav je velmi prakticka zalezitost a je potrebna preto, ze clovek je aky je. Ak by na svete existovali iba same digitalne zariadenia, tie by pouzivali iba jednu jedinu sustavu a to binarnu.
Martin
Omluvam sa za chybycku v predchadzajucom texte, samozrejme syntakticky spravny zapis hexa cisla je 0xCB a nie iba xCB a podobne ako som to v mojom predchadzajucom prispevku sprznil.
Martin