Ahoj, chtěla bych se zeptat, jestli by mi někdo nepomohl. Chtěla bych, aby se LED diody postupně rozsvicovali od prvního pinu portu do posledního a pak se zase postupně od posledního pinu zhasínali, nějak mi to nejde… Předem děkuji
Špatně máš na tom to, že to máš špatně. Cyklus je jen do 8, takže v testu nebude nikdy n >= 16. Rotace <<= 0 neudělá nic. Tak třeba takhle by to mohlo jít:
Myslíš tohle? “PORTB |= 0x80” To nastaví 7. bit portu B na “1”. Bitový posun “PORTB >>= 1” posune bity o 1 pozici dolů, do nejvyššího bitu nastaví “0”, proto je potřeba doplnit chybějící “1” tím |=.
Funkce “_delay_ms” používá smyčku _delay_loop_2 (v assembleru), jejíž 1 průchod trvá 4 strojové takty. Vstupním parametrem funkce je 16-bitový WORD. Maximální hodnota je 65536 (= hodnota 0), což je * 4 = 262144 taktů. U krystalu 16 MHz je doba jednoho taktu 1/16MHz = 0,0625 us. Maximální doba čekací smyčky _delay_ms je proto 0,0625 * 262144 = 16,384 ms. Což není moc a proto se používá ještě obcházka, že pro delší čas než těchto 16 ms se čeká v násobcích 10 ms (proto nad 16 ms se snižuje přesnost čekací smyčky), čítač je unsigned word, proto maximální doba _delay_ms je 6,5 sekundy (nezávisle na rychlosti MCU). … Uvedené platí pro win_avr_20100110, u starších verzí to bylo trochu jinak.
DDRB = 0xff;
PORTB = 0xfe;
while(1)
{
char n;
for(n = 7; n > 0; n--)
{
PORTB <<= 1;
PORTB |= 1;
_delay_ms(100);
}
for(n = 7; n > 0; n--)
{
PORTB >>= 1;
PORTB |= 0x80;
_delay_ms(100);
}
}
Teda ono to není tak úplně správně, protože na krajních LED vznikají krátké falešné impulsy. V tomto případě to nevadí, ale kdyby to mělo být přesně, tak se musí dělat rotace v pomocné proměnné a tu pak dávat na výstup, např.: