Zdravim Vas, rozhodol som sa prejst z Basicu na Ccko avsak nikde som nenasiel kde si mozem priradovat portom nejake mena ako tomu bolo napriklad v Bascome kde som si na zaciatku programu definoval napr:
Vystup Alias PORTC.1
Potom som mohol pouzivat nazov Vystup v programe a toto meno reprezentovalo na porte C pin s cislom 1. Je toto mozne aj v C jazyku? Ak ano vedeli by ste mi poradit ako to zapisat? Dakujem a prajem pekny zvysok dna
no to nevim jestly to tam je, ale staci si projit nejaky zdrojaky zde na foru nebo pohledat na “G”, piny se definujou na vsech platformach takze staci hledat…
Vybírám z přiloženého souboru z příspěvku výše
Definice maker :
#define setbit(port,bit) ((port) |= (1<<bit)) // set bit
#define clrbit(port,bit) ((port) &= ~(1<<bit)) // clear bit
#define togbit(port,bit) ((port) ^= (1<<bit)) // toggle bit
#define getbit(port,bit) ((port) & (1<<bit)) // hodnota bitu
Změna hodnoty například bitu 1 portu C se pak dá udělat dvěma způsoby.
1)
togbit(PORTC,1); // změna portc.1
Překladač to přeloží takto :
IN R24,0x05 In from I/O location
LDI R25,0x02 Load immediate
EOR R24,R25 Exclusive OR
OUT 0x05,R24 Out to I/O location
nebo
setbit(PINC,1); // změna portc.1 - není to chyba, je to skutečně PINC
Překladač to přeloží takto :
SBI 0x03,1 Set bit in I/O register
Pokud je compiller dostatečně inteligentní, mohl by to teoreticky
zvládnout přeložit do jedné instrukce. Jenže to by musel zaměnit
programátorem požadovanýý registr PORTx za PINx.
Výsledek je stejný, jen to zabere 1/4 místa a času.
Jediný problém je, že některá AVRka to takhle neumí.
Je třeba si projít datasheet. Neumí to například ATmega8.
Dakujem skusim pozriet aj to. Mal by som este ale otazky troska mimo nazvu temy a to je ze dnes som narazil na jeden problem a neviem ako na to. V mojom programe potrebujem nadefinovat premennu ktora bude nadobudat hodnotu 0/1, teda bit a neviem co s tym lebo v basicu som si zvolil:
Dim Premenna as bit: Premenna = 0
no v Ccku si neviem spravit
bit Premenna = 0;
Zatial som problem vyriesil tak ze som premennu definoval ako uint8_t ale to nieje riesenie a neviem ako na to.
Dalsia vec ktora mi robi problem, resp. neviem ako presne postupovat je tato:
Mam na porte A vyuzite dva vstupy, konkretne PA0 a PA1 a potrebujem pouzit podmienku if {} ktora bude splnena ak budu oba vstupy v mnou zvolenej logickej urovni. Zatial to mam vyriesene takto
if(PINA == 0b11111100) {}
No potreboval by som vediet ako vymaskovat len tie mnou pozadovane piny, pricom ostatne nech su v akejkolvek urovni. Viem ze su to laicke otazky no toto maskovanie(konkretne zapis) mi robi neskutocny problem a musim to len dostat do krvi. Priklad kde v podmienke testujem jeden pin som nasiel, no ak mam dva tak neviem ako na to a ked som pouzil logicky AND, tzn. prikaz && tak to nefungovalo. Dakujem Vam velmi pekne za odpoved
Cau, nevim jestly si si vsim ale procesor nema 1bit registry takze se to proste resi pres 8bit registr kterej ma hodnoty jen 0/1, jinak to nelzei=0b111111xx;
0b000000xx=(i & 0b00000011);
A to mi chces povedat ze si nemozem vytvorit premennu ktora bude typu bit? To ked budem mat 32bit mcu tak najmensia mozna premenna bude 32bit? Ja potrebujem vytvorit lokalnu/globalnu premennu
Ano bool som si tam vsimol, len chcel som pouzit prave zapis 0,1 kvoli, pre mna, lepsej prehladnosti ako TRUE a FALSE. Samozrejme Vam dakujem za rady, toto ma troska zarazilo ze sa to neda spravit tak ako v basicu
Takze ked premennu definujem ako typ BOOl, tzn. bude nadobudat hodnoty TRUE a FALSE tak aj tak to bude zapisane v premennej typu char? Myslel som ze je mozne vytvarat aj bitove premenne. Dakujem
pokud si vytvoris promenou o 1bitu tak ti zabere 8bit . prekladac ti to podava jako 1bit ale ve skutecnosti je to 8bit …ale zapisovat tam muzes jen 1\0
Jak píše AB. Jazyk C nezná menší paměťovou jednotku než 8bit. Lze nadefinovat struktůru jak jsem dával odkaz a ta umožní formálně pracovat s jednotlivými bity registru ale není to typ. Taková rozšíření pro C mají kompilátory pro procesory x51 a PIC.
Dakujem Vam velmi pekne z vysvetlenie, vidim ze prechod na C bola dobra volba nakolko vidim hlbsie do toho s cim robim. Z basicu som myslel ze je mozne robit v SRAM aj s jednotlivymi bitmi a az teraz vidim ze to tak nieje a je tam rovnako 8bit pristup. Ohladom toho predchadzajuceho prispevku, to co bolo uvedene viem a rozumiem tomu no chcel by som vediet ako do tej podmienky napisat oznacenia jednotlivych portov, napr
if(PINA & (1<<PA0))
{
}
Neviem ci som sa vyjadril spravne no potrebujem v takomto tvare zapisat do podmienky dva piny a to PA0 a PA1. Ako by to vyzeralo pri podmienke ze maju byt oba v jednotke, oba v nule, a oba rozdielne? Este raz sa ospravedlnujem za laicke otazky no neviem si dat s tymto rady. Dakujem