Ahoj,
k mému příspěvku z 13. listopadu:
Pomohlo kompletní přeinstalování MPLABu.
Nyní se proměnné zobrazují správně.
Vl.
Ahoj,
k mému příspěvku z 13. listopadu:
Pomohlo kompletní přeinstalování MPLABu.
Nyní se proměnné zobrazují správně.
Vl.
Dobrý den,
prosím vás, jak se dá nějak efektivně pracovat s jednotlivými bity u portů PIC?
Všude vidím, že se to řeší čtením celého portu a následným maskováním nebo speciálně napsanými makry.
To opravdu neexistuje nějaká “céčkovská” obdoba instrukce BTF… ?
Dík!
Vl.
Já používám tento zápis:
Příklad:
if ( portb.2 ) az++; // pokud je v log 1, přičte se do registru az hodnota 1
nebo s deklarací:
volatile bit vstup @ PORTB.2;
if ( vstup ) az++;
Ja to riešim pomocou:
PORTAbits.RA0=1;
vlasta_vlcek chce nahradit instrukci BTFSS, BTFSC, tím tvým zápisem ten bit akorát nastavíš, ale neotestuješ.
Petře, co v Tvém příkladu znamená znak @? Nikde jsem to v popisu C nenašel.
Dík,
V.
“Céčkovská” obdoba neexistuje. To, co tu vidíš výše je přílepek výrobce překladače a v jiném to fungovat nejspíš nebude. ANSI C nic takového nepodporuje. Pokud není překladač dementní, tak logickou operaci s portem, kde se pracuje s 1 bitem, přeloží pomocí patřičné rychlé instrukce.
Nevím co to znamená, našel jsem to v manuálu k překladači.
volatile bit pinB1@0x6.1; //declare bit variable mapped to pin 1, port B
můžeš ještě zkusit zápis takto, ten mě taky funguje:
if ( portb & 1 )
Dík,
zkusím.
Vl.
Petře, ono to fakt funguje, ale já nevím proč … .
Můžeš mi to vysvětlit, prosím? Jde mi o toto:
Příkaz if chápu např takto.:
if(a > 5)
udělej něco …
jinak pokračujeme zde …
Testuje se tedy, jestli je nebo není splněna podmínka v závorce.
Jenže zápis:
if(portb & 1)
chápu tak, že se nejprve provede bitový log. součin toho, co je v dané chvíi na portu B s hodnotou b’00000001’, je to tedy zřejmě vymaskování nepotřebných bitů s nějakým výsledkem.
Ale co se děje pak? Kde je ten výsledek?
Kde je ta podmínka, která by se měla splnit nebo nesplnit?
Něco mi uniká, ale nevím co .
Vl.
Výraz je vyhodnocen jako TRUE, když je jeho výsledkem (jakákoli) nenulová hodnota. Tedy když je ve tvé podmínce na bitu 0 jednička, výsledkem bitového AND s 0b00000001 je nenulové číslo (1).
Je to to samé jako napsat “if((portb & 1) != 0)”.
Jasně, díky!
Takže je to vlastně bitová operace …
Vl.
Ano. Ovšem v případě inteligentního překladače nebude ve skutečnosti použit bitový and, nýbrž patřičná instrukce (Petr psal o BTF…, já IS piců neznám). Podívej se pak kdyžtak do vytvořeného asm jesli to překladač provedl optimalizovaně.
U mě to překladač napíše takto:
BTFSC portb,0
INCF az, F
Máte chytrej překladač . Třeba Keil pro x51 to neumí.
Chlapi, dík …
Už se tím začínám hodně pomalinku prokousávat.
Ale musím se smát, jak zde před časem Martin psal, jak není C snadný jazyk a srovnával těch několik málo příkazů a funkcí C s 35 instrukcemi assembleru PIC … (doufám, že se Martin nenaštve .
Je to o tom, že přo člověka, který nikdy v ničem vyšším neprogramoval, je těžká právě syntaxe jazyka.
A co se týká těch 35 instrukcí - to je úplně celý instrukční soubor! To je úplně vše, co PIC umí! Srovnejme to úplně se vším, co “umí” C …
Když uvážím, co vše jsem přečetl v posledních týdnech, tak je toho určitě nesrovnatelně víc, co se musím naučit, než když jsem se učil PIC.
Ale zase je fakt, že jakmile už to člověk zná, tak ta práce asi jde od ruky přece jen jinak … . V těch funkcích se docela síla, navíc se dá napsat doslova pomocí několika písmen totéž, co by v assembleru zabralo stránku.
Takže jo, dobrý … .
Vl.
Zdravím všetkych, mám problém ohľadom práce s bitami v jazyku C pre PIC18. Kompiler používam MC18, a rád by som sa dozvedel, ako je možné pracovať s bitmi jednotlivých registrov. Viem že to ide napríklad pomocou takéhoto zápisu:
PORTAbits.RA0=1;
Ale ja by som rád zistil, ako je možné pracovať s jednotlivými bitmi, ak stačí, aby som poznal poradie bitov v registry, napr. v asm to bolo
BSF PORTA,3
Ide mi o to, že sa snažím spojazdniť AD prevodník, no neviem ako sa dostať k jednotlivým bitom tohto registra (ADRESH), keďže nemajú podľa datasheetu žiadny konkrétny názov. Ďakujem
Není mi sice jasné, proč potřebuješ bitový přístup do registru s převedenou hodnotou, ale budiž. Co přesně potřebuješ provést? Změnit bit? Otestovat bit?
Tak skusim popisať môj problém ešte presnejšie, zo vzorca na vypočet ad prevodniku z tejto témy: http://forum.mcontrollers.com/t/a-d-prevodnik-kde-se-ulozi-10bit-hodnota-prepocet-na-napeti/2144/1 sa snažím spraviť realny vzorec v programe
Dovolim si citovať:
Ureferencne podel poctom bitov na kolkych to merias a ziskane cislo vynasob cislom ktore nameral ad prevodnik
Podľa toho som sa snažil vymyslieť vzorec nejak takto:
U=(Uref/10) * (ADRESHbit0256 + ADRESHbit1512 + ADRESL);
Alebo zle chápem tomu AD prevodniku ?? Je ten vzorec na vypočet napatia dobrý ?? Môj problém je zapisať toto:
ADRESHbit0
ADRESHbit1
unsigned long int ad = ((unsigned int)ADRESH) << 8 + ADRESL;
ad *= Vref; // po dosazeni Vref v mV nebude třeba float aritmetika, vysledek bude taky v mV
ad >>= 10; // deleni 2^10=1024