Skocz do zawartości

C++, funkcja if


miccaldo

Pomocna odpowiedź

Witam, mam pewien problem otóż chciałbym aby po naciśnięciu przycisku program wykonał pewną instrukcję 3 razy w pętli, tylko nie wiem w czym popełniam błąd:

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

int main(void)
{   
  DDRB = 0x01;
  DDRA = 0xFF;
  DDRD = 0xBF;

  PORTB = 0x12;
  PORTD = 0x40;
  PORTA = 0x00;

  int i;

for(;;)
{
if(!(PIND & 0x40))
{
for(i = 0; i < 3; i++)
	{

	PORTD = 0x21;
	PORTB = 0X01;
	_delay_ms(50);
	PORTD ^= 0x21;
	PORTB ^= 0X01;
	_delay_ms(50);

}	
}
}
}

Program po naciśnięciu przycisku wykonuje instrukcje nieskończenie, myślę że jest to spowodowane na początku pętlą for(;😉, próbowałem z break; ale nie działa, funkcja if-else nie działa bez pętli, także nie wiem jak to poprawnie napisać. Prosił bym bardzo o pomoc:)

Link do komentarza
Share on other sites

Wydaje mi się, że pisząc

PORTD = 0x40;

Ustalasz ten pin jako wyjście. A potrzebujesz odczytywać stan. Domyślnie piny są wejściami. Więc chyba wystarczy to wywalić.

Dobra, doczytałem. Nie mam racji : D

Link do komentarza
Share on other sites

zamiast for(;😉 możesz dać while(1)
Przecież to dokładnie to samo 🤯
Program po naciśnięciu przycisku wykonuje instrukcje nieskończenie, myślę że jest to spowodowane na początku pętlą for(;😉, próbowałem z break; ale nie działa, funkcja if-else nie działa bez pętli, także nie wiem jak to poprawnie napisać. Prosił bym bardzo o pomoc:)
Pętla główna jest po to, by uC cały czas pracował, a nie skończył swoją pracę 30us po włączeniu 😉 (chyba, że takie jest specyficzne założenie, ale to przypadki skrajne).
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

Tylko ja chcę aby program zaczynał się od if-else, jednak kiedy zlikwiduję pętlę główną to przy naciśnięciu przycisku nic się nie dzieje:) więc chyba pętla for(;😉 jest obowiązkowa, ale jak dla mnie to powinno być po prostu tak:

if(!(PIND & 0x40)) 
   { 
   for(i = 0; i < 3; i++) 
       { 

       PORTD = 0x21; 
       PORTB = 0X01; 
       _delay_ms(50); 
       PORTD ^= 0x21; 
       PORTB ^= 0X01; 
       _delay_ms(50); 

}    
} 
} 

i powinno działać😋 ale nie działa, trzeba chyba coś zrobić z tą pętlą for(;😉. Uczę się z kursu z forbot, ale jakoś nie mogę dojść do tego.

Link do komentarza
Share on other sites

grabo napisał/a:

zamiast for(;😉 możesz dać while(1)

Przecież to dokładnie to samo 🤯

Wiem, dlatego napisałem jak kolega inaczej może sobie to napisać 🙂

miccaldo, próbowałeś zmienić fragment kodu według tego co wkleiłem? Chyba nie, bo nadal się upierasz przy swoim, który działa z takimi objawami jak piszesz... Według mnie problem jest w tej linicje

PORTD = 0x21;

Zmieniasz wartości wszystkich bitów danego portu, w tym zerujesz bit odpowiadający za pull-up na pinie gdzie masz podpięty przycisk!

Natomiast napisane w ten sposób

PORTD |= 0x21;

ustawia tylko bity na pozycjach 0 i 1 nie zmieniając pozostałych.

Link do komentarza
Share on other sites

Tylko ja chcę aby program zaczynał się od if-else, jednak kiedy zlikwiduję pętlę główną to przy naciśnięciu przycisku nic się nie dzieje:) więc chyba pętla for(;😉 jest obowiązkowa (...)
Ten Twój kod bez pętli for działa (w sensie, wykonuje się), ale trwa to kilka cykli procesora, więc zanim mrugniesz okiem, to ten if () zostanie wykonany i z powodu braku pętli program zostanie zakończony. Więc zanim pomyślisz by nacisnąć swój przycisk, to program już dawno skończył testować warunek w if () i nigdy go nie powtórzy. Możesz więc sobie naciskać przycisk ile wlezie, uC zakończył działanie miliony taktów temu...
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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