2016-10-27
Korábi áramkörünket kiegészítjük két kapcsolóval. Ebben a leckében le fogjuk kérdezni a kapcsolók állapotát, és ha eddig nem ismertük volna, megismerkedünk a logikai függvényekkel.
Egy kép az áramkörről.
Emlékeztetőül az ATmega8 bekötése:
Ebben a programban az A kapcsolót figyeljük vég nélkül, folyamatosan, vagyis végtelen ciklusban. Ha lenyomjuk az A gombot, a LED világítani fog. A port lábak kezelésére most is az általam előre megírt program részleteket, az úgynevezett makrókat használjuk. Létrehozunk egy a változót. Ebbe írjuk be a PD1_RD makróval a PD1 bemenetről lekérdezett értéket. Ha a kapcsolót lenyomjuk, ez 0 lesz, egyébként 1. Az if utasítással megvizsgáljuk a értékét, és annak megfelelően be/ki kapcsoljuk a LED-et. Programjainkba nyomatékosan javasolt megjegyzés fejrészt elhelyezni, ha néhány hónap után is ki akarunk a munkánkban igazodni. A fejrész persze eltérhet az általam használttól. Vegyük észre, hogy alakja ellenére ez egy "/* */" közé írt szöveg.
/*******************************************************************************
*
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.10.22.
* Chip - ATmega8
* Compiler - avr-gcc
*
* c_suli_4_1.c
* Kapcsolo figyelese, ha lenyomjuk, a LED vilagit
*
*******************************************************************************/
#define F_CPU 4 MHZ
#include "tkiraaly_atmega8.h"
int main( void)
{
unsigned char a= 0;
PB0_OUTPUT; // LED lab legyen kimenet
PD1_PULLUP; // A gomb laba legyen felhuzott bemenet
for(;;) // vegtelen ciklus
{
a= PD1_RD; // PD1 olvasása
if ( a == 0) PB0_0; // ha 0, PB0 legyen 0, a LED vilagit
else PB0_1; // ha nem 0, PB0 legyen 1, a LED nem vilagit
}
}
Egyetlen betüt módosítottam a programban, az if sorában, most nem azt vizsgáljuk, hogy a == 0, hanem azt, hogy a != 1. A működést megfordítottuk, és a LED akkor fog világítani, ha nem nyomjuk a kapcsolót. Ezt a logikai műveletet negációnak, invertálásnak, vagy NEM-nek, angolul NOT-nak nevezzük. Amúgy C-ben erre használjuk a "!"- felkiáltójelet (mint korábban már láttuk a "!=" relációnál is).
/*******************************************************************************
*
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.10.22.
* Chip - ATmega8
* Compiler - avr-gcc
*
* c_suli_4_2.c
* Kapcsolo figyelese, NOT demo (NEGACIO, INVERTALAS)
*
*******************************************************************************/
#define F_CPU 4 MHZ
#include "tkiraaly_atmega8.h"
int main( void)
{
unsigned char a= 0;
PB0_OUTPUT; // LED lab legyen kimenet
PD1_PULLUP; // A gomb laba legyen felhuzott bemenet
for(;;) // vegtelen ciklus
{
a= PD1_RD; // PD1 olvasása
if ( a != 0) PB0_0; // ha nem 0, PB0 legyen 0, a LED vilagit
else PB0_1; // ha 0, PB0 legyen 1, a LED nem vilagit
}
}
A következő program ugyanazt csinálja, mint a legfelső, csak a preprocesszornak adtam néhány #define utasítást. Így sokkal jobban olvasható, követhető kódot kaptunk. Az előfeldolgozó végignézi a programunkat, és ahol például megtalálja az "A_GOMB" szöveget, ki fogja cserélni "PD1_RD == 0" szövegre. Nem hoztam létre külön változót az A gombnak, mert meg lehet tenni, hogy magában az if-ben olvasom ki az értékét, és egyúttal rögtön meg is vizsgálom. Jó, ha észreveszzük,hogy a preprocesszornak szóló utasításokat nem kell ";"-vel lezárni, azok a sor végéig tartanak.
/*******************************************************************************
*
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.10.22.
* Chip - ATmega8
* Compiler - avr-gcc
*
* c_suli_4_3.c
* Kapcsolo figyelese, NOT 2 demo
*
*******************************************************************************/
#define F_CPU 4 MHZ
#include "tkiraaly_atmega8.h"
#define LED_KIMENET PB0_OUTPUT
#define LED_BE PB0_0
#define LED_KI PB0_1
#define A_FELHUZAS PD1_PULLUP
#define A_GOMB PD1_RD == 0
int main( void)
{
LED_KIMENET;
A_FELHUZAS;
for(;;) // vegtelen ciklus
{
if ( A_GOMB) LED_BE;
else LED_KI;
}
}
A következő programunk úgy működik, hogy a LED akkor fog világítani, ha mindkét gombot lenyomjuk. Ezt nevezzük logikai ÉS, angolul AND kapcsolatnak. Logikai feltételekben, vizsgálatokban ezt "&&"-vel jelöljük.
/*******************************************************************************
*
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.10.22.
* Chip - ATmega8
* Compiler - avr-gcc
*
* c_suli_4_4.c
* Kapcsolo figyelese, AND demo (ES kapcsolat)
*
*******************************************************************************/
#define F_CPU 4 MHZ
#include "tkiraaly_atmega8.h"
#define LED_KIMENET PB0_OUTPUT
#define LED_BE PB0_0
#define LED_KI PB0_1
#define A_FELHUZAS PD1_PULLUP
#define A_GOMB PD1_RD == 0
#define B_FELHUZAS PD5_PULLUP
#define B_GOMB PD5_RD == 0
int main( void)
{
LED_KIMENET;
A_FELHUZAS;
B_FELHUZAS;
for(;;) // vegtelen ciklus
{
if ( A_GOMB && B_GOMB) LED_BE;
else LED_KI;
}
}
A következő programunk úgy működik, hogy a LED világítani fog, ha bármelyik, vagy mindkét gombot lenyomjuk. Ezt nevezzük logikai VAGY, angolul OR kapcsolatnak. Logikai feltételekben ezt "||"-vel jelöljük.
/*******************************************************************************
*
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.10.22.
* Chip - ATmega8
* Compiler - avr-gcc
*
* c_suli_4_5.c
* Kapcsolo figyelese, OR demo (VAGY kapcsolat)
*
*******************************************************************************/
#define F_CPU 4 MHZ
#include "tkiraaly_atmega8.h"
#define LED_KIMENET PB0_OUTPUT
#define LED_BE PB0_0
#define LED_KI PB0_1
#define A_FELHUZAS PD1_PULLUP
#define A_GOMB PD1_RD == 0
#define B_FELHUZAS PD5_PULLUP
#define B_GOMB PD5_RD == 0
int main( void)
{
LED_KIMENET;
A_FELHUZAS;
B_FELHUZAS;
for(;;) // vegtelen ciklus
{
if ( A_GOMB || B_GOMB) LED_BE;
else LED_KI;
}
}
Gyártanak olyan IC-ket, amelyek úgynevezett logikai kapukat tartalmaznak, ezeknek lehet több bemenetük is. Két bemenet esetén, összesen 16 féle logikai kapcsolat definiálható. A gyakorlatban nem mindegyiknek van jelentősége, szükség esetén elkészíthetők az alap típusok ( NAND, NOR, NOT) kombinációjaként.