Skocz do zawartości

Procesor nie działa po odłączeniu od programatora


Razonek

Pomocna odpowiedź

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

}
}
}
Link do komentarza
Share on other sites

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

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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!

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.