C suli 4 - Kapcsoltam - Rózsa György nélkül

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.