Fórum

Ajuda com um código...
 
Notifications
Clear all

Ajuda com um código para 12F675 CCS  

   RSS

0

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

8 Answers
0

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

 

0

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.

0

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?

0

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!

 

0

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

0

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

0

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

0

Que bom que tenha resolvido. Parabéns pela sua insistência!

Back To Top