Boa tarde Claudio, tudo bem? espero que sim.
Algum tempo atrás você me ajudou com esse código só que deparei com um problema, toda vez que eu desligo e ligo a energia tem um pulso involuntário no pino denominado S4 do pic. Teria como eliminar essa falha? Segue abaixo o código que estou usando.
#include <main.h>
#ROM 0x2100 = {0,0}
#byte portA= 0x05
#byte cmcon= 0x19
#byte ansel= 0x9f
#define _S1 portA,0
#define _S2 portA,1
unsigned int1 flag1=0, flag2=0;
#define END_S1 0x00
#define END_S2 0x01
void main()
{
cmcon=7;// desliga comparador interno
ansel=0;// desativa o conversor AD
delay_ms(10);
Output_low(S1);
Output_low(S2);
Output_low(S3);
Output_low(S4);
if(read_eeprom(END_S1))Output_high(S1);else Output_low(S1);
if(read_eeprom(END_S2))Output_high(S2);else Output_low(S2);
while(TRUE)
{
if(input(E1)==0){
delay_ms(100);
}
if(input(E1)==0 && flag1==0)
{
flag1=1;
Output_toggle(S2);
Output_toggle(S1);
if(bit_test(_S2))write_eeprom(END_S2,1);else write_eeprom(END_S2,0);
if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
Output_high(S3);
delay_ms(500);
Output_low(S3);
Output_high(S4);
delay_ms(200);
Output_low(S4);
delay_ms(15000);
}
if(input(E2)==0){
delay_ms(100);
}
if(input(E2)==0 && flag2==0)
{
flag2=1;
Output_toggle(S1);
if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
Output_high(S4);
delay_ms(200);
Output_low(S4);
delay_ms(300);
}
if(input(E1)==1)flag1=0;
if(input(E2)==1)flag2=0;
}
}
Fico muito agradecido se puder me ajudar!
Abraço
Por favor, atente ao seguinte: Faltou o arquivo 'main.h' para saber onde estão ligados os pinos S1 a S4. Preciso saber qual é o microcontrolador que está usando. Também você não foi muito 'claro' sobre o tal pulso. O que acontece? É no pós reset apenas? Ele fica ligado? Só por uns instantes? Dai fica normal?
Desculpe, vou mandar o "main.h", funciona normal, só que quando desligo simulando uma queda de energia quando ligo novamente o S3 e S4 ( testei agora também e faz a mesma coisa) da um pulso e para.
Funciona tudo normal mas se tirar da tomada e colocar novamente ele da esse pulso.
#include <12F675.h>
#device ADC=10
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES PROTECT //Code protected from reads
#FUSES CPD //Data EEPROM Code Protected
#use delay(internal=4MHz)
#use FIXED_IO( A_outputs=PIN_A5,PIN_A2,PIN_A1,PIN_A0 )
#define S1 PIN_A0
#define S2 PIN_A1
#define S3 PIN_A2
#define E1 PIN_A3
#define E2 PIN_A4
#define S4 PIN_A5
Por favor, tente mudar o fuse para BROWNOUT em vez de NOBROWNOUT. Com esta função ativada, ele reseta se encontrar tensão abaixo dos limiar interno e evita que o programa se perca. Adicionalmente:
Verifique se os pinos estão controlando cargas indutivas. Se tiver, verifique meios de eliminar picos de tensão gerados usando diodos (CC) ou capacitores + resistores (AC). Verifique a fonte de alimentação de 5 Volts. Certifique que ela não varia quando você liga a tomada (se é bem regulada). Coloque um capacitor de 220 nf entre o Vcc e o Vdd do pic, o mais próximo possível.
Os pic's são muito sensíveis a interferências externas. Caixas metálicas aterradas ajudam bastante se for o caso de interferências.
Bom dia Claudio, Fiz a alteração sugerida do fuse mas ficou igual, sobre a fonte é regulada com 7805 , no pic tem no pinos de alimentação colados nele praticamente o cap, quanto as saídas não controlam cargas indutivas, controlam max 487. Acredito que não seja interferência externa porque o GP2(s3) funciona perfeito, não da o pulso quando desliga a energia e religa! Imaginei ser alguma configuração para esse pinos. Alternativamente para testar o circuito liguei um diodo 1n4148 no Gp2 no circuito que GP5 aciona e funcionou sem dar o pulso quando liga o circuito. Alguma sugestão??
Obrigado.
Uma coisa que observei olhando o datasheet é que o GP5 não tem entrada analógica! será que não seria esse o motivo dele não dar o pulso quando liga?
Olhando bem, no início da rotina 'main' vemos o abaixo:
void main()
{
cmcon=7;// desliga comparador interno
ansel=0;// desativa o conversor AD
delay_ms(10); //<----------------------------------------------------- durante este delay acredito que as gpio estão em alta impedância.
Output_low(S1);
Output_low(S2);
Output_low(S3);
Output_low(S4);
Por favor, tente mudar a posição deste delay conforme abaixo:
void main()
{
cmcon=7;// desliga comparador interno
ansel=0;// desativa o conversor AD
Output_low(S1);
Output_low(S2);
Output_low(S3);
Output_low(S4);
delay_ms(10);<-----------------agora as gpios estão como saída.
Vou mudar e retorno com os resultados!
Boa tarde Claudio, problema resolvido! eu esqueci de colocar resistor de pullup no pino E2 (GPI4) e estava causando toda essa bagunça rsrs! Desculpe o incômodo e muito obrigado pela ajuda!!
Boa tarde Claudio, problema resolvido! eu esqueci de colocar resistor de pullup no pino E2 (GPI4) e estava causando toda essa bagunça rsrs! Desculpe o incômodo e muito obrigado pela ajuda!!
Que bom que você tenha encontrado o problema! Isto é muito comum, pois eu também passo por situações parecidas só para descobrir que esqueci alguma coisa pequena para trás.
Bom final de semana para você e sua família!
Faz parte rsrs, ótimo final de semana pra você e sua família também!!
Forte abraço e logo voltarei com algumas dúvidas rsrs
Que bom que tenha resolvido. Parabéns pela sua insistência!