RE: Chyba v C - velmi podivné chování

Pavel Hudecek edizon na seznam.cz
Pondělí Duben 20 18:04:59 CEST 2020


Je.

A jinak teda ten kód udělá to, že pokud je splněna podmínka v závorce, nastaví se bit 0 na výstupní (zda to bude bit 0 není zaručeno, ale jinak skoro jisté).

V tomhle je super CodeVision, že se dá napsat třeba PORTB.3=1. Teda vlastně částečně byl, protože u nových AVR s UPDI to už neumí.

PH

Od: Ladislav Vaiz
Není to tak, že při pinu nastaveném na vstup se zápisem na PORTB zapíná 
a vypíná pullup?


Dne 20.04.2020 v 15:54 Petr Zapadlo napsal(a):
> 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.

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200420/16e240ca/attachment.html>


Další informace o konferenci Hw-list