Ahojte.
Neviem presne či sa to volá rušenie alebo nie ale každopádne ked do ATmega8 nahrám jednoduchý program na čítanie vstupu a jeho následné zobrazenie na sedemsegmentovke, program funguje tak ako chcem.Ale ide o to že vstupy reagujú aj na dotyk nielen na hodnotu log 1.Neviete mi poradiť ako by sa to dalo ošetriť? mikropočítač programujem cez paralelný port, pomocou jednoduchého zapojenia bez súčiastok, len čisto piny z LPT prepojene káblikmi do mikropočítača.
administrator: přejmenováno z "zobrazenie vstupu na display,problem z rušením"
S tým zapojením kondenzátora voči zemi ste mali namysli niečo také ?
(nesmiat prosím , kreslil som to narýchlo v robote)Lebo neviem akým zázrakom sa mi podarilo ten mikropočítač dostať do stavu nechodivosti (asi som ho odpalil).
Na kondenzátor bych nespoléhal , úroveň na vstupu nezaručí . Správná cesta je odpor na napájení nebo na zem, zřejmě by stačilo jen zapnout vnitřní pull-up odpor pomocí PORTx|=(1<<pin); . Ten by měl definovat log.1 na vstupu. Vstup pak bude reagovat na připojení na zem.
Taky to řeším jen zapnutím vnitřním pull-up odporem. Je to problém s vysokou impedancí vstupu a většinou jen nezapojeného “v luftě” Záleží jaký signál k tomu připojíš. Když to bude připojeno na signál tak by to mělo být bez problémů.
Jednoznačně buďto povol interní pullup DDR=0 & PORT=1, nebo ho dej zvenčí, ca 56k - 1k.
Sběrnice, tedy žádný pin nesmí lítat v luftě, jinak je velká šance, že ho odkouříš při první příležitosti nějakým elstat. nábojem. Nebo ti to bude minimálně dělat takové blbosti, jak popisuješ. Ten vstup, může mít impedanci třeba gigaohm. VIm akorát, že analogocý komparátor a ADC mají oba vstupní odpor 100Mohm. Takže klasické jednoduché piny by mohly mít ještě více. Takže se pak není čemu divit, že to reaguje na přiblížení ruky na vzdálenost 0.5 metru, když se dá jako anténka kus drátku přímo na ten pin.
Zkontroluj si jestli máš dobře zapájenou zem a alespoň jeden kondik 100nF u napájecího napětí.Problém s rušením na vstupech se mi pak neobjevoval, používal jsem externí pull-upy.
Kathel, nebudu to zbytečně opakovat, kondík na napájení ani ve vstupu ti rušení vstupu visícího v luftě NEvyřeší.
Kondík na napájení je samozřejmost. Vedením ztemí, pokud to neni jo extrém, to není. JE ot tím, že tam dotyčný nemám pull-up ani pull-down. To je řešení, ne kondenzátor.
áchjo. MYslíš si, že kondík ti vyřeší zákmity? Zkus si to. Aby ti to filtrovalo zákmity, potřebuješ zpoždění ca 10-20ms. A to ti 100nF kondík jen samotný neudělá. Strčit tam RC článek, to by šlo. Ale samotný kondík je celkem k ničemu. Kdysi jsem se o tohle pokoušel taky, a bohužel to nefunguje.
Mnohem spolehlivější je dát si do programu nějaký přiměřený zpoždění, po každém přečtení stisku tlačítka. Ale zas záleží co to je za program.
zen: Můžeš nám ten program ukázat?
Velmi si cením že sa mi snažíte pomôcť. Ten program vám ukážem , ale nečakajte nijake zazraky.Som nováčik v tomto obore, preto sa vlastne obraciam na vás aby som sa niekam pohol…Ešte raz díky.
#include <mega8.h> #include <delay.h>
int a,b,c,d,e,f,g,h;
ACSR=0x80;
SFIOR=0x00;
a = (0b00000110); //1
b = (0b01011011); //2
c = (0b01001111); //3
d = (0b01100110); //4
e = (0b01101101); //5
f = (0b01111101); //6
g = (0b00000111); //7
h = (0b00000000); // prazdne
while (1)
{
if (PINC.5 == 1) PORTD = a;
delay_ms(100);
if (PINC.5 == 0) PORTD = h;
if (PINC.4 == 1) PORTD = b;
delay_ms(100);
if (PINC.4 == 0) PORTD = h;
if (PINC.3 == 1) PORTD = c;
delay_ms(100);
if (PINC.3 == 0) PORTD = h;
if (PINC.2 == 1) PORTD = d;
delay_ms(100);
if (PINC.2 == 0) PORTD = h;
if (PINC.1 == 1) PORTD = e;
delay_ms(100);
if (PINC.1 == 0) PORTD = h;
if (PINC.0 == 1) PORTD = f;
delay_ms(100);
if (PINC.0 == 0) PORTD = h;
};
Tohle, je k ničemu. Naprosto k ničemu. Všechno je po resetu procesoru automaticky vypnuté, takže zapisovat někam nuly nemá smysl, en to zdržuje program.
Ještě jsem si všimnul “ACSR=0x80;” - ACSR je co za registr? Analog Comparator Status Register? Proč zapisuješ 1čku do 7mého bitu?
DAlší pěkná blbost je toto:
int a,b,c,d,e,f,g,h;
Pokud jsem si správně v šimnul, tak do těch proměnných ukládáš pouze 8bitová čísla, tak proč 16b int ještě se znaménkem? ZAs to jen zdržuje program, a plácá to volné místo v paměti, které se může později využít jinak. Přepiš si to na typ char. Char je bez znam,énka 8 bitů (0…255), jo, a ten int je -32768…32767
To co psal Jan16 je sice pravda - ale jsou to naprosto nepodstatné věci, které ti vůbec nepomůžou.
O těch zásadních se vůbec nezmiňuje - tady jsou:
Na vstupech máš zapnuté vnitřní pullupy (PORTC=0b10111111;) a tlačítka máš proti +5V - to znamená, že tam je pořád “1”. Tlačítka spínej proti 0V.
V hlavní smyčce pak neděláš nic jiného, než že každých 100ms zobrazuješ postupně 1,3,5,7 což musí mít za výsledek to ,že ti stále svítí všechny segmenty.
Takhle jak to máš je to nesmysl. Nevím jak ti to může fungovat.
Buď bys musel použít 10 vstupů (pro každý znak jeden), nebo si vypomoct BCD kódováním - pak ti budou stačit jen 4 vstupy.
při použití vstupů PINC.0-PINC.3 by to mohlo vypadat takto:
jan: všechny celočíselné typy jsou standardně znaménkové (i char), když se znaménkem být nemá, je nutné ho deklarovat jako “unsigned”(unsigned char, unsigned int…).
Komparátor se dá vypnout pro úsporu energie zapsáním 1 do bitu 7 “Bit 7 – ACD: Analog Comparator Disable”
Zen: snaž se minimalizovat používání globaálních proměnných. Použij lokální když je to možné. Zde ovšem nepotřebuješ žádnou když to napíšeš jako lou.
Místo “#include <mega8.h>” vkládej “#include <avr/io.h>”
Překladač načte definice pro správný procesor dle nastavení projektu a nemusíš to řešit.
Myslím, že delay.h je v “util”, tedy #include <util/delay.h>
Mně ale připadá, že to je psané v Codevisionu - dá se to snadno identifikovat třeba podle těch zdánlivě nesmyslně nastavovaných registrů - to tam generuje wizzard . Jenom jsou vymazané komentáře.Nebo podle toho, že jako nekonečná smyčka se používá while(1) místo v GCC používaného for( ; ; ) (nemusí být pravidlem). Nebo tím, že funkci main automaticky nastavuje jako nic nevracející (voidmain(void) ).
V tom případě tam musíš to #include <mega8.h>
nechat
a ještě piityy:
nevím jak v GCC, ale právě v CV se v konfiguraci překladače dá nastavit, že záps char chápe jako unsigned (dokonce je to tam myslím implicitně nastavené) znaménkový se pak musí zapisovat signedchar.
Máš pravdu, CV to bude (i podle “PINC.5 == 0”), protože takové prasárny, co jdou v CV snad jinej překladač neumí .
Pak má člověk něco umět napsat, když ho od začátku učej něco takovýho.
Máte pravdu… Zase vychytávky, s těma nepočítám. Už vidím, jak budu mít problém až budu znaménkovej char potřebovat a celej den do toho vejrat jak na nový vrata proč to nejde…