AVRstudio a definovanie pinov

Napisem cely problem. Chcem konkretne na attiny2313 ovladat bytom cely port, kvoli led effektom. Port obsahuje tieto hodnoty PD5,PD6,PB0,PB1,PB2,PB3,PB4. Takze potrebujem citat hodnoty z nejakeho bytu a zapisovat ich na tie porty v tom presnom poradi, kedze je to uz navrhnute na plosaku a led su v takom poradi za sebou. Samozrejme mohol by som ich ovladat samostatne ale ten kod je potom dlhy a dlhyyy. Preto chcem pouzit nejaku rutinu. Pouzil som funkciu WRITE_BYTE to ide ale sa mi zda ze moc miesta zabera kedze tam mam pamat len 2k. Tak chcem vyskusat cez define ale to nemozem rozbehat :slight_smile:

Takto som to skusal len na test a nie a nie ist. Malo by mi rosvietit led PB3 , PB4 a PD1 teoreticky

[code]#include <avr/io.h>

#define READ_BYTE() ((PINB>>3)&3)|((PIND&2)<<1)
#define nop(); asm(“NOP”);

char volatile test;

int main(){

DDRB|=0x7F;//PB7 vstup ostatne vystup
PORTB|= (1<<PB7);//PB7 pull-up
DDRD|=0xFF;

while(1){

nop();

test =0xFF;
test|= READ_BYTE();

nop();

  }

}

[/code]

Když chceš do portů zapisovat, proč používáš funkci pro čtení?

Znamená to, že bit0 v proměnné bude zapsán do PB4, bit1 do PB3 … bit6 do PD5?

No ja som bol v tom ze je to funkcia pre citanie z nejakeho bytu a zaroven zapis na piny.

Presne si to vystihol. Bit0 s premenej aby sa zapisal do PB4

Snaž se napsat kód způsobem, kterému rozumíš.
Jestli se nevyznáš v bitových operátorech, tak to můžeš napsat jednoduše takto:
(Kód mi vyšel zhruba stejně velký jako s bitovými posuny.)

[code]#define setb(port,bit) ((port) |= (1<<bit)) // nastav bit
#define clrb(port,bit) ((port) &= ~(1<<bit)) // nuluj bit

// funkce zapíše bity “value.6,5,4,3,2,1,0”
// do PD5,PD6,PB0,PB1,PB2,PB3,PB4

void write_ports(uint8_t value)
{
if bit_is_set(value,0) setb(PORTB,4); else clrb(PORTB,4);
if bit_is_set(value,1) setb(PORTB,3); else clrb(PORTB,3);
if bit_is_set(value,2) setb(PORTB,2); else clrb(PORTB,2);
if bit_is_set(value,3) setb(PORTB,1); else clrb(PORTB,1);
if bit_is_set(value,4) setb(PORTB,0); else clrb(PORTB,0);
if bit_is_set(value,5) setb(PORTD,6); else clrb(PORTD,6);
if bit_is_set(value,6) setb(PORTD,5); else clrb(PORTD,5);
}

int main(void)
{
while(1)
{
write_ports(0b0101010); // PB3,PB1,PD6 = 1 ; PB4,PB2,PB0,PD5 = 0
}
}
[/code]

Chybu máš tu.
Keď bit nastavíš bit do log 1, po bitovej operácií OR sa ti nemôže zmeniť na log.0. Na log.0 sa môže zmeniť len po bitovej operácií AND.

Takže

test = 0x00; test |= READ_BYTE();

P.S.: Snaž sa program písať ,pekne". Vyhneš sa v budúcnosti mnohým problémom so zátvorkami a pod.

Vdaka za rady a objasnenie. Snazim sa osvojit si bitove operacie preto som vlastne aj zacal tento projekt aby som co najefektivnejsie vedel ovladat piny bez pisania obsiahlych kodov. Nejake priklady som nasiel na avrfreaks takze fajn

Squad neviem ci sa rozumieme ja by som potreboval zapisovat nejaku kombinaciu log1 a log0 do vystupnych pinov na porte. Cize mam nejaku premenu byte s hodnotou napr. 0xAA a podla nej som chcel “zapnut” vystupne piny na uP.

Spominala sa tu ze funkcia READ_BYTE() Pokial som dobre pochopil tak je na citanie hodnoty ktoru mam momentalne na porte (na vystupnych pinoch)

Funkce READ_BYTE byla myšlena na čtení ze vstupních pinů (registry PINx). Pokud by měla být použita na zjištění stavu výstupních pinů, musí se použít registr PORTx. Ale není to rozumné číst výstupní piny skládáním pomocí funkce a pak data zas rozkládat, to by bylo zbytečně zdlouhavé. Aktuální stav dat je vhodnější uchovávat ve zvláštní proměnné a je-li potřeba zachovat stav nepoužitých výstupních pinů, mělo by se to obsloužit uvnitř funkce WRITE_BYTE.

Doporučuji použít kód uvedený AB a bajt k zápisu si uchovávat v proměnné.