Skocz do zawartości

Switch - Podłączenie i sprawdzanie jego stanu


Pomocna odpowiedź

Napisano

Witam Ponownie

W ramach nauki stworzyłem( z ogromną pomocą ze strony forumowiczów - dzięki wielkie :] ) swój pierwszy programowalny układzik który zmienia kolory w diodzie RGB. Jako że nie zamierzam skończyć na samej diodzie RGB, postanowiłem dodać przełącznik( ON - OFF ) który miałbym podłączyć do portu B3 i w zależności od tego czy jest podłączony czy nie jest, wywoływać dane akcje. Szukałem po schematach na forum i znalazłem tylko przyciski podłączone do resetu dlatego pytam: Jak podłączyć przełącznik( PB3->Przełącznik->Masa? ) i jak sprawdzić jego stan w programie w języku C?

W elektronice stosuje się najczęściej chwilowe przyciski podłączone do portu a z drugiej strony do masy. A do sprawdzenia wykorzystuje się funkcje IF

pawcio0928 no nie do końca. Odkłócanie styków także trzeba jakoś zrealizować. Sprzętowo czy programowo to już kwestia gustu. Jeśli ktoś pisze w C to twój komentarz jest jak najbardziej poprawny, jeśli w Bascomie to już pośrednio (Debounce to przecież IF z odpowiednim odczekaniem, które również można ustawić).

Chodziło mi o c ponieważ w ostatnich czasach stał się on bardziej popularny od bascoma.

No i wspominałem że piszę w C. Wiem do czego służy funkcja IF ;D Chodzi bardziej o to, jak sprawdzić. Napisałem taki kod, jednak nie działa:

#include <avr/io.h>
#include <util/delay.h>
#define B(x) (1<<x)

int CZAS = 1000;

void Zapal( int p1, int p2, int p3 )
{
if( PORTB == B(3) ) CZAS = 100;
else CZAS = 1000;

if( p1 == 1 ) PORTB |= B(0);
else PORTB &= ~B(0);
if( p2 == 1 ) PORTB |= B(1);
else PORTB &= ~B(1);
if( p3 == 1 ) PORTB |= B(2);
else PORTB &= ~B(2);

_delay_ms( CZAS );
}

int main(void)
{
DDRB = 0b111;
while(1)
{
	Zapal(1,0,0);
	Zapal(1,1,0);
	Zapal(1,0,1);
	Zapal(0,1,0);
	Zapal(0,1,1);
	Zapal(0,0,1);
}
}

[ Dodano: 21-02-2012, 23:33 ]

Przełącznik mam pod portem B3

Witaj! Tym kawałkiem kodu sprawdzisz czy na pinie b3 jest stan niski

void button_pres(){
if(bit_is_clear(PINC,PC0)){
	_delay_ms(25);                 // eliminuje problem drgających styków
	if(bit_is_clear(PINC,PC0)){
	// Zadanie do realizacji
	}

Port czytasz przez rejestr PINx, np:

if (PINB & B(3))

Część po "if" wykona się, gdy ten jeden bit PINB.3 będzie w stanie 1, bo wtedy całe wyrażenie w nawiasie będzie różne od zera. Jeśli masz wyłącznik zwierający do masy, to jeszcze wypadałoby dorobić coś, co podciągnie linię portu do stanu wysokiego gdy nic nie wciśniesz. Możesz dać zewnętrzny rezystor (np. 10k do Vcc) ale możesz uruchomić "podciąg" wewnątrz procesora i oprócz ustawiania kierunku:

DDRB = 0b111;

dopisać jeszcze:

PORTB = 0b1000;

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...