Kompatibilní zapojení: LED panel s ATmega8

Ke stažení: LED_003.c == LED_003.pdf == LED_003.htm


/*
V minulém programu se nám podařilo rozblikat řadu LED diod pomocí cyklu,
čekání a dvou konstant (STAV1 a STAV2) které nám určovaly, jaké ledky mají
svítit. Problém je v tom, že po napsání první konstanty musíme vytvořit tu
druhou přesně opačně (kde byly jedničky, budou nuly, a naopak), protože jinak
by nám některé ledky buďto vůbec nesvítily, nebo by svítily stále. Nyní se
proto pokusíme vytvořit podobný program jako minule, který ale bude potřebovat
nadefinovat pouze jeden stav a druhý si vypočte sám.
K tomuto účelu se přesně hodí takzvaný bitový komplement. bitový komplement je
operace, při níž se z jedniček stanou nuly, a naopak.
*/
/*
Teď ještě vědět, jak takovou operaci zapsat.
Na tomto místě se hodí uvést tabulku operátorů jazyka C, mezi které patří
i náš bitový komplement.
*/
/*
Operátory v C:

  +		sčítání
  -		odčítání
  *		násobení
  /		dělení
  %		modulus 			(zbytek po celočíselném dělení)
  ++    inkrementace        (zvětšení o 1)
  --	dekrementace        (zmenšení o 1)
  =     přiřazení
  ==    porovnání         	( if(A==B)...
  ~     bitový komplement 	( 0b11110000 -> 0b00001111)
  !		not
  !=    není rovno
  <     menší než
  >		větší než
  <=    menší nebo rovno
  >=	větší nebo rovno
  &     bitové AND  		(také adresa proměnné)
  &&    logické AND
  |     bitové OR
  ||	logické OR
  ^     bitové exclusive OR
  ?     podmínkový operátor
  <<    bitový posun doleva  (A = B << 2  posun bitů o dvě místa doleva,
                                          zprava doplňuje nuly)
  >>    bitový posun doprava
  +=	A += B totéž co  A = A + B
  -=    A -= B totéž co  A = A - B
  /=    podobně...
  %=
  &=
  *=
  ^=
  |=
  >>=
  <<=
*/
/*
Nyní se tedy pokusíme napsat program:
*/

#define F_CPU 1000000UL  // 1 MHz (základní frekvence)

#include <avr/io.h>		//Knihovna vstupů a výstupů (PORT, DDR)
#include <util/delay.h>	//Knihovna čekacích funkcí

#define CEKANI 500		//kolik milisekund budou ledky svítit
#define STAV1 0b01010101//které ledky se budou střídat

int main (void)
{
DDRB = 0b11111111;
PORTB= STAV1;
for(;;)
    {
    PORTB=~PORTB;		//Zapíšeme na portB bitový komplement původní hodnoty
                        //Vyměníme ledky - ty které svítily zhasnou, a naopak
    _delay_ms (CEKANI);	//Čekání
    }
}

/*
Pozorní si jistě všimli, že se konstrukce programu zjednodušila.
Po nahrání programu do přípravku "ATmega8 - LED panel" budou střídavě blikat
LED diody tak, jak je to definováno v konstantě STAV1, rychlostí určenou
v konstantě CEKANI. Tyto konstanty lze libovolně měnit...
*/

//Pro radioklub OK1KVK naspal Vašek Král