Priradenie mena portom v jazyku C

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

cau, hledej “#define”, jinak se muzes kouknout sem je tam vic casti ale musis je najit (neni odkaz na dalsi) mozna ti to pomuze do budoucna

edit: a + tohle

Ahoj, ano tu knihu mam len som si to nevsimol zeby to tam bolo. Hned ako budem doma, tak to pozriem. Dakujem krasne za odpoved

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…

Trochu podobná jako “alias” je direktiva “#define”.

Může definovat konstantu
#define MOJE_CISLO 38
#define VYSTUPNI_PORT PORTD //pojmenování portu

ale také může definovat makro. (Makro je příkaz nebo posloupnost příkazů.)
#define INIT_PORTB PORTB |= (1<<PB0)|(1<<PB1)

Nemůžeme ale definovat pin takto
#define SS PORTB.3
protože gcc nezná tečkovou notaci bitů.

Možné řešení je v připojeném souboru.
bitnames.c (1.01 KB)

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.

Zkus kouknout do tohodle vlákna
https://forum.mcontrollers.com/t/zjisteni-logicke-hodnoty-pinu/3052/9
Napsal jsem tam macro, které umožňuje nadefinovat i/o porty a pak s nimi zacházet stylem LEDKA=1 nebo LEDKA=0 nebo dokonce LEDKA=proměná

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

pouzi bool.

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

Do typu bool můžeš zapisovat 1,0.

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

Jazyk C nezná proměnné typu BIT.

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

První varianta :

[code]if ((PINA & ((1<<PA0)|(1<<PA1)))==0)
{
// Oba jsou v nule
}

if ((PINA & ((1<<PA0)|(1<<PA1)))==((1<<PA0)|(1<<PA1)))
{
// Oba jsou v jedničce
}

if (((PINA & ((1<<PA0)|(1<<PA1)))==(1<<PA0))||((PINA & ((1<<PA0)|(1<<PA1)))==(1<<PA1)))
{
// Piny jsou různé
}

[/code]

Druhá varianta :

[code]switch (PINA & ((1<<PA0)|(1<<PA1)))
{
case 0:
// Piny jsou v nule
break;

case ((1<<PA0)|(1<<PA1)):
     // Piny jsou v jedničce
     break;

case (1<<PA0):
case (1<<PA1):
     // Piny jsou různé
     break;

}
[/code]