Skocz do zawartości

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


yogu$

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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"

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.