Skocz do zawartości

[C][Atmega8] bit_is_set nie działa poprawnie


Pomocna odpowiedź

Napisano

Witam

Celem mojego programu było sprawienie, by dioda zaświeciła się po wciśnięciu przycisku. Wszystko działa pięknie z wykorzystaniem bit_is_clear, jednak gdy chcę wykorzystać bit_is_set dioda cały czas pali się i jakoś tak dziwnie pomruguje (przygasa). Gdy wciśnie się przycisk dioda gaśnie... (miało być na odwrót). Brakuje jakiejś biblioteki? Błąd logiczny? Poniżej zamieszczam dwa warianty programu, oba nie działają poprawnie. Może uchwycicie jakiś błąd. Program pierwszy wykorzystuje diodę podpiętą do płytki uruchomieniowej ZL2AVR. Drugi wykorzystuje diodą podpiętą bezpośrednio do uC.

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000

int main()
{
DDRC = 0xFF;  // dioda wyjscie
DDRB = 0;     // przycisk wejscie

PORTC |= _BV(0); // ustawienie dioda (OFF)
PORTB &= ~(_BV(0)); // wyzerowanie przycisku

for(;;)
	{
		if(bit_is_set(PINB, 0)) 
			{
				PORTC &= ~(_BV(0)); // LED ON
				_delay_ms(125);
				PORTC |= _BV(0);    // LED OFF
			}

	}
return 0;
}
#include <avr/io.h>

int main()
{
DDRC = 0xFF;  // dioda wyjscie
DDRB = 0;     // przycisk wejscie

PORTC &= ~(_BV(0)); // ustawienie dioda (OFF)
PORTC &= ~(_BV(1));

PORTB &= ~(_BV(0)); // wyzerowanie przycisku

for(;;)
	{
		if(bit_is_set(PINB, 0)) 
			{
				PORTC |= _BV(0);    // LED ON
			}
		else
			{
				PORTC &= ~(_BV(0));
			}
	}
return 0;
}

Błąd uC raczej wykluczam, programy zachowują się jednakowo na dwóch Atmegach8. Korzystam z AVR Studio i eXtreme Burner.

Nie dziwota, że "dziwnie pomruguje", bo jak trzymasz naciśnięty przycisk, to wykonujesz w pętli (specjalnie nie zacząłem od początku):

1) poczekaj chwilę

2) zgaś diodę

3) zapal diodę

więc po pierwsze logika kodu błędna, po drugie brak przerwy między gaszeniem a zapalaniem powoduje, że to to "dziwne miganie"

No właśnie chodzi o to że to "dziwne miganie" odbywa się gdy przycisk nie jest wciśnięty, a gdy się go wciśnie to dioda gaśnie... Więc wychodzi na to, że program się wykonuje gdy przycisk nie jest wciśnięty, tak jakby bit był cały czas ustawiony, choć w deklaracji na początku programu jest on wyraźnie wyzerowany i ma być ustawiony gdy przycisk zostanie wciśnięty.

A jaki jest schemat układu, czy tam nie ma pomyłki logicznej ? Jeśli pin dajesz na wejście to czy jest sprzętowo podciągnięty ? A przycisk powoduje zwarcie do masy?

Bardziej stabilniej będzie pracował jako wyjście, podciągnięty programowo i sprzętowo do jedynki.

  • Lubię! 1

Dzięki @riddyk za wskazówki, faktycznie był błąd "sprzętowy"; kilka rezystorów i odpowiednie podłączenie załatwiły sprawę.

Pozdrawiam.

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