Chyba v C - velmi podivné chování

Petr Zapadlo zapik na email.cz
Pondělí Duben 20 15:54:55 CEST 2020


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ší část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200420/009e5926/attachment.html>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: oabnemokomjkijdi.png
Type: image/png
Size: 5086 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200420/009e5926/attachment.png>


Další informace o konferenci Hw-list