Ir ao conteúdo

Programa executando somente a metade


CIS

Posts recomendados

Postado

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

Postado

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.

Postado

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

Postado
  CIS disse:
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.

  CIS disse:

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++){

}

Postado

entendi, acho que vou ler uns tutorais sobre a linguagem... obrigado pelo esclarecimento... tambem tava lendo aqui sobre o "bug", pra pegar uma noção ... valeu... logo mais eu posto o codigo, se puder me dar um ajuda...

Postado

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

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!