Ir ao conteúdo

Posts recomendados

Postado

Boa noite pessoal....

Estou tentando usar um pic-12f675/629 para controlar dois relés, preciso implementar em C uma lógica que através de sensores controla de forma independentes dois relés, cada uma com o seu sensor de presença. Ex.: S1 controla R1 e S2 controla R2. Quando o sensor é acionado, o relé precisa ficar habilitado por quatro segundos. O dificultador é que durante os 4 segundos de acionamento do R1, se acionar S2, R2 também precisa ser ativado ao mesmo tempo. 

 

Como posso fazer isso com apenas um pic, poderiam me ajudar ? 

 

Postado
1 hora atrás, Valdevir disse:

Boa noite pessoal....

Estou tentando usar um pic-12f675/629 para controlar dois relés, preciso implementar em C uma lógica que através de sensores controla de forma independentes dois relés, cada uma com o seu sensor de presença. Ex.: S1 controla R1 e S2 controla R2. Quando o sensor é acionado, o relé precisa ficar habilitado por quatro segundos. O dificultador é que durante os 4 segundos de acionamento do R1, se acionar S2, R2 também precisa ser ativado ao mesmo tempo. 

 

Como posso fazer isso com apenas um pic, poderiam me ajudar ? 

 

Posta seu código que você fez até agora.

Postado
1 hora atrás, DELPITEC disse:

Posta seu código que você fez até agora.

Estou usando mplax com xc8

Segue...

 

#include<pic12f629.h>
#include<htc.h>
#include <stdio.h>
#include <stdlib.h>
#include"xc.h"
#pragma config MCLRE=OFF , CP=OFF, CPD=OFF , BOREN=OFF , WDTE=OFF , PWRTE=OFF , FOSC=INTRCIO

#define _XTAL_FREQ 4000000

volatile int i;

void sys_init(void);

void sys_init(void)
{
 GPIE=0;
 CMCON =0b00000111;
 TRISIO =0; TRISIO0=0; TRISIO1=0; TRISIO2=0; TRISIO4=1; TRISIO5=0; TRISIO3=1; GPIO =0;
 T0IE = 0; // Disable timer interrupt
 GIE = 0;
}


int main(int argc, char** argv) {
    //Inicializa PIC
    sys_init();    

    //contador sensor 2
    int isDelay = 0;
    
    //GPIO4 -> Sensor 1 -> Sensor invertido -> 0 - Sensor habilitado -> 1 - Sensor desabilitado
    //GPIO5 -> Sensor 2 -> Sensor invertido -> 0 - Sensor habilitado -> 1 - Sensor desabilitado
    //GPIO0 -> Rele 1
    //GPIO1 -> Rele 2
    while(1)
    {
        //Caso Sensor 0 sinal baixo (sensor habilitado)
        if (GPIO4==0 ){
            //Saida 4 sinal alto
            GPIO0 = 1;
            isDelay = 1;
        //Caso Sensor 1 sinal alto (sensor desabilitado)
        }else{
            //Saida 0 sinal baixo, caso não esteja
            GPIO0 = 0;
            //Habilitar sensor 0
            desls0 = 0;
        }
        if (GPIO5==0 ){
            //Saida 4 sinal alto
            GPIO1 = 1;
            isDelay = 1;
        //Caso Sensor 0 sinal alto (sensor desabilitado)
        }else{
            //Saida 4 sinal baixo, caso não esteja
            GPIO1 = 0;
        }
        //Saida 4 vai para sinal baixo
        GPIO0 = 0;
        
        if(isDelay==1){
            //Aguarda 4 segundos
            __delay_ms(4000);
        }
    }
}

  • Membro VIP
Postado

Estude e use um dos timers e estude e use o conceito de interrupção por mudança de nível e alie ao do timer.

 

Mas antes olha isso só no loop e só com if's minimalistas

main()
//inicializa hw
static bit r_1,r_2;
int tr1,tr2;
for(;;)
{
if(S1) R1=r_1=1;
if(S2) R2=r_2=1;
if(r_1) {tr_1++;delay(1);}
if(r_2) {tr_2++;delay(1);}
if(tr1>=4000) tr1=r_1=rele1=0;
if(tr2>=4000) tr2=r_2=rele2=0;
}

Entenda e me explique pois digitei agora e nem sei se tá certo

E se achar que ctrl-c ctrl-v vai resolver seu problema, receba um tradicional cóqui virtual 😠

 

  • Haha 1
Postado
11 minutos atrás, Isadora Ferraz disse:

Estude e use um dos timers e estude e use o conceito de interrupção por mudança de nível e alie ao do timer.

 

Mas antes olha isso só no loop e só com if's minimalistas


main()
//inicializa hw
static bit r_1,r_2;
int tr1,tr2;
for(;;)
{
if(S1) R1=r_1=1;
if(S2) R2=r_2=1;
if(r_1) {tr_1++;delay(1);}
if(r_2) {tr_2++;delay(1);}
if(tr1>=4000) tr1=r_1=rele1=0;
if(tr2>=4000) tr2=r_2=rele2=0;
}

Entenda e me explique pois digitei agora e nem sei se tá certo

E se achar que ctrl-c ctrl-v vai resolver seu problema, receba um tradicional cóqui virtual 😠

 

Obrigado @Isadora Ferraz, tenho percebido que no mundo dos microcontroladores é bem difícil resolver problemas com copia/cola, rsrsrs.

Estava mesmo estudando o conceito de interrupção externa e por estouro de contador (timer), obrigado pela dica. Vou testar, a ideia é por ai mesmo ele, ele vai contar 4 mil vezes o delay de 1ms segundo. Eu esatava preso na ideia de delay(4000) apenas, vou tirar a viseira. Obrigado !!!!

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...