NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Céčko programování ATmega16

Aktivity
Avatar
studnicka.ji
Člen
Avatar
studnicka.ji:13.12.2016 22:21

Zdravím, začínám programovat ATmegu v céčku a nechápu následující zápis
¨

DDRB  &= 0b11111101;                                    // nastaveni pinu jako vstup
PORTB |= 0b00000010;                                    // pull-up

konkrétně mi jde o &= a |=

vím že & je and a | je or ale nechápu když k tomu přidám = jaký to má efekt

 
Odpovědět
13.12.2016 22:21
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na studnicka.ji
Martin Dráb:13.12.2016 22:27

Toto jsou Cčkové operátory a s atmegou vůbec nesouvisí. Jsou definovány následovně:

  1. a &= b je to samé jako a = a & b,
  2. a |= b je to samé jako a = a | b.

Takže jsou to vlatně jen takové zkratky.

Nahoru Odpovědět
13.12.2016 22:27
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na studnicka.ji
Libor Šimo (libcosenior):14.12.2016 7:02

Ja len predpokladám, že poznáš rozdiel medzi
& a &&

a
Nahoru Odpovědět
14.12.2016 7:02
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
studnicka.ji
Člen
Avatar
studnicka.ji:14.12.2016 20:06

Díky :) to samozřejmě vím.
¨
Jen nechápu proč by prostě nešlo udělat

DDRB = 0b11111101;

místo

DDRB &= 0b11111101;

Editováno 14.12.2016 20:08
 
Nahoru Odpovědět
14.12.2016 20:06
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na studnicka.ji
Martin Dráb:14.12.2016 20:53

Šlo, ale autor kódu zjevně chce změnit pouze druhý (index 1) bit registru DDRB, ne celý bajt, protože jej zajímá pouze pin PORTB0.

Nahoru Odpovědět
14.12.2016 20:53
2 + 2 = 5 for extremely large values of 2
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na studnicka.ji
ostrozan:15.12.2016 8:35

trochu to rozvedu

jedná se o takzvané maskování - slouží ke čtení-zápisu jenom těch bitů o které máš zájem

takže konkrétně DDRB &= 0b11111101; nastaví nulu(nuly) tam kde chceš - zde bit 1 - ostatní nechá v původním stavu

stejně tak PORTB |= 0b00000010; nastaví jedničku(jedničky) jen tam kde chceš

tento způsob je sice "názorný" , ale jak je vidět tak hlavně matoucí a v praxi se nepoužívá - už u 16, ale hlavně 32 bitových registrů by byl značně nepřehledný

proto se používá tahle forma:
zápis nuly DDRB &=~(1<<1);
zápis jedničky PORTB |= (1<<1);

abys to pochopil a nemátly tě ty jedničky tak zápis na bit 6 by byl PORTB |= (1<<6);

pro bity 1 a 6 by to bylo PORTB |= (1<<1) | (1<<6);

jinak něco si přečti o tom jak fungují registry DDRx, PORTx a k nim ještě patří PINx - třeba tady

 
Nahoru Odpovědět
15.12.2016 8:35
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na studnicka.ji
ostrozan:15.12.2016 9:12

Je to ale spíš pro pochopení jak to funguje - nevím jaké máš IDE , ale většina z nich má přístup k jednotlivým bitům buď pomocí

PORTB.6 = 1;
DDRB.6=0;

nebo arduino má funkce

bitWrite(DDRB, 6, 0);
bitWrite(PORTB, 6, 1);

ale tam by nastavení pinu jako vstupu s pulllupem vypadalo takto

pinMode(6,INPUT_PULLUP);
 
Nahoru Odpovědět
15.12.2016 9:12
Avatar
Odpovídá na ostrozan
Libor Šimo (libcosenior):15.12.2016 17:03

Nechcem ho zaznavat, ale aj napriek tvojmu vysvetleniu tomu myslim nebude rozumiet.

Nahoru Odpovědět
15.12.2016 17:03
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
studnicka.ji
Člen
Avatar
studnicka.ji:15.12.2016 20:46

Díky moc konečně nějaké slušné vysvětlení :)

 
Nahoru Odpovědět
15.12.2016 20:46
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.