Zaslal: pá červen 25 2010, 14:04 Předmět: mam gulas v bitovych operatoroch ...pls HELP
mozem sa spytat ako to funguje s jednotlivymi bitovymi operatormi ..akosi tomu nechapem..ale chcem pochopit
takze viem ze & je logicky sucin ..aj viem co robi logicky sucin..len akosi neviem porozumiet preco sa znak nasobi prave tym osembitovym cislom (dost viem o tom viem ze aj preto lebo je to 4bitova komunikacia tak je to tam dva krat ...len stale mi ta podstata unika ze preco..neviem si predstavit prakticky priklad)
<< toto viem ze je bitovy posun vlavo a bitovy sucet je | ..ibaze akosi si to vobec neviem predstavit ...a kombinaciu oboch ako je to napr LCD|=1<<LCD_RS; us vobec nechapem
alebo LCD&=~(1<<LCD_E); viem ze to je sucin a negacia ..ale absolutne si neviem predstavit co to v konecnom dosledku sposobi ...asi je to sposobene tym ze ked vymyslali jazyk c ..boli strasne lenivy ..a namiesto a+a dali rovno a+ ...ci ako to je ..viete ako to myslim ..viete mi to niekto kusok podrobnejsie vysvetlit ? ja to us potom budem chapat ...dakujem
dakujem dopredu za vysvetlenie ..pripadne za poskytnutie webovych stranok kde je tato tema rozoberana podrobne na pochopenie ..fakt som len uplny zaciatocnik ..a setko sa skusam ucit iba metodou pokus-omyl
Bajt má osm bitů. Operace & provede operaci AND pro každý bit. Dělá to tedy jakoby osmkrát. Vezme nejnižší bit levého bajtu a nejnižší bit pravého bajtu, udělá s nimi AND a výsledek bude nejnižší bit výsledku. S ostatními bity udělá totéž.
Pak je dobré si uvědomit, že pro každý bit platí x&0=0 a x&1=x. Tedy anduju-li jedničkou, nic se neděje. Anduju-li něco nulou, smažu to. Takže AND použiju, když chci nějaké bity vynulovat. Takže v tom příkladu cmd&0b11110000 vrátí hodnotu cmd, ale se smazanou spodní půlkou bajtu. Přenese tedy jen tu horní půlku. Tu spodní schválně mažeme, abychom pak ORem mohli přidat jedničku, kam chceme.
S ORem je to podobné. Platí pro každý bit: x|0=x a x|1=1. Tedy OR jedničkou nastaví daný bit a OR nulou neudělá nic. OR použiju, chci-li některé bity nastavit na jedna. 1<<LCD_RS je bajt, kde jsou všechny bity nulové, jen LCD_RS-tý bit je jedničkový. Když tím něco vyoruješ, tak se v tom ten LCD_RS-tý bit nastaví na jedničku.
Takže:
x |= 1 << n; // nastaví n-tý bit
x &= ~(1 << n); // smaže n-tý bit
Bajt má osm bitů. Operace & provede operaci AND pro každý bit. Dělá to tedy jakoby osmkrát. Vezme nejnižší bit levého bajtu a nejnižší bit pravého bajtu, udělá s nimi AND a výsledek bude nejnižší bit výsledku. S ostatními bity udělá totéž.
Pak je dobré si uvědomit, že pro každý bit platí x&0=0 a x&1=x. Tedy anduju-li jedničkou, nic se neděje. Anduju-li něco nulou, smažu to. Takže AND použiju, když chci nějaké bity vynulovat. Takže v tom příkladu cmd&0b11110000 vrátí hodnotu cmd, ale se smazanou spodní půlkou bajtu. Přenese tedy jen tu horní půlku. Tu spodní schválně mažeme, abychom pak ORem mohli přidat jedničku, kam chceme.
S ORem je to podobné. Platí pro každý bit: x|0=x a x|1=1. Tedy OR jedničkou nastaví daný bit a OR nulou neudělá nic. OR použiju, chci-li některé bity nastavit na jedna. 1<<LCD_RS je bajt, kde jsou všechny bity nulové, jen LCD_RS-tý bit je jedničkový. Když tím něco vyoruješ, tak se v tom ten LCD_RS-tý bit nastaví na jedničku.
Takže:
x |= 1 << n; // nastaví n-tý bit
x &= ~(1 << n); // smaže n-tý bit
A tak podobně. Dá se s tím dost kouzlit.
tak toto nema chybu ...uplne si mi v tom spravil jasno ..us tomu chapem ..idem sa pokusit nieco naprogramovat dakujem velmi pekne
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: pá červen 25 2010, 16:00 Předmět:
Atlan napsal(a):
a hlavne je to neprehladne pre zaciatoxnika
Je to příšerný. Když podobný programátor potom doma stejnou logikou požádá manželku o večeři, tak jeho pes odejde zasadit kropící konev na Saharu.. _________________ Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
podla mna je to praveze pekne a prehladne ...co sa kde nastavuje je to aspon vidiet ... no ale teraz o niecom inom ..viacej krat som to rozoberal tun..ale este raz ..nech mam v tom jasno ... mam displej PC106 2x16 riadkov zapojeny podla tejto schemy na obrazku (akurat namiesto atmega 8 je 32) ...no a takisto vam prikladam zdrojak ... malo by mi to pekne vypisat AHOJ ...ale ono nevypise nic ..iba svietia dva rady stvorcekov ...mohli by ste mi povedat v com je problem ?
Chyba bude v inicializaci LCD, máš dobře nastaveno po zapnutí napájení delay 15ms, ale po odeslání prvního příkazu (D7..D4 - 0011;8bitová komunikace) by mělo následovat delay 4,1ms. Pro další příkazy již stačí cca 40us. Jen pro příkaz Vymaž displej a Návrat na začátek by mělo být delay 1,64ms.
Takže pro příkazu VymazLCD by měl být delay 1,64ms. Pročti si datasheet pro ten LCD displej, najdeš tam jaké česování je nutné pro jednotlivé příkazy.
Chyba bude v inicializaci LCD, máš dobře nastaveno po zapnutí napájení delay 15ms, ale po odeslání prvního příkazu (D7..D4 - 0011;8bitová komunikace) by mělo následovat delay 4,1ms. Pro další příkazy již stačí cca 40us. Jen pro příkaz Vymaž displej a Návrat na začátek by mělo být delay 1,64ms.
Takže pro příkazu VymazLCD by měl být delay 1,64ms. Pročti si datasheet pro ten LCD displej, najdeš tam jaké česování je nutné pro jednotlivé příkazy.
Dakujem velmi pekne...us mi to funguje na ten delay 4,1 sekundy som zabudol ...ja sa iba ucim ..toto su prve pokusy ...som velmi stastny ze sa mi to tam konecne rozsvietilo ...
ahoj, takze displej mi uz ide davno ..setkemu chapem ..vypisovat viem znaky v pohode ..ale trapim sa s pochopenim funkcie na vypisanie rovno textu (string) a nielen vypisovanie po pismenku ... zevraj to ma fungovat takto
void VytiskniLCD(uint8_t* retezec, uint8_t nZnaku) //posílá se odkaz na řetězec a počet znaků
{
register uint8_t i;
// pro sichr si zkontrolujeme pointer
if (!retezec) return;
// print
for(i=0; i<nZnaku; i++)
{
PosliZnakLCD(retezec[i]);
}
}
void PosliZnakLCD(uint8_t cmd) //v proměnné cmd máme poslany znak na LCD
{
LCD=((cmd&0b11110000)>>4); // pro nastaveni pouzijeme jen 4-bity
LCD|=1<<LCD_RS;
LCD|=1<<LCD_E; // cvaknem E signalem
_delay_ms(1);
LCD&=~(1<<LCD_E);
LCD&=~(1<<LCD_RS);
_delay_ms(1); // pokazde pockame, displej ma pomaly procesor
LCD=(cmd&0b00001111); // nastavime zbyle 4-bity
LCD|=1<<LCD_RS;
LCD|=1<<LCD_E;
_delay_ms(1);
LCD&=~(1<<LCD_E);
LCD&=~(1<<LCD_RS);
_delay_ms(1); // a zase jsme zacvakali E signalem
funkciu som zavolal takymto sposobom
VytiskniLCD('MISKO',6);
Kompilator mi nevypisal ani jednu chybu .. ibaze na displeji nieje MISKO ..ale 4 cierne stvorceky ..preco ?
jj ide ...dakujeeeem ...a aky je v tom rozdiel ? medzi uvodzovkami a apostrofom ? + ak mozes ...
void VytiskniLCD(uint8_t* retezec, uint8_t nZnaku) preco je tam * ?
register uint8_t i; co to robi ?
if (!retezec) return; ...to je akoze negacia ci co ?
cyklu chapem ...
a nevies ako previest cislo (uint8_t) na string ?... potrebujem proste premennu vypisovat na displej a je to (integer) ..najlepsie podla mna previest na string do dakej premenej a tu rovno vypisat..lenze nevies teda ako ?
'X' je znaková konstanta, velikost je int
"XYZ" je řetězec
* značí pointer
register říká překladači, aby tu proměnnou umístil pokud možno do registru
! je negace
Na převod do stringu je funkce sprintf()
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
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
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.