Ir ao conteúdo
  • Cadastre-se
Xsjado

PIC Problema em ciclo pic12f629

Recommended Posts

Olá Malta,

 

Já algum tempo (anos )que nao programo e estou meio que enferrujado, estou a tentar fazer um programa simples um programa aonde tenho 3 botões um para incrementar tempo outro decrementa tempo e outro arranca o temporizador, apos arrancar o temporizador este faz um tempo de espera depois liga a saida GPIO0 por 5 segundos espera o mesmo tempo e liga a saida 5 segundos infinitamente ate ficar sem energia.

 

O problema estano tempo de espera eu uso uma variavel para saber o numero incrementado depois faz um calculo para passar esse numero para minutos e faz um ciclo esse ciclo nao tem como por a funcionar fica o codigo

 

Citação

#include <xc.h>
#include <stdio.h>
#include <stdint.h>


#define _XTAL_FREQ 4000000 //oscilador interno 4 MHZ

//defenir entradas e saidas

#define Start GPIO5
#define Incrementa GPIO4
#define Decrementa GPIO3
#define Saida GPIO0


#pragma config WDTE=OFF , BOREN=OFF , PWRTE=ON , MCLRE=OFF , FOSC=INTRCIO //


//inicialização de variaveis

 char tempo;
 char i;
char result;


void ini (void){           //inicializaçãode variaveis
//OSCCAL = 0b11111100;
 TRISIO = 0b00111000;
 Saida=0;
 i=0;
}


void main(void) {
    ini();
    while (Start!=1){
        if (Incrementa==1)
            tempo++;
        if (Decrementa==1)
            tempo--;
    }
      result=tempo*12;
    while(1){
    
      for (i=0;i<result;i++)
        {
              __delay_ms(5000);
         }
        Saida = 1;
        __delay_ms(5000);
        Saida = 0;
    }
    
}

 

 

 

se eu puser o ciclo for (i=o;i<result;i++) se trocar o result pelo numero 12 for(i=0;i<12;i++) tudo gunciona direito usando o result nada funciona.

 

o que estou a fazer de mal será o tipo de variavel? mas ja usei char unsigned char .

 

Cumprimentos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dando uma repassada...

 

Amigo vejo 2 problemas...

while (Start!=1)

{

if (Incrementa==1) tempo++; //se não esperar soltar a tecla, tempo++ vai ter valor aleatório pois a contagem é muito rápida. Tenta algo como...

while(Incrementa==1);//que deve esperar você soltar o botão (!)

if (Decrementa==1) tempo--; //o mesmo...

}

Mesmo assim você deve colocar um filtro na entrada.

 

o outro

result=tempo*12; //se tempo for maior que 21, result seria catastroficamente maior que 255 que é o maior que cabe num char. Altere pra unsigned int ou reveja os princípios do teu projeto.

 

É isso... antes tarde do que nunca...

 

adicionado 0 minutos depois

@Xsjado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×