Čtení vstupů, obsluha tlačítek

Čtení vstupů, obsluha tlačítek

     V předcházejících lekcích jsme používali porty mikropočítače jen jako výstupy. V této lekci si ukážeme, jak můžeme stejné porty nebo jejich jednotlivé bity (piny) používat jako vstupy pro sdělení informací do mikropočítače. Nejjednodušším prvkem, kterým můžeme přivádět na vstup mikropočítače dvoustavovou informaci (0 nebo 1), je kontakt tlačítka, popřípadě jiného spínacího prvku. Tlačítka mohou být zapojena tak, že v klidovém stavu (nejsou stlačena) je na vstupu úroveň 0 a po jeho stlačení bude na vstupu úroveň 1 – tzv. pozitivní logika – tlačítko S2, nebo je v klidovém stavu tlačítka na vstupu úroveň 1 a po stlačení bude úroveň 0 – tzv. negativní logika - tlačítko S1. V lekci se pomocí vzorových programů také naučíme používat příkaz podmínky If-Then-End If nebo If-Then-Else-End If, který slouží k vyhodnocení stavů tlačítek, a provést příslušnou akci. Příkaz If se používá velmi často k vyhodnocení různých podmínek, i složitých, a k tzv. větvení programu na základě splnění či nesplnění zadaných podmínek.

obrazekObr. 1: Schéma zapojení úlohyobrazekObr. 2: Realizace úlohy

’-------------------------------------------------------------------------------------------

’ PROGRAM TLAC+LED-1.bas Ukázka čtení tlačítek a zapínání LED

’ Program, kterým při stisku tlačítka S1 trvale zapneme LED na PORTC.5

’ a stiskem tlačítka S2 LED trvale vypneme.

’------------------------------------------------------------------------------------------

$regfile = “m8def.dat”                                ‘Soubor s deklaracemi

$crystal = 12000000                                  ‘Kmitočet krystalu v Hz

Config Portc.0 = Input                                ‘PC0 vstupní pro tlačítko S1

Config Portc.1 = Input                                ‘PC1 vstupní pro tlačítko S2

Config Portc.5 = Output                             ‘PC5 výstupní pro LED

’-----------------------------  HLAVNI PROGRAM  ----------------------------------

Do

If Pinc.0 = 0 Then                                       'jestliže je tlačítko S1 stisknuto,

Set Portc.5                                                 'pak nastav výstup PC5 trvale do log1

Waitms 50                                                   'čekej 50 ms

End If

If Pinc.1 = 1 Then                                       'jestliže je tlačítko S2 stisknuto,

Reset Portc.5                                             'pak nastav výstup PC5 trvale do log0

Waitms 50                                                  'čekej 50 ms

End If

Loop                                                           ‘jdi na Do

’-----------------------  KONEC HLAVNIHO PROGRAMU -------------------------

End

‘Poznámka:

‘TLAČÍTKA S1 A S2 JSOU ZAPOJENA ROZDÍLNĚ!

‘Tlačítko S1 přivádí při stisku na vstup PC0 log0, tlačítko S2 přivádí na vstup PC1 při stisku log1.

‘Při testování jakéhokoliv bitu můžeme použít pouze

‘If PINC.0=0 nebo If PINC.1=1

     Rezistory zapojené k tlačítkům definují úroveň vstupního napětí, když tlačítko není stisknuto. Kdyby tam rezistory nebyly, vstup by byl velmi citlivý na rušivá napětí, neboť je ve vysokoimpedančním stavu a pak funguje jako anténa. Protože tuto záležitost je potřebné při připojení vstupních signálů vždy ošetřit, jsou mikropočítače vybaveny vnitřními upínacími pull-up rezistory, které lze programově zapnout a potom se mezi vstup a kladné napájecí napětí zapojí uvnitř mikropočítače rezistor velikosti asi 50 kΩ. Tlačítko, nebo kontaktní vstup musí být zapojeno ze vstupu proti zemi, při rozpojeném kontaktu je na vstupu Log1, při stlačení Log0.

Použití a zapnutí vnitřního pull-up rezistoru ukazuje následující příklad.

’---------------------------------------------------------------------------------------------------

’ PROGRAM TLAC+LED-2.bas Ukázka čtení tlačítka s využitím pull-up rezistoru.

’ Program, kterým při stisku tlačítka na vstupu PC0 mění frekvenci blikání LED.

’---------------------------------------------------------------------------------------------------

‘Na vstup PC0 je připojeno proti GND tlačítko bez vnějšího rezistoru.

‘PC0 je nakonfigurován jako vstupní s vnitřním pull-up rezistorem, takže v klidu na něm bude \

úroveň 1.

‘To je velmi důležité, pokud necháme vstupní pin s velkou impedancí nepřipojený,

‘funguje jako anténa pro rušení které mění náhodně jeho hodnotu.

‘pull-up znamená, že vstupní pin je uvnitř mikroprocesoru připojen přes asi 50 kOhm na kladné napětí.

‘Hodnotu tlačítka čteme z PINC.0, při stisknutém tlačítku bude 0, jinak 1.

‘LED diodu připojíme k PC5.

‘Dioda bliká 1x za vteřinu, při stisknutém tlačítku 4x za vteřinu.

$regfile = “m8def.dat”                                  ‘Soubor s deklaracemi

$crystal = 12000000                                    ‘Kmitočet krystalu v Hz

Config Portc.0 = Input                                  ‘PC0 vstupní pro tlačítko

Config Portc.5 = Output                               ‘PC5 výstupní pro LED

Portc.0 = 1                                                   ‘pull up rezistor zapnut

’-----------------------------  HLAVNI PROGRAM  --------------------------------

Do

Portc.5 = Not Portc.5                              'změň úroveň na PC5. Stejně funguje: Toggle PortC.5

If Pinc.0 = 1 Then                                   'jestliže tlačítko není stisknuto, pak

Waitms 500                                            'čekej 500 ms

Else                                                        'jinak, když je tlačítko sepnuto (PinC.0=0)

Waitms 125                                            'čekej 125 ms

End If

Loop                                                       ‘jdi na Do

’-------------------------  KONEC HLAVNIHO PROGRAMU  -------------------------------------

End

Zápis programu lze dále zjednodušit a především zpřehlednit použitím aliasů a konstant, jak ukazuje následující ukázka jen upraveného předchozího příkladu.

’----------------------------------------------------------------------------------------------------------

’ PROGRAM TLAC+LED-3.bas Obdoba programu TLAC+LED-2 s využitím aliasů.

’ Program, kterým při stisku tlačítka na vstupu PC0 mění frekvenci blikání LED,

’ pro vstupy, výstupy i stavy tlačítka můžeme použít přezdívek .

’----------------------------------------------------------------------------------------------------------

$regfile = “m8def.dat”                                              ‘Soubor s deklaracemi

$crystal = 12000000                                                ‘Kmitočet krystalu v Hz

Config Portc.0 = Input                                              ‘PC0 vstupní pro tlačítko

Config Portc.5 = Output                                           ‘PC5 výstupní pro LED

Portc.0 = 1                                                               ‘pull-up rezistor zapnut

Const Sepnuto = 0                                                   ‘Konstanty označující stavy tlačítka

Const Rozepnuto = 1

Ledka Alias Portc.5                                                  ‘Přezdívka pro PortC.5

Tlacitko Alias Pinc.0                                                 ‘Přezdívka pro PinC.0

’----------------------------------  HLAVNI PROGRAM  -----------------------------------------------

Do

Toggle Ledka                                                          ‘změň úroveň na LED

If Tlacitko = Rozepnuto Then                                   'jestliže tlačítko není stisknuto, pak

Waitms 500                                                              'čekej 500 ms  

Else Waitms 125                                                       'čekej 125 ms

End If

Loop

’---------------------- KONEC HLAVNIHO PROGRAMU --------------------------------------

End

‘Ukázka, jak udělat kód srozumitelnější použitím jmen-přezdívek pro porty a konstanty.

‘Další výhoda je, že při změně zapojení stačí změnit jen pojmenování vývodů.

Zdroje

Obrázky: 

  • Obr. 1, 2: Archiv autora. 
Přílohy
TLAC LED-1-program.zip Stáhnout
TLAC LED-2-program.zip Stáhnout
TLAC LED-3-program.zip Stáhnout