Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
fabio fg

Dúvida eeprom 16f628a

Recommended Posts

fabio fg    0

   Boa tarde caro amigos, estou com um pequeno problema com EEPROM de um 16f628a. Bem vamos lá...estou desenvolvendo um cronômetro mas com incremento de 10 em 10 minutos mas com leds...que já está funcionando por sinal mas estou querendo deixá-lo mais redondo podendo salvar os minutos restantes e a sua atual posição em relação ao sistema em uma eventual falta de energia. 

 

Pelo que já fiz simplesmente não funciona no Proteus e muito menos na prática.

 

Utilizando o CCS compiler gostaria de saber poderia estar acontecendo ....

 

#include <16f628a.h>
#include <internal_eeprom.c>
#use delay(clock=4000000)
#fuses xt,put,NOwdt,protect,NOLVP,NOCPD,INTRC_IO,BROWNOUT,NOMCLR  //atual
//#fuses XT,INTRC_IO,NOWDT,PUT,BROWNOUT,NOMCLR,NOLVP,PROTECT
#DEFINE pulso PIN_A0 //coin
#DEFINE ciclo_1 PIN_A1 //led 1
#DEFINE ciclo_2 PIN_A3 //led 2
#DEFINE ciclo_3 PIN_B7 //led 3
#DEFINE ciclo_4 PIN_B0 //led 4
#DEFINE ciclo_5 PIN_B1 //led 5
#DEFINE buzzer PIN_B5
#DEFINE RELE PIN_A2 // relê 
#DEFINE PILOTO PIN_B4 //led piloto
//#include "lcd_FLEX.c"
#rom 0x2100 = {0x08,0x07}

int16 h,m,s,ms,op,es,AUX,ini,pos_save;
int adress;
char estado;

void main(VOID){

   //DELAY_MS(500);
   es = 1 ;
 //  lcd_init();
  // lcd_putc("\fDIVIRTA-xx");
//   lcd_putc("\nR$ 0,50 - 10 Min");
   estado = 'e';
   h=00;
   m=00;
   s=00;
   ms=00;
   
   OUTPUT_low(rele);
   
   OUTPUT_high(ciclo_1);
   delay_ms(1000);
   OUTPUT_high(ciclo_2);
   delay_ms(1000);
   OUTPUT_high(ciclo_3);
   delay_ms(1000);
   OUTPUT_high(ciclo_4);
   delay_ms(1000);
   OUTPUT_high(ciclo_5);
   delay_ms(1000);
   OUTPUT_high(piloto);
   
   OUTPUT_low(ciclo_1);
   OUTPUT_low(ciclo_2);
   OUTPUT_low(ciclo_3);
   OUTPUT_low(ciclo_4);
   OUTPUT_low(ciclo_5);
   
   ini=1;
   
   pos_save = read_int16_eeprom(1); // lê a memória eeprom
   
   // habilita interrupções
   SETUP_CCP1(CCP_CAPTURE_RE);      
   enable_interrupts(INt_CCP1);   
   enable_interrupts(global);  
      
   
switch(pos_save) // verifica se há memória alocada 
{
case 1: {OUTPUT_high(ciclo_1);
        break;}
case 2: {OUTPUT_high(ciclo_2);
        break;}
case 3: {OUTPUT_high(ciclo_3);
        break;}
case 4: {OUTPUT_high(ciclo_4);
        break;}
case 5: {OUTPUT_high(ciclo_5);
        break;}
}
   
   
while(TRUE)
{

if (input(pulso)==0)
{
OUTPUT_high(rele);
delay_ms(10);
OUTPUT_low(piloto);

m = m + 10; // incremento em 10 minutos

if (ms == 00)
{
ms=10;
}
estado='t';
if (m > 60)
{
h++;
m=0;
m=m+5-1;
}
}

if (estado=='t')
{
ms=ms-1;
if (ms == 0)
{
s--;
ms=10;
if (s == -1)
{
s=59;
m--;
if ((m == -1) && (h > 0))
{
m=59;
h--;
}else
{
s=59;
}
}
}
}
//if ((s == 0) && (m == 0) && (h == 0))
if ((m <= 0))
{
estado = 'i';

OUTPUT_low(ciclo_1);
OUTPUT_low(ciclo_2);
OUTPUT_low(ciclo_3);
OUTPUT_low(ciclo_4);
OUTPUT_low(ciclo_5);
OUTPUT_high(piloto);
m = 00;
}

if (estado=='t')
{
//lcd_gotoxy(1,1);
//lcd_putc("\fTEMPO RESTANTE:");
//lcd_gotoxy(1,2);
//printf (lcd_putc,"%02d:%02d:%02d\n", h, m, s);
/*
switch (m){
case 2: { //delay_ms(50);
          OUTPUT_low(ciclo_2);
        }
case 4: { //delay_ms(50);
          OUTPUT_low(ciclo_3);
        }
case 6: { //delay_ms(50);
          OUTPUT_low(ciclo_4);
        }
case 8: { //delay_ms(50);
          OUTPUT_low(ciclo_5);
        }
}*/
if (m > 0)
{
delay_ms(20);
OUTPUT_high(ciclo_1);
write_int16_eeprom(0,1);

}
if (m > 10)
{
delay_ms(20);
OUTPUT_high(ciclo_2);
write_int16_eeprom(0,2);
}else
{
OUTPUT_low(ciclo_2);
}
if (m > 20)
{
delay_ms(20);
OUTPUT_high(ciclo_3);
write_int16_eeprom(1,3);
}else
{
OUTPUT_low(ciclo_3);
}
if (m > 30)
{
delay_ms(10);
OUTPUT_high(ciclo_4);
write_int16_eeprom(0,4);
}else
{
OUTPUT_low(ciclo_4);
}
if (m > 40)
{
//delay_ms(10);
OUTPUT_high(ciclo_5);
write_int16_eeprom(0,5);
}else
{
OUTPUT_low(ciclo_5);
}
if (m > 50)
{
m = 50;
OUTPUT_high(piloto);
}
delay_ms(90);
}else
{
//lcd_putc("\f");
op=2;
//lcd_putc("\fDIVIRTA-xx");
//lcd_putc("\nR$ 0,50 - 10 Min");
OUTPUT_low(rele);
//OUTPUT_low(buzzer);
OUTPUT_low(ciclo_1);
OUTPUT_low(ciclo_2);
OUTPUT_low(ciclo_3);
OUTPUT_low(ciclo_4);
OUTPUT_low(ciclo_5);
OUTPUT_high(piloto);
m = 00;
estado='e';
delay_ms(50);
ES = 0;
}
}
}

 

 

 

 

 

 

 

Editado por fabio fg

Compartilhar este post


Link para o post
Compartilhar em outros sites
Isadora Ferraz    1.609

permita-me não analisar o fonte (eu me autopermiti).

 

A essência de gravar valor na eeprom se acabar luz ou desligar é:

-programe o compadador

-programe interrupção pra ele

-use a referência interna numa entrada

-noutra ligue na entrada do regulador (geralmente 7805). Claro com resitores divisores de tensão.

-ao desligar, a V de entrada vai cair (claro)

-quando a V- de uma entrada for menor que a V+ da outra, será gerada um interrupção

-nesta rotina, grave na eeprom o valor que desejar. Mas antes...

-detalhe - I: grave apenas se valor alterou pra não gastar a cota de gravações da eeprom. Mas antes...

-detalhe - II: na interrupt, desligue tudo que está consumindo primeiro. O tempo de descarga do capacitor de entrada (geralmente > 1000uF) deve ser suficiente para gravar na eeprom

-Detalhe - III: ideia 100% original que até há agum tempo você não achava na net

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
fabio fg    0
  • Autor do tópico
  • 1 hora atrás, Isadora Ferraz disse:

     

    Obrigado pela dica...vou seguir aqui para alcançar o sucesso. Sou programador que arrisco na eletrônica, rs mas ei de conseguir !

     

    Obrigado pelo elogio referente a ideia.

    Editado por fabio fg

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    aphawk    2.456

    @fabio fg ,

     

    Creio que usar um real-time clock ( tipo DS1307 ou melhores ) te ajudaria muito, pois eles possuem uma memória interna, e você pode armazenar a sua contagem do tempo dentro dele ( e outras informações que sejam necessárias ), pois possui 56 bytes de memória não volátil. Ele usa uma pequena bateria de backup que mantêm os dados por anos e também permite que o relógio continue funcionando em tempo real, mesmo na falta da energia principal.

     

    Assim, você até pode saber quanto tempo ficou sem energia, e pode tomar alguma atitude necessária.

     

    Paulo

    Editado por aphawk
    complementar
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Isadora Ferraz    1.609

    Da excelente dica do amigo Paulo me veio outra um pouco inferior mas hardwaremente minimalista. Alimente o mc também com bateria e o faça dormir - comando sleep (#asm) - quando sem Vac. Isso deve ...

    16 horas atrás, fabio fg disse:

    salvar os minutos restantes e a sua atual posição em relação ao sistema em uma eventual falta de energia. 

    abç

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×