Práce s I/O porty v jazyku C

Seznámení se základními příkazy jazyka C. Pomoci těchto příkazů ovládat periferie, na kterých je připojen modul LED diod a  tlačítek.

Řešené příklady
(funkce stejné jako v assembleru, ale programovaní pomocí C):
•    Po zmáčknutí tlačítka rozsviť všechny LED
•    Po zmačknutí tlačítka zablikej se všemi LED (nutná práce s časem – vytvoření přesné časové smyčky)
•    Vytvoř posuvné světlo – student má k dispozici 8 LED ( práce s časem a adresováním výstupního portu)

Zadání :

Příklad 1 :
Rozsviť LED dle zmáčknutých tlačítek.

Příklad 2
Pokud je zmáčknuto tlačítko 1,tak svítí všechny LED.

Příklad 3 :
Pokud je zmáčknuto tlačítko 1, tak všechny LED blikají v intervalu cca 0,1s.

Příklad 4.:
Vytvořte postupně rotující světlo (vždy svítí jen 1 cca 0,1s)


Nápověda :

Elektrické zapojení LED a tlačítek:

zapojeni_LED_a_tlac.png

Princip práce s LED a tlačítkem

LED dioda je zapojena přes předřadný odpor na + 5V. 
Pokud nastavíme na pin (PA7) logickou 1 - LED neprochází proud a nesvítí.
Pokud nastavíme na pin (PA7) logickou 0 - LED prochází proud směrem do procesoru a svítí.

Tlačítko je zapojeno na GND. Na pin (PA0) je nutné trvale nastavit vnitřní pullup odpor pomocí registru PORTx.
Pokud je tlačítko rozepnuto, tak díky vnitřnímu pullup odporu čteme na pinu (PA0) logickou 0.
Pokud je tlačítko sepnuto, tak se potenciál GND dostane na pin (PA0) a čteme logickou 1.


Použité registry:
DDRx – Data Direction Registr – směr toku dat. Určuje zda bude pin vstupní nebo výstupní.
PINx – načtení hodnoty na vstupu
PORTx- nastavení hodnot na výstupu

Použité příkazy :
if bit_is_clear (xxx,x) – dotaz na nulovost bitu
_delay_ms(x) – čekání x milisekund
_delay_us(x) – čekání x mikrosekund


Prázdný program v C :

#define F_CPU 16000000UL   
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
//*************************************************************************
//  UPRAVY
//-------------------------------------------------------------------------------------------
#define setb(port,pin)    port |= 1<<pin    //nastav bit
#define clrb(port,pin)    port &= ~(1<<pin) //nuluj bit
#define negb(port,pin)    port ^= 1<<pin    //neguj bit
//*************************************************************************

int main(void)
{

DDRB=0xFF; // vystupní - Ledky
DDRD=0x00; // vstupní  - Tlacitka

while (1)
      {
      // Vlastni program

      };
}

Řešení :


Příklad 1:
int main(void)
{

DDRB=0xFF; // vystupní - Ledky
DDRD=0x00; // vstupní  - Tlacitka

while (1)
      {
     
    PORTB=PIND  // Vlastni program

      };
}

Příklad 2:
int main(void)
{

DDRB=0xFF; // vystupní - Ledky
DDRD=0x00; // vstupní  - Tlacitka

while (1)
      {
     
    if bit_is_clear(PIND,0) PORTB=0;
    else PORTB=255;
     
    };
}


Příklad 3:

int main(void)
{
DDRB=0xFF; // vystupní - Ledky
DDRD=0x00; // vstupní  - Tlacitka

while (1)
      {
     
if bit_is_clear(PIND,0)
          {
      PORTB=0;
      _delay_ms(100);
      PORTB=255;
      _delay_ms(100);
          }
else PORTB=255;
     
    };
}


Příklad 4:
int main(void)
{

DDRB=0xFF; // vystupní - Ledky
DDRD=0x00; // vstupní  - Tlacitka
PORTB=255; 

while (1)
      { // zacatek nekonecne smycky
     
if bit_is_clear (PIND,0) cas=20; else cas=100;

    for (i=0;i<8;i++)
    {
    negb(PORTB,i);
    _delay_ms(cas);
    }

    for (i=7;i==0;i--)
    {
    negb(PORTB,i);
    _delay_ms(cas);
    }
 

     }; // konec smycky
} // konec programu