A sakra. moje chyba. Ten program nemá blikat LEDkou, špatně jsem se díval. Funguje to tedy tak, jak má (ten původní program). Omlouvám se.
Aby Ti dobře fungovalo rozpoznání stlačení obou tlačítek, tak musíš vědět, jak přesně funguje makro _BV(bit), které je obsaženo v "Led_Button.h". Toto makro očekává jako parametr (bit), číslo od 0 do 7 a převádí ho na byte, ve které je nastaven na jedničku jen ten příslušný bit. Nelze u něj tedy použít logické "nebo" stylem (PB2|PB3). PB2 ve skutečnosti znamená číslo 2 a PB3 znamená číslo 3 Výsledkem té bitové "nebo" operace je tedy opět číslo 3, takže jsme si nijak nepomohli (kontroluje to jen pravý spínač). Podobné je to i u snahy o ovládání dvou LED jedním řádkem programu. Šlo by to, kdyby ty funkce sbi, tbi a cbi byly jiné, ale takhle to nejde. Můžeš ale bez problémů nastavovat (nebo testovat) dva různé bity pomocí dvou nezávislých volání těch funkcí (maker).
Takže např. nějak takto:
Kód: Vybrat vše
if (is_low(PINB,PB2) && is_low(PINB,PB3)) // takhle otestuju dva ruzne bity
{
tbi(LED_BUZZER_PORT,PA5); // tady prepnu stav LED7
tbi(LED_BUZZER_PORT,PA6); // tady prepnu stav LED8
while(is_low(PINB,PB2) && is_low(PINB,PB2)) // tady cekam na uvolneni treba i jen jednoho z tlacitek
{
cbi(LED_BUZZER_PORT,PA7); // tady zapinam bzucak (a necham ho zapnuty, dokud drzim obe tlacitka)
}
sbi(LED_BUZZER_PORT,PA7); // tady vypinam bzucak
_delay_ms(100); // tady cekam desetinu sekundy napr. abych potlacil zakmity tlacitek
}
Přidal jsem tam komentáře, abys mohl zhodnotit, nakolik je Ti to jasné. Pro zajímavost si můžeš (pokud chceš) upravit ten program tak, aby ty LED opravdu blikaly tak, jak jsem omylem psal dříve.
V souboru "yellow_robot.h" nemusíš v prvním přiblížení chápat, jak je to tam napsáno, ale všímej si hlavně těch slovensky psaných komentářů, které vysvětlují, co a proč je tam definováno (hlavně názvy pomocí "#define" a funkce obvykle pomocí "void funkce()".
Možná se můžeme vrátit ještě o kousek zpátky a pobavit se trochu obecněji o vývoji programů. Osobně jsem ze "staré školy" a používám tzv. metodu "shora dolů" (top down), kdy se na celý řešený problém podívám z velkého nadhledu a napíšu si "kostru", která popisuje to hlavní, co by měl program dělat, ale používá přitom ještě neexistující funkce, které rozpracuju teprve později (jdu tedy od celkového k detailům). Existují i jiné programátorské metody, ale ten "top down" mi prostě vyhovuje.
Takže například ten svůj původní návrh algoritmu sledovače čáry bych mohl "z nadhledu" napsat např. takto:
Kód: Vybrat vše
#include "yellow_robot.h" // vlozeni HAL knihovny pro abstrakci od HW Yrobota
init(); // inicializace vseho potrebneho mimo OPT modul
initOPT(); // inicializace OPT modulu
motor_run(150,150); // zacneme jizdou rovne
while(1) { // zakladni nekonecna smycka
if (cara_je(VLEVO) motor_run(0,150); // kdyz je cara vlevo, zatacim vlevo
if (cara_je(UPROSTRED) motor_run(150,150); // kdyz je cara uprostred, jedu rovne
if (cara_je(VPRAVO) motor_run(150,0); // kdyz je cara vpravo, zatacim vpravo
// zadny dalsi test tu uz nemam, takze kdyz nevidim caru, delam to posledni, co jsem delal predtim
}
V této "kostře" programu jsem využil funkce "init" a "motor_run", které jsou definované v "yellow_robot.h" (a "yellow_robot.c"), ale kromě toho jsou tam zatím neexistující názvy VLEVO, UPROSTRED, VPRAVO a funkce "initOPT" a "cara_je", které teprve budu muset napsat. Obvykle pak postupuju tak, že napíšu "prototypy" potřebných funkcí, které zpočátku nedělají vůbec nic (jen existují, aby se dal program přeložit) a ty postupně rozpracovávám, aby dělaly to, co od nich očekávám. Když by mi nějaká funkce připadala moc složitá, tak ji opět "rozdělím" na několik jednodušších pomocí stejného "top down" přístupu.
Programování by prostě podle mne mělo být přehledné a co nejjednodušší.
Chceš používat tento "top down" přístup, nebo preferuješ něco jiného? Dej vědět.
P.S.: Ano, zkratkou OPT označuju senzorový modul, protože je tak označen v dokumentaci na webu autorů Yrobota. Ten soubor se jmenuje "OPTmodul.pdf".