Ir ao conteúdo
  • Cadastre-se
Xsjado

PIC Problema em ciclo pic12f629

Posts recomendados

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

Junte-se à conversa

Você pode postar agora e cadastrar-se depois. Se você tem uma conta, faça o login para postar.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restore formatting

  Só é possível ter até 75 emoticons.

×   O link foi automaticamente convertido para mostrar o conteúdo.   Clique aqui para mostrá-lo como link comum

×   Seu texto anterior foi restaurado.   Limpar o editor

×   You cannot paste images directly. Upload or insert images from URL.






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

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!