Funguje báječně, ale neseje (3. díl)

Minule jsme se zabývali komunikací počítače prostřednictvím programovacího „kabelu“ a samotné procesorové desky robota. Nakonec jsme skončili u blikání LEDkou takže dneska už máme 100% vyladěné 3 procedury: ROŽNI – alias ROZSVIŤ, která nám LEDku rozsvítí, pak proceduru ZHASNI a proceduru ČEKEJ SEKUNDU.  Pro další ladění robota a jeho periferií je nezbytné mít možnost „nějak vstupovat“ do běhu programu a to ne přes iPhone a bluetooth modul, který se nám stejně nepodaří pořádně rozchodit. Zatím budeme robota řídit tlačítkem.

9. Čtení tlačítka

Většinou se tlačítko zapojuje tak, že od napájení na pin procesoru vede tzv. Pull-up rezistor, který zajišťuje na vstupním pinu definované napětí. Vhodná hodnota takového rezistoru je 1Kilo ohm až 100 Kilo ohmů podle toho, jak velký proud chceme na tlačítko „obětovat“.

Tlačítko pak zkratuje rezistor směrem k zemi a dělá tedy Pull-down. Z toho vyplývá, že „nestisknuto“ čte procesor jako hodnotu 1, a „stisknuto“ čte procesor jako hodnotu 0. Pokud máte tlačítko zapojeno jinak (jako Pull-up) bude to pochopitelně obráceně. Výhodou zapojení tlačítka mezi pin a zem je to, že většina procesorů má Pull-up odpor už vestavěný uvnitř. U PICek je to myslím automatické a u AVR se dá Pull-up zapnout programem.*) Proto vlastně ani žádnou součástku navíc nepotřebujeme.

Pokud stiskneme tlačítko, tak při pomalosti našich smyslů si myslíme, že „v něm cvakne“ a je to, ale kontakty tlačítka ve skutečnosti pruží a každým stiskem vydají několik pulsů. Takže procesor, který jede třeba na 16 MHz, si myslí, že jsme tlačítko stiskli několikrát; proto správná procedura pro čtení tlačítka vypadá nějak takto:

10 PROCEDURA ČTI_TLAČÍTKO
20 A = 0
30 FOR I=0 TO 100
40 IF TLAČÍTKOVÝ_PIN = 1 THEN A=A+1
50 NEXT I
60 IF A > 75 THEN RETURN „true“
             ELSE RETURN „false“

Jasně, že pokud máte pomalý procesor PICAXE můžete tlačítko přečíst třeba jenom 10x a na konci dát, že stisknuto je když A > 7. Pokud máte rychlý procesor, můžete čtení opakovat vícekrát, ale nedoporučuju jít přes „255krát“ protože pak kompilátory musí použít 16 bitové proměnné, což program zbytečně natáhne.

Máme tedy napsánu proceduru pro čtení tlačítka a jdeme zkoušet, takže napíšeme prográmek:

10 IF ČTI_TLAČÍTKO THEN ROŽNI
20 GOTO 10

Pustíme tento prográmek a ten je tak hloupoučký, že jenom čeká na tlačítko a pak rozsvítí LEDku. Už ji ani neumí zhasnout. Pokud se LEDka rozsvítí i bez stisku tlačítka, máme v proceduře ČTI_TLAČÍTKO chybu. Tu odhalíme metodou „rozděl a panuj“ a to tak, že při ladění na „kritická místa“ procedury umisťujeme už odladěný a fungující příkaz ROŽNI a pozorujeme, jestli se LEDka rozsvěcuje jak má. Proč zatím nepoužíváme příkaz ZHASNI, si ukážeme na následujícím příkladu:

10 IF ČTI_TLAČÍTKO THEN ROŽNI
20 ZHASNI
30 GOTO 10

Pustíme-li tento prográmek, LEDka bude zhasnutá a pokud stiskneme tlačítko, začne sotva patrně poblikávat. To je proto, že celý cyklus se pořád dokola opakuje ve vysokém tempu a mezi příkazem ROŽNI a ZHASNI je jenom kratičká chvilička. Proto bychom mohli napsat:

10 IF ČTI_TLAČÍTKO THEN ROŽNI
20 ČEKEJ SEKUNDU
30 ZHASNI
40 GOTO 10

ale to by program většinu času trávil v proceduře ČEKEJ SEKUNDU a tak bychom tlačítko museli mačkat déle než sekundu a to by bylo nepohodlné. Správná verze se zhasínáním je tato:

10 IF ČTI_TLAČÍTKO THEN ROŽNI
                   ELSE ZHASNI
20 GOTO 10

Dokud budeme mít stisknuté tlačítko, LEDka bude výrazně svítit. V dalším ladění ale budeme testovat motory, které se neroztočí zdaleka tak rychle jako se LEDka rozsvítí, proto budeme potřebovat funkci klasického vypínače. Stisknu a rozsvítí se, stisknu podruhé a zhasne. K tomu bychom mohli napsat naivní prográmek ve stylu:

10 IF ČTI_TLAČÍTKO = true THEN ROŽNI
20 IF ČTI_TLAČITKO = false THEN ZHASNI
30 GOTO 10

Ale čím se vlastně tento prográmek liší od předchozího? Prakticky ničím kromě dvojitého čtení tlačítka. Proto si napíšeme jinou proceduru:

10 PROCEDURA ČEKEJ_STISK
20 IF ČTI_TLAČITKO = false THEN GOTO 20
30 IF ČTI_TLAČÍTKO = true THEN GOTO 30
40 RETURN

Tohle je nejjednodušší případ prográmku, kterému se říká „konečný automat“, neboli anglicky „finite state machine“. To jsou prográmky, které mají několik vnitřních stavů a několik podmínek, za kterých mezi nimi přecházejí. Jak tedy prográmek funguje? Pokud tlačítko není stisknuté, prográmek nekonečně cykluje na řádku 20. To je první stav. Když tlačítko stiskneme přejde koncový automat do druhého stavu na řádek 30 kde zase do nekonečna čeká, až tlačítko pustíme. Takže pokud napíšeme prográmek:

10 ČEKEJ_STISK
20 ROŽNI
30 ČEKEJ_STISK
40 ZHASNI
50 GOTO 10

co si myslíte, že bude tento prográmek dělat?

Protože dneska opět končíme, za domácí úkol si naprogramujte pro svůj procesor všechny procedury a vyzkoušejte poslední prográmek, až bude fungovat jak baterka od Vietnamce. Příště začneme točit motory.


Pozn. red:

*) I u PICek a tedy i u PICAXE se pull-up rezistory zapínají programově