niedziela, 31 stycznia 2016

AVR cz4 - obsługa przełącznika

Kontynuując naukę AVR'ów zająłem się obsługą przełącznika czyli pierwszą operacją wejścia. Na płytce stykowej zbudowałem układ wg. schematu.

Zauważmy, że przycisk S1 podłączony jest to masy. Oznacza to, że reakcja diody musi mieć miejsce, gdy stan na pinie PB0 będzie 0. Kondensator C3 ma za zadanie tłumnie drgań styków przełącznika. Układ działa bardzo prosto - naciśnięcie przycisku zapala bądź gasi diodę LED. Wsad do procesora wygląda następująco:




#include <avr/io.h>
#include <util/delay.h>
#define LED PB1
#define CLICK PB0

int main(void)
{
int flag=0;
//Ustawiamy pin PB1 jako wyjście
DDRB|=(1<<LED);
//gasimy diodę
PORTB&=~(1<<LED);
//Ustawiamy pin PB0 jako wejście
DDRB|=(1<<CLICK);
PORTB|=(1<<CLICK); //podciagamy wewnetrzne rezystory

while(1) 
{
if(!(PINB & (1<<CLICK))) 
{
if(!(PINB & (1<<CLICK))){
if (!flag) {PORTB|=(1<<LED); flag=1;}
else {PORTB^=(1<<LED);flag=0;}}
}
_delay_ms(100);
}
}

Drugi układ, który przetestowałem był prawie identyczny z tym, że przełącznik był podłączony do Vcc zamiast do masy. W sumie działa to tak samo ale różni się nieco wsad do procesora.


#include <avr/io.h>
#include <util/delay.h>
#define LED PB1
#define CLICK PB0

int main(void)
{
int flag=0;
//Ustawiamy pin PB1 jako wyjście
DDRB|=(1<<LED);
//gasimy diodę
PORTB&=~(1<<LED);
//Ustawiamy pin PB0 jako wejście
DDRB|=(1<<CLICK);


while(1) 
{
if((PINB & (1<<CLICK))) 
{
if((PINB & (1<<CLICK))){
if (!flag) {PORTB|=(1<<LED); flag=1;}
else {PORTB^=(1<<LED);flag=0;}}
}
_delay_ms(250);
}
}

Działanie układu na filmie:


Trzeci układ umożliwiał naprzemienne zapalanie i gaszenie diod LED.


#include <avr/io.h>
#include <util/delay.h>
#define LED1 PB1
#define LED2 PB2
#define CLICK PB0

int main(void)
{
//Ustawiamy pin PB1 jako wyjście
DDRB|=(1<<LED1)|(1<<LED2);
//gasimy diodę
PORTB|=(1<<LED1);
PORTB&=~(1<<LED2);
//Ustawiamy pin PB0 jako wejście
DDRB|=(1<<CLICK);

while(1) //infinite loop
{
if((PINB & (1<<CLICK))) //If switch is pressed
{
if((PINB & (1<<CLICK))){
PORTB^=(1<<LED1); PORTB^=(1<<LED2);}
_delay_ms(500);
}
}} 
 




Brak komentarzy:

Prześlij komentarz