Ir ao conteúdo
  • Cadastre-se

Programa executando somente a metade


CIS

Posts recomendados

Ola a todos! Pessoal, será que alguem ja teve um PIC ( o meu é o 16F877A) execunatndo apenas a metade do programa ? Fiz um codigo no MiCkroC PRO 5.61, com varios laços de repetição for dentro de um while. O codigo compila normal, e grava tambem sem nenhum erro no PIC, mas não hora de executar ele faz apenas a metade, e as vezes nem isso, mas sempre voltando ao inicio, sem travar.... ja tentei mudar a ordem das repetições mas não resolveu nada... alguem ja passou por isso...

Link para o comentário
Compartilhar em outros sites

Poste o programa para analisarmos.

Você está com o WDT desativado? O programa ocupa quantas instruções?

Quando se programa em assembly esse problema pode ser de selação de página de memória (algo bem chatinho na arquitetura do PIC16). Como você está usando um compilador C era para este já se encarregar de mudar as páginas de memória, mas o compilador pode ter um bug.

Link para o comentário
Compartilhar em outros sites

Eu não entendo tanto ainda e não sei o que é bug... não tenho o codigo aqui porque estou no trabalho, mas mais a noite eu coloco o ele aqui... so uma duvida que talvez você possa me esclarecer...

Se eu declaro uma variavel antes da função main(), e faço ela = 0, ela é uma variavel universal, correto ?

agora eu uso essa variavel num laço for, ela sera incrementada e tal... quando eu fecho esse laço for, a variavel sera zerada ?? e eu posso inicia-la em outro laço c om valor = 0 ??

Link para o comentário
Compartilhar em outros sites

Se eu declaro uma variavel antes da função main(), e faço ela = 0, ela é uma variavel universal, correto ?

Ela só vai funcionar para a função main(). Se quiser declarar uma variável universal (que possa ser acessada por qualquer função ou sub-rotina) você declara no começo do código fora de qualquer função.

agora eu uso essa variavel num laço for, ela sera incrementada e tal... quando eu fecho esse laço for, a variavel sera zerada ?? e eu posso inicia-la em outro laço c om valor = 0 ??

Isso vai depender de como você configurou o seu laço FOR. Se você configurou para quando chegar a 0 sair do laço, ai sim a variável estará zerada.

Lembrando que você pode definir o valor inicial da variável no começo do laço FOR:

for (count=0;count<100;count++){

}

Link para o comentário
Compartilhar em outros sites

eis aqui o codigo... os comentários estão fora de questão.

unsigned short x = 0, y = 0;
void main() {
ADCON1 = 0x06;
CMCON = 0x07;
trisb = 0b00000000;
portb = 0b00000000;
portd = 0b00000000;
trisd = 0b00000000;
trisc = 0b00000000;
portc = 0b00000000;
trise.pspmode = 0;


while(1) { //enquanto houver alimentação.
for(y = 0; y <= 10; y++){ // repete 5 vezes o laço abaixo:
for(x = 0; x <= 6; x++){
portb = 1<<x;
delay_ms(50);
portb = 0b00000000;
}
for(x = 0; x <= 6; x++){
portd = 1<<x;
delay_ms(50);
portd = 0b00000000;
}
for(x = 0; x <= 6; x++){
portc = 1<<x;
Delay_ms(50);
portc = 0b00000000;
}
}
delay_ms(1000);


for(y = 0; y <= 4; y++){ // repete 5 vezes o laço abaixo:
for(x = 0; x <= 6; x++){
portb = 1<<x;
delay_ms(100);
portb = 0b00000000;
}
for(x = 0; x <= 6; x++){
portd = 1<<x;
delay_ms(100);
portd = 0b00000000;
}
for(x = 0; x <= 6; x++){
portc = 1<<x;
Delay_ms(100);
portc = 0b00000000;
}
}

for(y = 0; y <= 4; y++){ // repete 5 vezes o laço abaixo:
for(x = 0; x <= 6; x++){
portb = 1<<x;
portd = 1<<x;
portc = 1<<x;
delay_ms(500);
portb = 0b00000000;
portd = 0b00000000;
portc = 0b00000000;
}
}

for(y = 0; y <= 9; y++){ // repete 5 vezes o laço abaixo:
for(x = 0; x <= 6; x++){
portb = 1<<x;
portd = 1<<x;
portc = 1<<x;
delay_ms(50);
portb = 0b00000000;
portd = 0b00000000;
portc = 0b00000000;
}
}

for(y = 0; y <= 9; y++){ // repete 5 vezes o laço abaixo:
for(x = 0; x <= 6; x++){
portb = 0b00101010;
portd = 0b00010101;
portc = 0b00101010;
delay_ms(100);
portb = 0b00010101;
portd = 0b00101010;
portc = 0b00010101;
delay_ms(100);
}
}

for(y = 0; y <= 4; y++){ // repete 5 vezes o laço abaixo:
for(x = 0; x <=2; x++) {
portb = 0b00111111;
portd = 0b00111111;
portc = 0b00111111;
delay_ms(500);
portb = 0b00000000;
portd = 0b00000000;
portc = 0b00000000;
delay_ms(500);
}
}
}
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...