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