[PIC programování] – 4. díl
Ahoj! Vítám vás u čtvrtého dílu této série.
V dnešním díle se pokusíme napsat program, který při stisku tlačítka rozsvítí LEDku a při druhém stisku jí zhasne. Provedeme to za pomoci té lehčí varianty, že program bude čekat na stisk tlačítka ve smyčce, což povede k jednoduchosti, zároveň však nebude moci provádět jiné úkony. Pojďme na to!
Použijeme zapojení z minulého dílu:
V tomto případě není důvod nejprve programovat PICku a potom sestavovat obvod, protože PICku už máme naprogramovanou z předchozího dílu (se stejným zapojením) a nemělo by tudíž nikde dojít ke zkratu.
Stejně tak použijeme kód z minulého dílu, akorát umažeme vše mezi návěštím START a instrukcí end:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
LIST p=16F1705 #include "p16f1705.inc" __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_ON & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF org 0 ;začínáme na adrese 0 ;nastavení vnitřního oscilátoru na frekvenci 4MHz movlw b'01101010' banksel OSCCON ;je třeba vybrat správnou banku movwf OSCCON ;nastavení portu RC3 jako digitálního výstupu banksel TRISC bcf TRISC,3 ;nastavení portu RC2 jako digitálního vstupu bsf TRISC,2 ;nyní je třeba říci mikrokontroléru, že je vstup RC2 digitální (ve vychozím stavu je analogový) banksel ANSELC bcf ANSELC,2 ;0 pro digitální, 1 pro analogový START ;začátek hlavního programu ;sem budeme psát následující kód end ;konec programu |
Pojďme si doplnit kód do hlavní části programu. Nejprve vypneme LEDku:
1 2 |
banksel LATC bcf LATC,3 ;zhasneme LEDku |
Kód, který známe, nemusím doufám vysvětlovat… Dále počkáme na stisk tlačítka. Jakmile je tlačítko stisknuto, LEDku rozsvítíme.
1 2 3 4 5 |
banksel PORTC btfss PORTC,2 ;je tlačítko stisknuto? goto $-1 ;není banksel LATC ;je bsf LATC,3 ;rozsvítíme LEDku |
Nyní počkáme, až se tlačítko uvolní:
1 2 3 4 |
banksel PORTC btfsc PORTC,2 ;je tlačítko uvolněno? goto $-1 ;není ;tlačítko bylo uvolněno, můžeme pokračovat dále |
Nyní první část kódu zopakujeme a upravíme pro vypnutí LEDky:
1 2 3 4 5 |
banksel PORTC btfss PORTC,2 ;je tlačítko stisknuto? goto $-1 ;není banksel LATC ;je bcf LATC,3 ;zhasneme LEDku |
A znovu čekáme na uvolnění tlačítka:
1 2 3 4 |
banksel PORTC btfsc PORTC,2 ;je tlačítko uvolněno? goto $-1 ;není ;tlačítko bylo uvolněno, můžeme pokračovat dále |
Teď už jen stačí vrátit se zpět na START, aby se celý proces mohl opakovat:
1 |
goto START |
Opět snad nemusím vysvětlovat… Celý kód tedy bude vypadat takto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
... START ;začátek hlavního programu banksel LATC bcf LATC,3 ;zhasneme LEDku banksel PORTC btfss PORTC,2 ;je tlačítko stisknuto? goto $-1 ;není banksel LATC ;je bsf LATC,3 ;rozsvítíme LEDku banksel PORTC btfsc PORTC,2 ;je tlačítko uvolněno? goto $-1 ;není ;tlačítko bylo uvolněno, můžeme pokračovat dále banksel PORTC btfss PORTC,2 ;je tlačítko stisknuto? goto $-1 ;není banksel LATC ;je bcf LATC,3 ;zhasneme LEDku banksel PORTC btfsc PORTC,2 ;je tlačítko uvolněno? goto $-1 ;není ;tlačítko bylo uvolněno, můžeme pokračovat dále goto START end ;konec programu |
Nyní když vyzkoušíme program, by měla být LEDka zhasnutá. Po stisknutí tlačítka by se měla rozsvítit, po dalším stisku zhasnout a tak pořád dokola. Obvod se může chovat trochu podivně a občas se LEDka nerozsvítí/nezhasne. Je to z toho důvodu, že u ne příliš kvalitních tlačítek dojde k nepatrnému jiskření při stisku/uvolnění tlačítka. Protože je náš mikrokontrolér poměrně rychlý, stihne se na stav tlačítka zeptat v době jiskření a zjistí několikrát změnu stavu. Tento problém později vyřešíme snížením frekvence dotazování na stav tlačítka.
Celé řešení je ale dost nepraktické a – jak si ukážeme v dalších dílech – ve většině případů naprosto nepoužitelné právě z důvodů, že procesor mezitím nemůže vykonávat jiné instrukce.
To by bylo pro tento krátký díl vše, v příštím díle se na chvíli odkloníme od experimentů s tlačítkem a ukážeme si práci s vlastními “proměnnými” a porovnávání jejich hodnot. Do té doby vám přeji mnoho úspěchů s assemblerem!