Como trabalhar com timer dos pic na linguagem c ccs

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 15 Jun 2014 12:06

Cfreund,

Código: Selecionar todos
unsigned char funcao1[] = {
  //  INICIO,          // Para acomodar a roupa?                      ------------------- >>>>>Não se faz necessario, pois o motor sem agua internamente pode travar com peso da         roupa
       
 //   DESCARTAR_AGUA,          // Trocar água no caso de um RESET?  -------->>>>>> O primeiro processo deve ser encher tanquinho
    COMPLETAR_AGUA,  //   ------>>>> Quando acionar o botão 1 ou 2 deve-se encher o tanquinho para depois liberar o processo lavar, não se esta fazendo isso!
 


O problema reside agora, em quando eu acionar o botão 1 ou 2 o mesmo so deve ir para o processo de lavar se confirmar que o tanquinho esta cheio, com o programa na maneira que esta ja vai direto para lavar sem confirmar se esta cheio ou não, não consegui identificar se tenho colocar um novo define aguarda_encher para depois liberar lavar, ou se tenho que mudar algum outro lugar, que não sei ainda.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor cfreund » 15 Jun 2014 18:02

O problema esta na função ENCHER.

Código: Selecionar todos
#define FUNC_ENCHER()           { output_high(PIN_ENCHER);              \
                                  while (input(PIN_NIVEL_AGUA) == 0);   \
                                  output_low(PIN_ENCHER);               \
                                }


Com está, ele fica travado enquanto a saída do sensor estiver em 0 volts. Provavelmente a lógica está invertida.
Experimente: while (input(PIN_NIVEL_AGUA));
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 16 Jun 2014 22:37

Existe agora 1 duvida apos o teste:

OBS:

Código: Selecionar todos
#define FUNC_ESVAZIAR()     
                                  { output_low(PIN_ESVAZIAR);             \ ---------->>>> Tive que incluir para quando for descartar a agua dar um tempinho para  motor parar.
                                  delay_ms(1000);        \     
                                   output_high(PIN_ESVAZIAR);            \
                                  delay_ms(60000);        \
                                  delay_ms(60000);        \                 
                                  delay_ms(60000);        \
                                  output_low(PIN_ESVAZIAR);             \
                                  delay_ms(1000);        \                               //
                                }



A duvida era porque a função FIM não esta funcionado, pelo que vi provalvemente desve estar faltando um case FIM, para dar certo.

Código: Selecionar todos
#define FUNC_ENCHER()           { output_high(PIN_ENCHER);              \
                                  while ( ! input(PIN_NIVEL_AGUA) == 0);   \  ---------------------->>> Tive que incluir um " ! " para funcionar.
                                  output_low(PIN_ENCHER);               \
                                }




A função FIM não funcionou foi por estar faltando esta case FIM ?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 16 Jun 2014 22:41

Desculpe,


Sobre a função FIM:

Código: Selecionar todos
 default: // FIM
            FUNC_ALARME();
            delay_ms(5000);
            FUNC_ALARME();
            delay_ms(5000);
            FUNC_ALARME();
            return;



Esta no default, sera que e so colocar com case que ser resolve o problema?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor cfreund » 17 Jun 2014 04:03

while ( ! input(PIN_NIVEL_AGUA) == 0); é o mesmo que while ( input(PIN_NIVEL_AGUA) );

Deixe o FIM em default mesmo. Isso funciona como uma segurança.

Por que você diz que não está executando? Se não estiver soando o alarme, veja a rotina que aciona a sirene.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 18 Jun 2014 14:52

Com relação ao post anterior so funcionou com o "while ( ! input(PIN_NIVEL_AGUA) == 0);" e não quis com "while ( input(PIN_NIVEL_AGUA) );" , mas o que importa e que funcionou.

O problema persiste agora no alarme, quando o programa chega na função FIM, o programa não faz nada, para sem acionar a sirene. Abaixo o programa que modifiquei, talvez tem alguma coisa errada.
Código: Selecionar todos


#include "C:\Documents and Settings\CARLUCIO\Desktop\enumeração\aut tank.h"
//#int_RTCC
///void  RTCC_isr(void)
//{

//}

//#use delay(clock=20000000) // << Frequência do crystal é 20MHz?
 
//#include <lavadora.h>
 
#define PIN_NIVEL_AGUA          pin_a2
#define PIN_BOT_PROG1           pin_a3
#define PIN_BOT_PROG2           pin_a0
#define PIN_ENCHER              pin_b3
#define PIN_ESVAZIAR            pin_b0
#define PIN_MOTOR               pin_b4
#define PIN_ALARME              pin_b5
 
#define FUNC_LIGA_MOTOR()       { output_high(PIN_MOTOR); }
#define FUNC_DESLIGA_MOTOR()    { output_low (PIN_MOTOR); }
 
#define FUNC_ESVAZIAR()         { output_low(PIN_ESVAZIAR);             \
                                  delay_ms(1000);         \
                                  output_high(PIN_ESVAZIAR);            \
                                  delay_ms(60000);        \
                                  delay_ms(60000);        \
                                  delay_ms(60000);        \
                                  output_low(PIN_ESVAZIAR);             \
                                  delay_ms(1000);         \
                                }
                                   
#define FUNC_ENCHER()           { output_high(PIN_ENCHER);              \
                                  while (!input(PIN_NIVEL_AGUA)==0 );   \
                                  output_low(PIN_ENCHER);               \
                                }
                                 
#define FUNC_ALARME()           { output_high(PIN_ALARME);              \
                                  delay_ms(5000);                       \
                                  output_low(PIN_ALARME);               \
                                }
 
enum STEPS {
    FIM,            // = 0
    ESPERA_1MIN,    // = 1
    ESPERA_2MIN,
    ESPERA_3MIN,
    ESPERA_4MIN,
    ESPERA_5MIN,
    INICIO,
    COMPLETAR_AGUA,
    LAVAR,
    DESCARTAR_AGUA,
    CENTRIFUGAR
};
 
unsigned char funcao1[] = {
  //  INICIO,          // Para acomodar a roupa?
       
 //   DESCARTAR_AGUA,          // Trocar água no caso de um RESET?
    COMPLETAR_AGUA,  //
 
   // CENTRIFUGAR
 
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 5 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
   
    ESPERA_3MIN,                   // Não faz nada durante três minutos
 
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 4 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
 
    ESPERA_2MIN,                   // Não faz nada durante dois minutos
 
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 3 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
 
    DESCARTAR_AGUA,
       
    FIM     ---------------------------------->>>>>> Quando chega aqui não executa a função alarme, encerra por aqui sem executar
};
 
unsigned char funcao2[] = {
 //   INICIO,          // Para acomodar a roupa?
       
   // DESCARTAR_AGUA,          // Trocar água no caso de um RESET?
    COMPLETAR_AGUA,          //
   
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 5 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
   
    ESPERA_3MIN,                   // Não faz nada durante três minutos
 
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 4 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
 
    ESPERA_2MIN,                   // Não faz nada durante dois minutos
 
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 3 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
 
    DESCARTAR_AGUA,
    COMPLETAR_AGUA,
   
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 5 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
   
    ESPERA_3MIN,                   // Não faz nada durante três minutos
 
    LAVAR,
    LAVAR,
    LAVAR,
    LAVAR,                              // Motor irá trabalhar por 4 minutos. Com ciclo de 30 segundos ligado e 30 segundos desligado.
   
    ESPERA_1MIN,
   
    CENTRIFUGAR,
 
    DESCARTAR_AGUA,
 
    FIM                                    // Aciona Sierene e encerra função executar()
};
 
void executar (unsigned char *passos);
 
void main () {
    setup_comparator (NC_NC_NC_NC);
    setup_vref (FALSE);
 
    output_low(PIN_MOTOR);
    output_low(PIN_ESVAZIAR);
    output_low(PIN_ENCHER);
    output_low(PIN_ALARME);
     
    while (true) {
        if (input(PIN_BOT_PROG1)==0) {
            executar (funcao1);
        } else if (input(PIN_BOT_PROG2)==0) {
            executar (funcao2);
        }
    }
}
 
void executar (unsigned char *passos) {
    unsigned int  i;
 
    for (; *passos; ++passos) {
        switch (*passos) {
        case ESPERA_1MIN:
        case ESPERA_2MIN:
        case ESPERA_3MIN:
        case ESPERA_4MIN:
        case ESPERA_5MIN:
            i = (*passos) * 60;         // Ex. Se passos = ESPERA_4MIN, i = 60 * 4
            while(i--) delay_ms(1000);  // OBS: delay_ms(x); x não deve ser maior que 65535.
            break;
             
        case INICIO:
            FUNC_LIGA_MOTOR();
            delay_ms(30000);            // Aguarda 30 segundos
            FUNC_DESLIGA_MOTOR();
            delay_ms(30000);
            FUNC_LIGA_MOTOR();
            delay_ms(30000);
            FUNC_DESLIGA_MOTOR();
            break;
             
        case LAVAR:
            FUNC_LIGA_MOTOR();
            delay_ms(30000);
            delay_ms(30000);
            FUNC_DESLIGA_MOTOR();
            break;
             
        case COMPLETAR_AGUA:
            FUNC_ENCHER();
            break;
             
        case DESCARTAR_AGUA:
            FUNC_ESVAZIAR();
            break;
           
        case CENTRIFUGAR:
            FUNC_LIGA_MOTOR();
            delay_ms(60000);
            delay_ms(60000);
            delay_ms(60000);            // 3 minutos
            FUNC_DESLIGA_MOTOR();
            break;   
             
        default://  FIM    ----------------------------->>>>>>>>> Aqui não deveria ser uma nova case ? O  " FIM " comentado não atrapalha em nada ?
            FUNC_ALARME();
            delay_ms(5000);
            FUNC_ALARME();
            delay_ms(5000);
            FUNC_ALARME();
            return;
        }
    }
}



Destaquei acima a duvida, alguma coisa esta errada?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor cfreund » 18 Jun 2014 22:14

Erro meu.

Corrija a linha "for (; *passos; ++passos) {" para "for (; ; ++passos) {"
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 23 Jun 2014 12:46

Caros amigos,

O programa roda perfeitamente no proteus, mas na pratica olha so o que esta acontecendo:


O programa não esta aceitando escolher a função ele ja vai direto para a função 1 sem pressionar nenhuma tecla, e ainda faz isso indefinidamente. Não entendi porque no proteus esta rodando perfeitamente.


Gente desculpa a qualidade dos videos mais, o mesmo foi gravado em mp4, mas na hora de transferir para youtube ficou desse jeito.

Alguem pode me orientar no que esta acontecendo? Desde ja adianto que ja troquei o pic e a placa é de padrão industrial.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor cfreund » 23 Jun 2014 13:10

Qual a tensão no pino A3 sem o botão?
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 23 Jun 2014 15:26

As tensões são as seguintes:

Saida 1 (RB3) - 0 volts
Saida 2 (RB0) - 0 volts
Saida 3 (RB5) - 0 volts
Saida 4 (RB4) - 4,80 volts ( é o que esta entrando direto)

Entrada 1 (RA2) - 0 volts
Entrada 2 (RA3) - 0 volts
Entrada 3 (RA4) - 0 volts
Entrada 4 (RA5) - 0 volts

Terei que mudar a logica, este é o problema ? input(bt_prog1)==1;
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor cfreund » 23 Jun 2014 15:32

Faz o testículo...
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor carlucio » 23 Jun 2014 20:38

É isso ai!

Santa ignorancia minha, fiz confusão no jeito de atuar nas portas, no proteus fiz quando zera-se a tensão e na placa havia me esquecido que é quando se manda 5 volts na porta.

Agora assim que estiver montado, se caso não aparecer erro novamente, coloco o video do mesmo montado e funcionando.

A todos que puderam me ajudar, agradecimentos.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como trabalhar com timer dos pic na linguagem c ccs

Mensagempor cfreund » 23 Jun 2014 20:43

Bacana. Demorou, mas concluiu.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Anterior

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x