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:
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