Skocz do zawartości

Problem z wyjściem z pętli nieskończonej


Pomocna odpowiedź

O kurcze, gdy dałem sei na sam początek w sumie to działa xD

void snake_ir_keys(uint8_t adr,uint8_t cmd,uint8_t key_time);

volatile uint16_t timer1;
int main (){
	PORTD |= (1<<PD7);
	// konfiguracja timera//
	TCCR0 |= (1 << WGM01); // tryb ctc
	TCCR0 |= (1<< CS00)|(1<<CS02); // prescaler 1024
	OCR0 = 78;
	TIMSK |= (1 << OCIE0);

	sei();
	register_ir_event_callback(snake_ir_keys);
	check_and_load_defaults();
	USART_Init(__UBRR);
	ir_init();
	lcd_init();
	register_start_screen_callback(display_init);
	register_end_screen_callback(ekran_koncowy);
	snake_init(1);





	while(1){

Ale nie tak do końca działa. Czasem po pojedyńczym kliknięciu zaczyna się gra, czasem musze kliknąć kilka razy. 2-5x To też dziwne trochę. 

4 minuty temu, Krawi92 napisał:

Ale nie tak do końca działa. Czasem po pojedyńczym kliknięciu zaczyna się gra, czasem musze kliknąć kilka razy. 2-5x

Rozumiem że masz program z pierwszego twojego postu? Pytam gdyż jest on poprawny. Co do trudności w dekodowaniu ramek z pilota, wiem że ta biblioteka działa prawidłowo, jesteś pewien że częstotliwości uP i te zdefiniowane w programie są poprawne? A czy w innym przypadku, kodzie dekodowanie jest poprawne? 

Tak, właśnie podczas gry sterowanie działa ok, tylko teraz, przy początkowym ekranie jakoś dziwnie to zaskakuje. Raz za pierwszym razem, a czasem za 5.

void display_init( uint8_t usr_cnt ) {


	lcd_locate(0,0);
	lcd_str("****************");
	lcd_locate(1,0);
	lcd_str("*     SNAKE    *");
	lcd_locate(2,0);
	lcd_str("*  PRESS  KEY  *");
	lcd_locate(3,0);
	lcd_str("****************");
	while(1){
		IR_EVENT();
		if (1 == command )break;
		}
	lcd_cls();
	}

 

(edytowany)

Problem jest chyba inny, wpierw rejestrujesz obsługę callbacka tak jakby program był już w grze. Wiec w pierwszej kolejności ta funkcja zwrotna będzie skonsumowana. Ja bym to zrobił inaczej: wpierw callback ekranu powitalnego, a kiedy z tej funkcji wychodzisz, rejestrujesz tego "właściwego" na tym polega siła callbacków. 

Edytowano przez _LM_

Ewentualnie można zastosować brzydsze rozwiązanie, czyli zostawić jak jest ale ale węża zainicjalizować przed zarejestrowaniem pozostałych kolbeków

Zrobiłem tak, i jest to samo.


	// konfiguracja timera//
	TCCR0 |= (1 << WGM01); // tryb ctc
	TCCR0 |= (1<< CS00)|(1<<CS02); // prescaler 1024
	OCR0 = 78;
	TIMSK |= (1 << OCIE0);
	ir_init();
	lcd_init();
	USART_Init(__UBRR);
	sei();
	check_and_load_defaults();
	register_start_screen_callback(display_init);
	snake_init(1);
	register_end_screen_callback(ekran_koncowy);
	register_ir_event_callback(snake_ir_keys);

Nie mogę tak snake_init na samej górze, bo funkcje inicjalizujące snake'a wywołują callbacka na ekran początkowy

(edytowany)

Pokaż ciało funkcji display init

EDIT aaa sorki to przecież to ta pierwsza. Z tel pisze to nie zauważyłem. 

Edytowano przez _LM_

Troszkę nie na temat ale nie myślałeś żeby wrzucić ten kod (cały) na jakiegoś githuba? Bo takie dawkowanie informacji po kilka linii jest nieco bez sensu. A przy okazji git to genialne narzędzie.

Krawi... Pomyśl tak: w display init masz EVENTA który prowadzi do.... Display init. Najpewniej mikrokontroler regularnie się resetuje

(edytowany)

Nie rozumiem, jak IR_EVENT prowadzi do display_init. Ir event wywołuje zarejestrowana przeze mnie funkcje do obsługi klawiszy. 

Z tym udostępnieniem to tak średnio bo nie bardzo mogę wrzucić bibliotekę do obsługi IR. Resztę mogę. 

Edytowano przez Krawi92

Bo za dużo na jeden raz. Poza tym brak bebugera z pewnością mocno utrudnia znalezienie problemu, za to wymusza pełne zrozumienie działania programu. Ciekawi mnie ten init węża. 

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