Skocz do zawartości

C++, funkcja if


Pomocna odpowiedź

Napisano

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:)

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

Spróbuj tak:

 
PORTD |= 0x21;
PORTB |= 0X01;
_delay_ms(50);
PORTD &= ~0x21;
PORTB &= ~0X01;
_delay_ms(50); 

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

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

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.

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.

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

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