Ahoj. Pro dobré pochopení situace je třeba vidět všechny potřebné souvislosti. V Yrobotu totiž piny pro BEEP, LED_7 a LED_8 používají tzv. "negativní logiku", takže např. LED svítí při logické nule a nesvítí při logické jedničce (lze to poznat ze schématu zapojení). Proto se ve "standardní logice" musí používat přesně obrácené zápisy pro "nastavení a vypnutí něčeho". A to je i případ DDR registru pro snímače. Inicializaci portu pro snímače už ale opusťme a berme ji za použitelnou (tu mojí).
Experimentovat s celým kódem funkce basic_test() je zajímavý přístup, ale myslím, že v tomto případě je to matoucí (v té funkci většinu věcí vůbec nepotřebujeme ani nechceme). Musíme si vybrat jen to, co se nám hodí. Nejdůležitější je si uvědomit, že pro čtení stavu snímačů už nebudeme OPT_PORT nastavovat, ale budeme z něho jen číst (OPT_PORT by se v našem programu už nikdy neměl vyskytnout vlevo od rovnítka). Číst budeme analogově, takže z basic_test() vybereme jen část, která se týká testu odporového trimru v Yrobotu. Jde nám tedy jen o funkce adc_channel_set(), adc_read(), led_display_hex() a delay_ms(). Výsledkem budou jen čtyři řádky našeho testovacího programu (jak už jsem naznačil v jeho "kostře" a jak teď ještě trochu víc "napovím"):
Kód: Vybrat vše
while(1) { // zakladni nekonecna smycka
// vyber AD prevodniku (prislusneho strednimu snimaci) => pouzijeme adc_channel_set()
// cteni hodnoty z ADC (rozsah je 0 - 1023) => pouzijeme adc_read()
// zobrazeni orezane ADC hodnoty na LED displeji => pouzijeme led_display_hex()
// cekani cca 100 ms abychom tu smycku netocili zbytecne moc rychle => pouzijeme delay_ms()
}
Zkus teď ty funkce reálně použít v programu (jejich zapsáním před komentářová dvojitá lomítka a doplněním vhodných parametrů). Znovu se inspiruj malou částí demo funkce basic_test() [ale nedávej ji celou do našeho programu]. To je nejbližší krok ke sledovači čáry.
Musím ještě zdůraznit, že navrhuji v testu číst zatím jen střední snímač, protože v Yrobotu je zřejmě standardně zapojen odporový trimr přesně tam, kam je zapojen levý snímač OPT modulu (na ADC0). Aby dobře fungoval levý snímač, bude třeba trimr od ADC0 nějak "odpojit" a to zatím nevím jak (ve schématu Yrobota není nakreslena žádná vhodná propojka, kterou by šlo rozpojit). Mimochodem, v basic_test() se na sedmisegmentovkách zobrazuje právě jen stav ADC0 (najdi si to v programu), a proto to zatím trochu reagovalo právě jen na levý snímač (ještě víc by to asi reagovalo na otáčení trimrem).
Teď se ale soustřeď na ten testovací program. Výsledkem musí být jen čtyři řádky kódu (s využitím funkcí navržených v komentářích). Ten výsledek sem potom, prosím, pošli.
Poznámku mám ještě k tomu, že v Yrobotu můžeš číst najednou jen jeden ADC kanál (nepokoušej se tedy analogově číst všechny tři senzory naráz).
P.S.: Tvoje pokusy s led_on() a snimac_on() byly zcela mimo. Zapomeňme na ně.