Skocz do zawartości

Problem z funckją warunkową if oraz przekaźnikiem


Pomocna odpowiedź

Napisano

Witam,

postanowiłem napisać kod do obsługi serwomechanizmu. Na wstępie dodam, że póki co zamiast serwa jest zwykły silniczek DC (w celach testu). W układzie chodzi o to, że w momencie kiedy na jedno wejście atmegi8 (pin B1) będzie sygnał, wtedy na wyjściu (pin B0) powinien zostać wystawiony sygnał na 4 sekundy. Sygnał na wejście atmegi jest z przekaźnika. Problem jest taki, że w momencie kiedy wyłączy się przekaźnik przed zgaśnięciem wyjścia B0 to wyjście pozostaje w stanie wysokim cały czas. W czym może być problem? W drganiu styków w przekaźniku?

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

int main(void)
{
   DDRB |= 1 << PINB0;		//wyjście pin B0
DDRB &= ~(1 << PINB1);	//wejście pin B1
PORTB |= 1 << PINB1;

   while (1) 
   {

   if (bit_is_clear(PINB, 1))
	{
		PORTB ^= 1 << PINB0;
		_delay_ms(4000);
		PORTB ^= 0 << PINB0;
	}
   else
	{
		PORTB ^= 0 << PINB0;
	}

   }
}

Nie odbieraj tego jak złośliwość, ale zamiast porządnie odpowiedzieć na zadane pytania w niedokończonym wątku o sprzęcie wrzucasz nowy temat i od razu program z problemami. Zdaje się, że miał być tak prosty, że nie trzeba będzie go w ogóle debugować a tu proszę, czyżby kłopoty?? Niezbyt elegancki start na Forum, przyznasz.

Dla wyjaśnienia: operacja XOR z zerem nie kasuje bitu wyniku. Albo zrób ponownie XOR z jedynką albo AND z odwróconą maską bitową. Poczytaj o operatorach logicznych.

Kolego lepiej odpuść sobie na odpisywanie na moje wątki. Forum uważam, za miejsce w którym szuka się pomocy, a nie mądruje jak nie wiadomo kto. Nie będę z Tobą prowadził dyskusji na takim poziomie publicznie dlatego jeśli chcesz porozmawiać o problemach jakiejkolwiek natury to zapraszam na PW. Panu podziękuję!

Czy ktoś inny potrafiłby mi pomóc z tym kodem?

Nie traktuj mnie jak swojego wroga. Forum - jak sama nazwa wskazuje jest przestrzenią publiczną i jeśli Ty sam nie masz ochoty czytać moich postów, to pomyśl o setkach innych którzy jakąś z tego nauczkę wyciągnąć jednak potrafią. Mamy tu Forbocie raczej ludzi myślących a jak mówi przysłowie "mądrej głowie dość dwie słowie". W związku z tym jestem przyzwyczajony do pewnego poziomu dyskusji a ona oznacza dobrą wolę z obu stron.

Popatrz: dostałeś dwie, praktycznie identyczne odpowiedzi i mam nadzieję, że nikt nie upadnie tak nisko by dać Ci rozwiązanie na talerzu. Cóż, tutaj tak działamy i wierz mi, jest to w Twoim interesie. Zamiast oczekiwać trzeciej, lepszej, innej lub takiej jaka Ci przypasuje, potraktuj te porady literalnie i weź do ręki podręcznik języka C. Tam znajdź rozdział o operatorach logicznych. Każdego z nich używasz już w swoim kodzie więc nie powinieneś mieć problemu z ich rozumieniem a jednak. Skoro padło już słowo XOR to zapewne czujesz, że gdzieś w tej okolicy jest babol. Nie wiesz co to za okolica? A pamiętasz w ogóle jak ten operator wygląda? Bo może nie kojarzysz symbolu strzałki ^ z tą operacją logiczną i tu jest kłopot? Jeśli jednak to wiesz, to wiesz pewnie także, że z polska nazywana różnica symetryczna nie służy do wstawiania wartości do bitów. Zrobienie XORa z jedynką tak jak zrobiłeś to tutaj:

PORTB ^= 1 << PINB0;

wcale nie wstawia bezwarunkowo jedynki na linię portu

a operacja:

PORTB ^= 0 << PINB0;

wcale nie wstawia zera na te linię. Co więcej, to ostanie w ogóle niczego nie zmienia bo... przepraszam, ale dalej musisz już sam. Powodzenia.

I nie podnoś za wysoko nosa, bo tylko zwątpienie (również we własne siły i wiedzę) jest motorem postępu.

  • Lubię! 2

Ok, rozumiem pouczenie.

Czy jeśli w tym układzie na wejście mikrokontrolera wchodzi sygnał z przekaźnika to powinno się stosować jakieś zabezpieczenia programowe przed drgającymi stykami?

Dobrą praktyką jest, że tak. Jeżeli zliczasz jakieś zdarzenia albo uruchamiasz procesy które nie powinny być przerywane to sprawa jest oczywista - robisz zabezpieczenia bo każdy zestyk jakoś tam się odbija i trwa to czasem wiele dziesiątek ms. Dobrym przykładem jest klawiatura - nikt nie chce, by po jednym naciśnięciu wyskakiwały dwie lub więcej literek. Kolejny przykład to programowy przycisk włącz-wyłącz. Piwersze naciśnięcie musi zawsze włączyć a kolejne wyłączyć. Jeśli liczba zboczy zauważonych przez program będzie losowa, to przycisk też będzie działał losowo i to jest nie do przyjęcia.

Jeżeli jednak jesteś całkowicie świadom tego co robisz i np. sygnał z zestyku ma wyłącznie zapalać diodkę LED lub uruchamiać jakiś silnik czy przekaźnik to tak naprawdę jest bez znaczenia, czy pojawi się tam jakieś odbicie. Bez procesora, z samym zestykiem i tak LED/silnik by dostał taki impuls i wcale by im to nie zaszkodziło.

Tak więc - to zależy.

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