Ir ao conteúdo
  • Cadastre-se

PIC Recebendo sinal negativo no microcontrolador


Ir à solução Resolvido por .if,

Posts recomendados

Olá! Sou novo aqui e não sei se estou no lugar correto :)
Fiz um circuito onde envio um pulso positivo de 5V ao pic através de um pushbutton, o PIC (12F629) recebe o sinal e executa a programação. Esta funcionando perfeitamente, mas agora preciso fazer exatamente a mesma coisa, porém enviando um sinal negativo e não sei como fazer. Já tentei da forma como faço um reset no MCLR mas não funcionou.
O programa que uso é o PIC C Compile
A linha de código para receber o sinal positivo é esta:

 

if(input(inicia)){...}


INICIA é a var criada para o pino A1

<#define inicia      PIN_A1


Se alguém poder me ajudar eu agradeço.

Abraço!
 

Link para o comentário
Compartilhar em outros sites

Obrigado por responder!
O que fiz na verdade é um corta corrente para motos com temporizador, agora, preciso fazer um para carros, e o sinal que preciso enviar para o pic, é o sinal de quando a porta do carro abre, realmente não sei se é negativo, terra etc.
Quando você fala sobre compilador de verdade, qual você se refere? kkk
Obrigado mais uma vez.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

É que o ccs, a exemplo do arduino, tenha mastigar tudo d+ e isso é um pouco irritante pra minha "idade".

P.ex. pesquise o comando (uma função) pra escrever 1 mísero bit num port.

Em c dos pics basta fazer

RB0=0; ou

GPIO0=0;

GPIO=0b10101010;//escreve em tudo

ler:

a=GPIO4;

 

#define PORTA_ABERTA GPIO3

#define led GPIO2

if (!PORTA_ABERTA) {led=1;...};

 

1 hora atrás, Marcio Pizano disse:

realmente não sei se é negativo, terra etc.

Sem problema. Foi só pra te fazer um "ajuste técnico". Quanto à porta, se for o sensor de porta é um botão que dá contato com terra, portanto "negativo" tudo bem. O detalhe é que é 12V. Nada que um divisor resistivo não resolva. Algo como

+12--[lâmpada]-+-[interr da porta]-+-[gnd]
               |                   |
               +--[10k]-+-[4k7]----+ 
                        |
                        +---------->PIC

Tenta o irritante

if(!(input(inicia))){...} ou

if(~(input(inicia))){...} ou ainda

if((input(inicia))^1){...}

É tudo quase a lesma lerda.

 

Profecia... ruídos devem te atazanar... (não explico)

 

Link para o comentário
Compartilhar em outros sites

Olá!
No simulador Proteus, tudo perfeito, funcionou legal e nem precisei mudar o restante dos comandos, apenas o IF.
Fiz uma modificação no esquema elétrico também, ao invés de receber nível lógico alto, recebe nível lógico baixo.

if(!(input(inicia))){...}

if(!(input(inicia))){...}

Agora, na prática ainda não sei, quando ficar pronto posto o resultado.

Abraço!

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Olá Isadora!
Fiz o circuito, estafuncionando no Proteus perfeitamente, porém, na prática (Protoboard) os relés não acionam porquê fiz umas modificações no circuito, deixei de usar por exemplo lm7805 para usar Zener, tudo para baratear o circuito, com isso, pensei em substituir os relés pelo TIP122 NPN, no proteus esta ok.
Gostaria de saber se é uma prática válida fazer essa substituição.
O led no circuito é apenas para visualizar o resultado, será uma buzina, corrente de 3,9A
Obrigado!
 

Spoiler

image.thumb.png.82de158239921b8700bb7f9abfdaa6d5.png

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Por favor desenhe e monte desta forma:

circuito-rel%C3%A9.jpg

ndv os -5V, ok?

 

Penso que o relé fica + melhor que o tip. O tip pode querer esquentar. E sim, claro , com 7805 fica melhor. Nesta etapa de sua existência, use ele mesmo. Deixe a ideia de economia pra futuro quando alguém te pedir 10000 peças por mês.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Olá!
Fiz o circuito e ainda não funcionou na prática.
Estou enviando o código para se possível (Questão de tempo) identificar algo que devo modificar.
Estou tentando fazer o mais próximo possível do outro modelo que esta funcionando, porém, enviando o sinal negativo. Retirei o uso do Zener e voltei com o 7805 e capacitor para evitar os ruídos.

As imagens eu não estou conseguindo anexar.

#include<12F629.h>
#use delay(clock=4000000) // Oscilador interno
#fuses XT,nomclr,nowdt

//Trocando XT para INTRC_IO, fica oscilando INTERNAMENTE sem o auxilio do cristal.


#define inicia PIN_A1       //pino INICIA      - (PINO 6)
#define rele_buzina PIN_A2  //pino RELÉ BUZINA - (PINO 5) 
#define rele_corta PIN_A0   //pino RELÉ CORTA  - (PINO 7)


//Tipo inteiro
int FOCO     = 1;     
int BUZI     = 0;
int CONTA    = 0;



void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);



//Estágio 1 - RELÉ DESATIVADO - NÃO PEGA
//************************************************************************************************************************************************************************
    nao_pega: //RÓTULO do goto (é o inicio)
    while( FOCO  == 1 ){
                

                if(!(input(inicia))){        //PULSO BOTÃO (PINO 6)
                delay_ms(500);               //Evitar retorno
                output_high(rele_corta);     //ACIONO o relé que permite a passagem de corrente (TEMPO) - (PINO 5)    
                output_low(rele_buzina);    //ACIONO o relé que permite a passagem de corrente (BUZINA) - (PINO 7) (INVERTIDO, leia a obs.)                   
                FOCO = 2;                    //Adiciono 1 ao FOCO para controlar o While
                goto pega;                   //VAI PARA o marcador
                }//IF
}//FOCO
//************************************************************************************************************************************************************************


//Estágio 2 - RELÉ ATIVADO - PEGA
//************************************************************************************************************************************************************************
    pega: //RÓTULO do goto (é o outro índice do goto)  
    while( FOCO  == 2 ){

                if(!(input(inicia))){           //PULSO BOTÃO (PINO 6)  
                delay_ms(200);
                FOCO = 3;                       //Adiciono 0 ao FOCO para controlar o While
                goto contando;                  //VAI PARA o marcador
                }//IF                 
}//FOCO
//************************************************************************************************************************************************************************





//Estágio 3 - RELÉ ATIVADO - CONTANDO
//************************************************************************************************************************************************************************
    contando: //RÓTULO do goto (é o outro índice do goto)  
    while( FOCO  == 3 ){  
    
                delay_ms(500); //Preciso do valor baixo para aceitrar o clique do botão com rapidez (Precisão)
                CONTA++;

                if(!(input(inicia))){           //PULSO BOTÃO (PINO 6) 
                delay_ms(500);                  //Evito o retorno
                FOCO = 2;                       //Adiciono 0 ao FOCO para controlar o While
                CONTA = 0;
                goto pega;                      //VAI PARA o marcador
                }//IF  
                
//                if(CONTA == 1260){                //um segundo = 10,5
                if(CONTA == 14){                //um segundo = 10,5
                FOCO = 4;                       //Adiciono 0 ao FOCO para controlar o While
                CONTA = 0;
                goto cortado; 
                }//IF                
                
}//FOCO
//************************************************************************************************************************************************************************



//Estágio 4 - RELÉ DESATIVADO - CORTADO
//************************************************************************************************************************************************************************
    cortado: //RÓTULO do goto (é o outro índice do goto)  
    while( FOCO  == 4 ){
    delay_ms(500);
      
                //Neste caso apenas desligando a moto para voltar ao normal      
                output_low(rele_corta);      //DESACIONO o relé que permite a passagem de corrente (CORTA) - (PINO 7)
                output_low(rele_buzina);     //DESACIONO o relé que permite a passagem de corrente (BUZINA) - (PINO 5) 
                buzi++;

                if (buzi == 2){
                output_high(rele_buzina);
                delay_ms(100);
                buzi = 0;
                }//IF
}//FOCO
//************************************************************************************************************************************************************************


}//Void main

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

Ok.
O circuito funciona (Na prática) se eu não inverter o sinal negativo enviado pelo botão, ou seja, se eu enviar positivo ao pic e manter a programação sem a opção de inversão do sinal.
Se eu enviar negativo ao pic e mudar a programação, funciona somente no Proteus e não na prática.

Segue a imagem.
😘😆

1.png?1561856304

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

você deve ter feito alguma cagadinha na montagem. E no esquema acima por favor retire a indicação -5 e -12 pois tá me incomodando. Coloque só o símbolo terra/gnd

No seu programa, me mostre onde está definindo se pino entrada ou saída... TRIS...

Tá vendo? O ccs te engessa de tal forma que nem sabe o que é isso. Sim é importante saber. Mas me lembrei agora que o irritante ccs te mastiga isso... e sem explicar nada... aff...

Link para o comentário
Compartilhar em outros sites

Olá! Realmente tinha feito uma cagadinha no circuito kkk

Então para sanar as dúvidas, peguei uma placa que tinha certeza do seu bom funcionamento, tirei o pic que enviava 5v no botão e coloquei outro gravado com a programação que postei e tudo funcioneou lindamente. É claro que tive que cortar uma trilha na pci para enviar um sinal negativo, mas tudo ok agora.

Agradeço por sua ajuda que foi de grande importância.

 

Spoiler

me mostre onde está definindo se pino entrada ou saída

Realmente não preciso definir o TRIS, isso deixa agente meio "cego" mesmo.


Abraço!

Link para o comentário
Compartilhar em outros sites

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