Re: Chyba v C - velmi podivné chování
Ladislav Vaiz
spam na nagano.cz
Pondělí Duben 20 16:03:38 CEST 2020
Není to tak, že při pinu nastaveném na vstup se zápisem na PORTB zapíná
a vypíná pullup?
L.
Dne 20.04.2020 v 15:54 Petr Zapadlo napsal(a):
>
> Zdravím,
>
> udělal jsem chybu v C zápise - zapomněl jsem jedno většítko:
>
> DDRB |=(1<CLK_UP);
>
> takže se ze zápisu jedničky do patřičného bitu stalo cosi.
>
> Nastavení portu proběhne jen jednou na začátku programu, směr pinu už
> pak nikde neměním.
>
> IO používám takto:
>
> void shift_out_up(uint8_t data){
> for (uint8_t i=0; i<8; i++){
> if ((0b10000000>>i)& data){ PORTB |=(1<<MOSI_UP);} else {PORTB
> &=~(1<<MOSI_UP);}
> pause_us(1);
> PORTB |=(1<<CLK_UP);
> pause_us(1);
> PORTB &=~(1<<CLK_UP);
> }
> }
>
> tj čistě jako výstupní.
>
> A teď záhada - čekal bych, že pokud nastavení v DDRB neproběhne dobře,
> tak pin bude buď vstupní a nebo výstupní. A pokud bude výstupní, tak
> to bude fungovat. (Po opravě výrazu to začalo fungovat).
>
> Pokud vstupní, tak na něm neuvidím nic - ale ve finále to vypadá takto:
>
>
> Když je sousední pin na 0, tak hodiny na výstup jdou, když je vedlejší
> pin na 1, tak to zmizí, ale ne vždy - v reálu se to chovalo tak, že se
> občas "ztratil" nějaký tik hodin.
>
> Jak může pin takto "plavat"?
>
> Jen doplňuji, je to Attiny84.
>
> Pěkně zákeřná chyba.
>
> Petr
>
Další informace o konferenci Hw-list