Razonek Napisano Czerwiec 16, 2011 Udostępnij Napisano Czerwiec 16, 2011 Witam! Mam bardzo nietypowy problem, a mianowicie napisałem program który włącza/wyłącza diody po naciśnięciu przycisku. Wgrywając program na procesor wszystko jest ok. Test z podłączonym programatorem - wszystko działa. Odłączam programator i czasem coś zadziała ale po chwili tak jakby procesor się zawieszał. Procesor (ATmega8) jest sprawny, wgrałem na niego przed chwilą inny program i działa, sprawdziłem też drugi procesor i ten sam problem. Reset podciągnięty do Vcc przez rezystor 18k. Zasilanie podpięte odpowiednio pod Vcc i GND oraz pod AVcc i AGND ( i kondensatory 100uF ). Zamieszczam kod: #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> int main() { DDRD = 0xFF; DDRC = 0x00; PORTC = 0xFF; DDRB = 0x06; PORTB |= (1<<5); unsigned char x = 0; while(1) { switch(x) { case 1: PORTD ^= _BV(PD0) ^ _BV(PD1); x = 0; break; case 2: PORTD ^= (1<<2); x = 0; break; case 3: PORTD ^= (1<<3); x = 0; break; case 4: PORTD ^= (1<<4); x = 0; break; case 5: PORTD ^= (1<<5); x = 0; break; default: if(!(PINC & 0x01)) { _delay_ms(30); while(!(PINC & 0x01)) {} _delay_ms(30); x = 1; } if(!(PINC & 0x02)) { _delay_ms(30); while(!(PINC & 0x01)) {} _delay_ms(30); x = 2; } if(!(PINC & 0x04)) { _delay_ms(30); while(!(PINC & 0x04)) {} _delay_ms(30); x = 3; } if(!(PINC & 0x08)) { _delay_ms(30); while(!(PINC & 0x08)) {} _delay_ms(30); x = 4; } if(!(PINB & 0x10)) { _delay_ms(30); while(!(PINB & 0x10)) {} _delay_ms(30); x = 5; } } } } Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Czerwiec 16, 2011 Udostępnij Czerwiec 16, 2011 Na moje oko to jeżeli działa z programatorem a bez nie, to coś pewnie jest z pinami programatora. Jeden z przycisków jest na PORTB 5 a to jest sygnał SCK. Zawiesić może sie tylko w pętlach while {}. Więc pewnie bez programatora nie wychodzi z pętli while(!(PINB & 0x10)) {} . Spróbuj dać ten przycisk z PORTB 5 na inny pin. Możesz jeszcze zmienić te unsigned char na np int bo możne kompilatorowi coś nie pasuje. Nie wiem co jest żle w programie ale spróbuj dać PORTB = 0xFF; ,Może to coś pomyliłeś z podciąganiem (pin nr 5 jest 6 w kolejności a ty masz (1<<5)). 1 Cytuj Link do komentarza Share on other sites More sharing options...
Razonek Czerwiec 16, 2011 Autor tematu Udostępnij Czerwiec 16, 2011 Ok, działa. Pomogło ustawienie podciągania dla całego portu B. Podciąganie jest dobrze zrobione. (1<<5) odpowiada piątemu pinowi portu. Dziękuje za pomoc! Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!