Skocz do zawartości

Problem z funckją warunkową if oraz przekaźnikiem


thyrgat

Pomocna odpowiedź

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;
	}

   }
}
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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?

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

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

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.

Link do komentarza
Share on other sites

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.