Ir ao conteúdo
  • Cadastre-se

Limite de cases para um switch e erro71


cesarlg

Posts recomendados

ola como o topico ja disse tenho uma programaçao em c (ccs) onde tenho por enquanto 13 cases em um switch.. devo chegar a pelo o 19 cases. mas na simulaçao somente até o case 12 funciona, com o 13º case compila normal mas nao simula. e ai? limite de cases, proteus limitado, ou o q?

obs.. o case 13 esta coreto sem erros!

outro problema é qd faço dessa forma para dar uma impressao de variavel sendo ajustada, piscando.

printf(lcd_putc,"\f AJUSTE MINUTOS:\n %u : [%u] : %u",_hora,_mim,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE MINUTOS:\n %u : [ ] : %u",_hora,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE MINUTOS:\n %u : [%u] : %u",_hora,_mim,_seg);

delay_ms (300);

consigo fazer apenas 2 cases depois da um error 71 ... out of rom, a segment or the program is to large MAIN.

tenho ROM e RAM sobrando (17%,46%).

obrigado. e feliz ano novo!!!!!!

Link para o comentário
Compartilhar em outros sites

Sinceramente meus conhecimentos vão até aqui.. kkkk . adoraria q dessem essa força, assim posso aprender !! essa questao de ultrapassar os segmentos vieram depois de fazer a variavel piscar.

outra questao q quero ressaltar é porque nao esta passando do case numero 12? a mesmo coisa?

valeu leo. aguardo e nao nos deixe vtrx..

abraço

Link para o comentário
Compartilhar em outros sites

Cria o arquivo Leo;

//////////////////////////////////////////////////////////////////////////////// 
/// DS1307.C ///
/// Driver for Real Time Clock ///
/// ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
/// used when PIC loses power and DS1307 run from 3V BAT ///
/// - Disable squarewave output ///
/// ///
/// ds1307_set_date_time(day,mth,year,dow,hour,mim,sec) Set the date/time ///
/// ///
/// ds1307_get_date(day,mth,year,dow) Get the date ///
/// ///
/// ds1307_get_time(hr,mim,sec) Get the time ///
/// ///
////////////////////////////////////////////////////////////////////////////////
#use i2c(Master,Fast,sda=PIN_C1,scl=PIN_C0)

BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{
BYTE seconds = 0;

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
i2c_stop();
seconds &= 0x7F;

delay_us(3);

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register 0777777777
i2c_write(0x80); // Disable squarewave output pin
i2c_stop();

}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE mim, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;

i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(mim)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x80); // REG 7 - Disable squarewave output pin
i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &mim, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
mim = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;

temp = binary_value;
retval = 0;

while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}

return(retval);
}


// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;

temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;

// Now return: (Tens * 8) + (Tens * 2) + Ones

return(temp + (temp >> 2) + (bcd_value & 0x0f));
}

Link para o comentário
Compartilhar em outros sites

...Existe muitos erros....

A principio pensei que era problema com a drive, mas realmente existem muitos erros, e um deles que nem consegui superar é um comando/função "atcomand void ();". Não sei o que é nem se está certo, portanto simplesmente ignorei.

Seguindo a ideia do vtrx o programa ficou assim:


#use delay(clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
#fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP

#include <input.c>
#include <string.h>
#include <stdio.h>
#include <DS1307.c>
#include <lcd.c>

#define botao_incremento PIN_B0
#define botao_decremento PIN_B1
#define atalho_1 PIN_B2
#define atalho_2 PIN_B3
#define ESC PIN_B6
#define rele1 PIN_B7

int8 _dia,_mes,_ano,_dow,_hora,_mim,_seg,dh1,dm1,dh2,dm2,onoff1,onoff2; //Variaveis que guardam os dados
int8 dados[14];
char dia_semana[7][4]={"dom","seg","ter","qua","qui","sex","sab"};
int modo;

////////////////////
void hora(){


if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_hora++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_hora--;
}

if (_hora > 23 )
{
_hora = 0;
}
//atcomand void (); {
printf(lcd_putc,"\f AJUSTE HORA:\n [%u] : %u : %u",_hora,_mim,_seg);
delay_ms (300);
printf(lcd_putc,"\f AJUSTE HORA:\n [ ] : %u : %u",_mim,_seg);
delay_ms (300);
printf(lcd_putc,"\f AJUSTE HORA:\n [%u] : %u : %u",_hora,_mim,_seg);
delay_ms (300);

}

////////////////////
void minuto(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_mim++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_mim--;
}

if (_mim > 59 )
{
_mim = 0;
}

printf(lcd_putc,"\f AJUSTE MINUTOS:\n %u : [%u] : %u",_hora,_mim,_seg);
delay_ms (300);
printf(lcd_putc,"\f AJUSTE MINUTOS:\n %u : [ ] : %u",_hora,_seg);
delay_ms (300);
printf(lcd_putc,"\f AJUSTE MINUTOS:\n %u : [%u] : %u",_hora,_mim,_seg);
delay_ms (300);

}
////////////////////
void segundo(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_seg++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_seg--;
}

if (_seg > 59 )
{
_seg = 0;
}

printf(lcd_putc,"\f AJUSTE SEGUNDOS:\n %u : %u : [%u]",_hora,_mim,_seg);
delay_ms (300);
printf(lcd_putc,"\f AJUSTE SEGUNDOS:\n %u : %u : [ ]",_hora,_mim);
delay_ms (300);
printf(lcd_putc,"\f AJUSTE SEGUNDOS:\n %u : %u : [%u]",_hora,_mim,_seg);
delay_ms (300);


}


////////////////////
void dia(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_dia++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_dia--;
}

if (_dia > 31 )
{
_dia = 1;
}

if (_dia == 0 )
{
_dia = 31;
}

printf(lcd_putc,"\fAJUSTAR DIA:\n [%u] / %u / %u",_dia,_mes,_ano);
delay_ms (300);
printf(lcd_putc,"\fAJUSTAR DIA:\n [ ] / %u / %u",_mes,_ano);
delay_ms (300);
printf(lcd_putc,"\fAJUSTAR DIA:\n [%u] / %u / %u",_dia,_mes,_ano);
delay_ms (300);

}



////////////////////
void mes(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_mes++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_mes--;
}

if (_mes > 12 )
{
_mes = 1;
}

if (_mes == 0 )
{
_mes = 12;
}

printf(lcd_putc,"\f AJUSTAR MES:\n %u / [%u] / %u",_dia,_mes,_ano);
delay_ms (300);
printf(lcd_putc,"\f AJUSTAR MES:\n %u / [ ] / %u",_dia,_ano);
delay_ms (300);
printf(lcd_putc,"\f AJUSTAR MES:\n %u / %u / %u",_dia,_mes,_ano);
delay_ms (300);

}



////////////////////
void ano(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_ano++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_ano--;
}

if (_ano > 99 )
{
_ano = 1;
}

if (_ano == 0 )
{
_ano = 99;
}

printf(lcd_putc,"\f AJUSTAR ANO:\n %u / %u / [%u]",_dia,_mes,_ano);
delay_ms (300);
printf(lcd_putc,"\f AJUSTAR ANO:\n %u / %u / [ ]",_dia,_mes);
delay_ms (300);
printf(lcd_putc,"\f AJUSTAR ANO:\n %u / %u / [%u]",_dia,_mes,_ano);
delay_ms (300);


}



////////////////////
void semana(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
_dow++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
_dow--;
}

if (_dow > 7 )
{
_dow = 1;
}

if (_dow == 0)
{
_dow = 7;
}

printf(lcd_putc,"\fDIA DA SEMANA:\n %s",dia_semana[_dow-1]);
delay_ms (100);

}



////////////////////
void fdh1(){
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
dh1++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
dh1--;
}

if (dh1 > 23 )
{
dh1 = 0;
}

printf(lcd_putc,"\f ALARME 1:\n [%u] : %u %u",dh1,dm1,onoff1); // talves tenha q declarar os if para tornar a variavel em nome
delay_ms (300);
printf(lcd_putc,"\f ALARME 1:\n [ ] : %u %u",dm1,onoff1); // if (onoff1 == 1) { 1 == ON}
delay_ms (300);
printf(lcd_putc,"\f ALARME 1:\n [%u] : %u %u",dh1,dm1,onoff1);
delay_ms (300);


}



////////////////////
void fdm1(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
dm1++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
dm1--;
}

if (dm1 > 59 )
{
dm1 = 0;
}

printf(lcd_putc,"\f ALARME 1:\n %u : [%u] %u",dh1,dm1,onoff1);
delay_ms (300);
printf(lcd_putc,"\f ALARME 1:\n %u : [ ] %u",dh1,onoff1);
delay_ms (300);
printf(lcd_putc,"\f ALARME 1:\n %u : [%u] %u",dh1,dm1,onoff1);
delay_ms (300);
}



////////////////////
void fonoff1(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
onoff1++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
onoff1--;
}

if (onoff1 > 2 )
{
onoff1 = 1;
}
if (onoff1 == 1)
printf(lcd_putc,"\f ALARME 1:\n %u : %u ON",dh1,dm1);
delay_ms (50);
if (onoff1 == 2)
printf(lcd_putc,"\f ALARME 1:\n %u : %u OFF",dh1,dm1);
delay_ms (50);

write_eeprom (1, dh1);
write_eeprom (2, dm1);
write_eeprom (3, onoff1);
ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}



////////////////////
void fdh2(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
dh2++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
dh2--;
}

if (dh2 > 23 )
{
dh2 = 0;
}

printf(lcd_putc,"\f ALARME 2:\n [%u] : %u %u",dh2,dm2,onoff2);
delay_ms (300);
printf(lcd_putc,"\f ALARME 2:\n [ ] : %u %u",dm2,onoff2);
delay_ms (300);
printf(lcd_putc,"\f ALARME 2:\n [%u] : %u %u",dh2,dm2,onoff2);
delay_ms (300);
}



////////////////////
void fdm2(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
dm2++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
dm2--;
}

if (dm2 > 59 )
{
dm2 = 0;
}

printf(lcd_putc,"\f ALARME 2:\n %u : [%u] %u",dh2,dm2,onoff2);
delay_ms (300);
printf(lcd_putc,"\f ALARME 2:\n %u : [ ] %u",dh2,onoff2);
delay_ms (300);
printf(lcd_putc,"\f ALARME 2:\n %u : [%u] %u",dh2,dm2,onoff2);
delay_ms (300);
}



////////////////////
void fonoff2(){

if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
onoff2++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
onoff2--;
}

if (onoff2 > 2 )
{
onoff2 = 1;
}
if (onoff2 == 1)
{
printf(lcd_putc,"\fALARME2:\n ON",);
}
if (onoff2 ==2)
{
printf(lcd_putc,"\fALARME2:\n OFF",);
}

write_eeprom (4, dh2);
write_eeprom (5, dm2);
write_eeprom (6, onoff2);
ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);
}


void main()
{
output_low(pin_b7);
lcd_init();
delay_ms(50);
ds1307_init();

printf(lcd_putc,"\fRELOGIO");
delay_ms(1000);

while(true)
{
delay_ms(75);
if(input(PIN_b5)) modo ++;
if(input(PIN_b4)) modo --;
if(modo == 0) modo = 20;
if(modo == 21) modo = 1;

switch (modo)
{
case 2:
hora();
break;


case 3:
minuto();
break;


case 4:

segundo();
break;


case 5:
dia();
break;


case 6:
mes();
break;


case 7:
ano();
break;


case 8:
semana();
break;


case 9:
{
fdh1();
break;
}

case 10:
{
fdm1();
break;
}

case 11:
{
fonoff1();
break;
}
case 12:
{
fdh2();
break;
}

case 13:
{
fdm2();
break;
}
case 14 :
{
fonoff2();
break;
}

default:
{
dh1 = read_eeprom(1);
dm1 = read_eeprom(2);
onoff1 = read_eeprom(3);
dh2 = read_eeprom(4);
dm2 = read_eeprom(5);
write_eeprom (6, onoff2);

ds1307_get_time(_hora,_mim,_seg);
ds1307_get_date(_dia,_mes,_ano,_dow);


printf(lcd_putc,"\f%s %02d/%02d/%d \n %02d:%02d:%02d",dia_semana,_dia,_mes,_ano,_hora,_mim,_seg);

}
if (input(esc))
modo=0 ;
if(input(atalho_1))
modo=8;
if(input(atalho_2))
modo=11;

If ((_hora == dh1 ) &&(_mim == dm1))
{
output_high(rele1);
}
else
{
output_low(rele1);
}
delay_ms(500);
If ((_hora == dh2 ) &&(_mim >= dm2))
{
output_high(rele1);
{
output_low(rele1);
}
}
else
{
output_low(rele1);
}
delay_ms(500);

}
}
}

#include <16f877a.h>

Tentei fazer uma versão muito mais simplificada que não envolvia o switch, mas complicou um pouco na parte de fazer o caractér "piscar", ainda não pensei numa forma simples de fazer.

Contudo parece que estou com alguns problemas na drive porque o programa trava sempre que encontra uma função da drive.

Testa e vê quais os resultados.

Link para o comentário
Compartilhar em outros sites

Obrigado LEOPUENA.. achei muito interressante esse tipo de organizaçao desse tipo de progamaçao e claro a organizacao visual.. prometo melhorar o meu tb kkkk

Quanto o comando atcomand void era uma tenativa frustada que visava organizar essa divisao do pic e ao te disponibilizar o arquivo sobrou uma linha linha !

Qt ao rtc vou ajeitando , um ponto importante para faze-lo funcionar, lá no default é chamar assim:

ds1307_get_time(&_hora,&_mim,&_seg);

ds1307_get_date(&_dia,&_mes,&_ano,&_dow);

precisamos ver porque ta lento a resposta ao apertar os botões,

no decorer da simulaçao acontece realmente travadas / bugs , será q na pratica nao acontecerá?

outra duvida é a gravaçao das variaves de alarme na eepron? em que momento gravar e q momento ler p o alarme funcionar coretamente??

valeu

Link para o comentário
Compartilhar em outros sites

O problema não é propriamente os botões, mas sim as funções do RTC. Eu nunca usei um RTC externo e só sei que ele usa i2c para comunicar.

ds1307_get_time(&_hora,&_mim,&_seg);

ds1307_get_date(&_dia,&_mes,&_ano,&_dow);

Outro erro que achei (não tenho certeza se é mesmo um erro) foi o & antes de cada variavel nas funções acima citadas. Olhando para a drive não vem nada disso.

//////////////////////////////////////////////////////////////////////////////// 
/// DS1307.C ///
/// Driver for Real Time Clock ///
/// ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
/// used when PIC loses power and DS1307 run from 3V BAT ///
/// - Disable squarewave output ///
/// ///
/// ds1307_set_date_time(day,mth,year,dow,hour,mim,sec) Set the date/time ///
/// ///
/// [U][B]ds1307_get_date(day,mth,year,dow) [/B] [/U] Get the date ///
/// ///
/// [U][B]ds1307_get_time(hr,mim,sec) [/B] [/U] Get the time ///
/// ///
////////////////////////////////////////////////////////////////////////////////

Link para o comentário
Compartilhar em outros sites

exatamente no drive diz como citaste,

ds1307_get_date(day,mth,year,dow) ds1307_get_time(hr,mim,sec) Get the time
mas na simulaçao os valores ficam totalmente estranhos fora de padrão (ex. 288/12/365), em pesquisas na net vi um topico onde usou
ds1307_get_time(&_hora,&_mim,&_seg);

ds1307_get_date(&_dia,&_mes,&_ano,&_dow);

agora fiquei na duvida!!

e sobre a eeprom posso gravar durante os cases dentro do void x(); e ler a eepron apenas no default?

Link para o comentário
Compartilhar em outros sites

mas na simulaçao os valores ficam totalmente estranhos fora de padrão (ex. 288/12/365), em pesquisas na net vi um topico onde usou

Por isso disse que não sei se é mesmo um erro. Mas programando com o & dava erros.

e sobre a eeprom posso gravar durante os cases dentro do void x(); e ler a eepron apenas no default?

Eu não havia reparado nesse detalhe. Não dei muita importancia na parte final do codigo, mas reparei agora que existem alguns erros.

primeiro a eeprom: pelo que vejo a ideia é memorizar a hora de alarme na eeprom quando é ajustada. não há necessidade de fazer sempre a leitura no default e é um risco gravar aquele ononff2 no default porque pode estoirar a memoria em menos de 1 minuto. E porquê que onoff2 está ser gravado em vez de lido? As leituras podem ser feitas ao iniciar o programa, portanto antes do "while(true)"

If ((_hora == dh1 ) &&(_mim == dm1))
If ((_hora == dh2 ) &&(_mim >= dm2))

Segundo: Podes dar uma explicação da função desses dois testes? a lógica utilizada não me parece correta.

Link para o comentário
Compartilhar em outros sites

1º simulando com & no proteus funciona perfeitamente.

2º exatamente .. quero gravar os horarios de alarmes na eepron depois de ajustada.

3º onoff1 seria a ativaçao da dh1 e dm1 (que seriam hora e minuto do alarme 1)

onoff2 a ativaçao do dh2 e dm2 .... ....... e assim por diante,

vou ter 5 alarmes portanto até onoff5

4º quero gravar na eeprom

void fonoff2(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

onoff2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

onoff2--;

}

if (onoff2 > 2 )

{

onoff2 = 1;

}

if (onoff2 == 1)

{

printf(lcd_putc,"\fALARME2:\n [ON ]",);

}

if (onoff2 ==2)

{

printf(lcd_putc,"\fALARME2:\n [OFF]",);

}

write_eeprom (4, dh2);

write_eeprom (5, dm2);

write_eeprom (6, onoff2);

}

5º foram apenas testes p ver como ficaria melhor para minha utilizaçao

If ((_hora == dh1 ) &&(_mim == dm1))

aqui testei o alarme ficando ligado enquanto despertador = relogio
If ((_hora == dh2 ) &&(_mim >= dm2))
aqui pensei diferente, quero q fique ligado apos chegar a programacao do despertador e só apenas qd recebesse um outro sinal destaivasse a saida :

#define rele1 PIN_B7

Link para o comentário
Compartilhar em outros sites

2º exatamente .. quero gravar os horarios de alarmes na eepron depois de ajustada.

3º onoff1 seria a ativaçao da dh1 e dm1 (que seriam hora e minuto do alarme 1)

onoff2 a ativaçao do dh2 e dm2 .... ....... e assim por diante,

vou ter 5 alarmes portanto até onoff5

A melhor ideia é carregar os valores no inicio. No default deveria trocar "write_eeprom (6, onoff2);" por "onoff2 = read_eeprom(3);", e colocar no inicio.

4º quero gravar na eeprom

Na parte da gravação não há problema.

5º foram apenas testes p ver como ficaria melhor para minha utilizaçao

Ok, mas deves melhoar a parte do segundo teste:

If ((_hora == dh2 ) &&(_mim >= dm2))
{
output_high(rele1);
[COLOR="Red"]{[/COLOR]
output_low(rele1);
[COLOR="red"]}[/COLOR]
}

Da maneira que está o rele se mantém activo por muito pouco tempo (talvez 1us). E aquelas chavetas em vermelho não têm influencia nenhuma.

Link para o comentário
Compartilhar em outros sites

veja se entendi certo sobre gravaçao na eeprom.

a cada void (); eu ja pedi p escrever na eeprom (ou seria nos cases?)

no default fiz as leituras da eepron

obrigado

#include <16f877a.h>

#use delay(clock=4000000)

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

#fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP

#include <input.c>

#include <string.h>

#include <stdio.h>

#include <ds1307.c>

#include <lcd.c>

#define menu PIN_B0

#define menu_volta PIN_B1

#define botao_incremento PIN_B2

#define botao_decremento PIN_B3

#define atalho_1 PIN_B4

#define atalho_2 PIN_B5

#define ESC PIN_B6

#define rele1 PIN_B7

int8 _dia,_mes,_ano,_dow,_hora,_mim,_seg,dh1,dm1,dh2,dm2,onoff1,onoff2;

char dia_semana[7][4]={"dom","seg","ter","qua","qui","sex","sab"};

int modo;

////////////////////

void hora(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_hora++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_hora--;

}

if (_hora > 23 )

{

_hora = 0;

}

printf(lcd_putc,"\f AJUSTE HORA:\n[%02u] : %02u : %02u",_hora,_mim,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE HORA:\n[ ] : %02u : %02u",_mim,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE HORA:\n[%02u] : %02u : %02u",_hora,_mim,_seg);

delay_ms (300);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void minuto(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_mim++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_mim--;

}

if (_mim > 59 )

{

_mim = 0;

}

printf(lcd_putc,"\f AJUSTE MINUTOS:\n%02u : [%02u] : %02u",_hora,_mim,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE MINUTOS:\n %02u : [ ] : %02u",_hora,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE MINUTOS:\n %02u : [%02u] : %02u",_hora,_mim,_seg);

delay_ms (300);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void segundo(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_seg++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_seg--;

}

if (_seg > 59 )

{

_seg = 0;

}

printf(lcd_putc,"\f AJUSTE SEGUNDOS:\n %02u : %02u : [%02u]",_hora,_mim,_seg);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE SEGUNDOS:\n %02u : %02u : [ ]",_hora,_mim);

delay_ms (300);

printf(lcd_putc,"\f AJUSTE SEGUNDOS:\n %02u : %02u : [%02u]",_hora,_mim,_seg);

delay_ms (300);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void dia(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_dia++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_dia--;

}

if (_dia > 31 )

{

_dia = 1;

}

if (_dia == 0 )

{

_dia = 31;

}

printf(lcd_putc,"\fAJUSTAR DIA:\n [%02u] / %02u / %02u",_dia,_mes,_ano);

delay_ms (300);

printf(lcd_putc,"\fAJUSTAR DIA:\n [ ] / %02u / %02u",_mes,_ano);

delay_ms (300);

printf(lcd_putc,"\fAJUSTAR DIA:\n [%02u] / %02u / %02u",_dia,_mes,_ano);

delay_ms (300);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void mes(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_mes++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_mes--;

}

if (_mes > 12 )

{

_mes = 1;

}

if (_mes == 0 )

{

_mes = 12;

}

printf(lcd_putc,"\f AJUSTAR MES:\n %02u / [%02u] / %02u",_dia,_mes,_ano);

delay_ms (300);

printf(lcd_putc,"\f AJUSTAR MES:\n %02u / [ ] / %02u",_dia,_ano);

delay_ms (300);

printf(lcd_putc,"\f AJUSTAR MES:\n %02u / [%02u] / %02u",_dia,_mes,_ano);

delay_ms (300);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void ano(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_ano++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_ano--;

}

if (_ano > 99 )

{

_ano = 1;

}

if (_ano == 0 )

{

_ano = 99;

}

printf(lcd_putc,"\f AJUSTAR ANO:\n %02u / %02u / [%02u]",_dia,_mes,_ano);

delay_ms (300);

printf(lcd_putc,"\f AJUSTAR ANO:\n %02u / %02u / [ ]",_dia,_mes);

delay_ms (300);

printf(lcd_putc,"\f AJUSTAR ANO:\n %02u / %02u / [%02u]",_dia,_mes,_ano);

delay_ms (300);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void semana(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

_dow++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

_dow--;

}

if (_dow > 7 )

{

_dow = 1;

}

if (_dow == 0)

{

_dow = 7;

}

printf(lcd_putc,"\fDIA DA SEMANA:\n [%s]",dia_semana[_dow-1]);

delay_ms (100);

ds1307_set_date_time(_dia,_mes,_ano,_dow,_hora,_mim,_seg);

}

////////////////////

void fdh1(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

dh1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

dh1--;

}

if (dh1 > 23 )

{

dh1 = 0;

}

if (onoff1 ==1){

printf(lcd_putc,"\f ALARME 1:\n [%02u] : %02u ON",dh1,dm1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n [ ] : %02u ON",dm1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n [%02u] : %02u ON",dh1,dm1);

delay_ms (300);

}

if (onoff1 ==2){

printf(lcd_putc,"\f ALARME 1:\n [%02u] : %02u OFF",dh1,dm1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n [ ] : %02u OFF",dm1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n [%02u] : %02u OFF",dh1,dm1);

delay_ms (300);

}

write_eeprom (1, dh1);

}

////////////////////

void fdm1(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

dm1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

dm1--;

}

if (dm1 > 59 )

{

dm1 = 0;

}

if (onoff1 ==1){

printf(lcd_putc,"\f ALARME 1:\n %02u : [%02u] ON",dh1,dm1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n %02u : [ ] ON",dh1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n %02u : [%02u] ON",dh1,dm1);

delay_ms (300);

}

if (onoff1 ==2){

printf(lcd_putc,"\f ALARME 1:\n %02u : [%02u] OFF",dh1,dm1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n %02u : [ ] OFF",dh1);

delay_ms (300);

printf(lcd_putc,"\f ALARME 1:\n %02u : [%02u] OFF",dh1,dm1);

delay_ms (300);

}

write_eeprom (2, dm1);

}

////////////////////

void fonoff1(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

onoff1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

onoff1--;

}

if (onoff1 > 2 )

{

onoff1 = 1;

}

if (onoff1 == 1)

printf(lcd_putc,"\f ALARME 1:\n %02u : %02u [ON ]",dh1,dm1);

delay_ms (50);

if (onoff1 == 2)

printf(lcd_putc,"\f ALARME 1:\n %02u : %02u [OFF]",dh1,dm1);

delay_ms (50);

write_eeprom (3, onoff1);

}

////////////////////

void fdh2(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

dh2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

dh2--;

}

if (dh2 > 23 )

{

dh2 = 0;

}

printf(lcd_putc,"\f ALARME 2:\n [%02u] : %02u %u",dh2,dm2,onoff2);

delay_ms (300);

printf(lcd_putc,"\f ALARME 2:\n [ ] : %02u %u",dm2,onoff2);

delay_ms (300);

printf(lcd_putc,"\f ALARME 2:\n [%02u] : %02u %u",dh2,dm2,onoff2);

delay_ms (300);

write_eeprom (4, dh2);

}

////////////////////

void fdm2(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

dm2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

dm2--;

}

if (dm2 > 59 )

{

dm2 = 0;

}

printf(lcd_putc,"\f ALARME 2:\n %02u : [%02u] %u",dh2,dm2,onoff2);

delay_ms (300);

printf(lcd_putc,"\f ALARME 2:\n %02u : [ ] %u",dh2,onoff2);

delay_ms (300);

printf(lcd_putc,"\f ALARME 2:\n %02u : [%02u] %u",dh2,dm2,onoff2);

delay_ms (300);

write_eeprom (5, dm2);

}

////////////////////

void fonoff2(){

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

onoff2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

onoff2--;

}

if (onoff2 > 2 )

{

onoff2 = 1;

}

if (onoff2 == 1)

{

printf(lcd_putc,"\fALARME2:\n [ON ]",);

}

if (onoff2 ==2)

{

printf(lcd_putc,"\fALARME2:\n [OFF]",);

}

write_eeprom (6, onoff2);

}

void main()

{

output_low(pin_b7);

lcd_init();

delay_ms(50);

ds1307_init();

printf(lcd_putc,"\f RELOGIO");

delay_ms(1000);

while(true)

{

delay_ms(25);

if(input(Menu))

{

modo ++;

}

if(input(Menu_volta))

{

modo --;

}

if(modo < 1)

{

modo = 9;

}

switch (modo)

{

case 2:

hora();

break;

case 3:

minuto();

break;

case 4:

segundo();

break;

case 5:

dia();

break;

case 6:

mes();

break;

case 7:

ano();

break;

case 8:

semana();

break;

case 9:

{

fdh1();

break;

}

case 10:

{

fdm1();

break;

}

case 11:

{

fonoff1();

break;

}

case 12:

{

fdh2();

break;

}

case 13:

{

fdm2();

break;

}

case 14 :

{

fonoff2();

break;

}

default:

{

dh1 = read_eeprom(1);

dm1 = read_eeprom(2);

onoff1 = read_eeprom(3);

dh2 = read_eeprom(4);

dm2 = read_eeprom(5);

onoff2 = read_eeprom(6);

ds1307_get_time(&_hora,&_mim,&_seg);

ds1307_get_date(&_dia,&_mes,&_ano,&_dow);

printf(lcd_putc,"\f%s %02d / %02d / %d \n %02d : %02d : %02d",dia_semana,_dia,_mes,_ano,_hora,_mim,_seg);

}

if (input(esc))

{

modo=0 ;

output_high(pin_b7);

delay_ms(100);

output_low(pin_b7);

delay_ms(100);

}

if(input(atalho_1))

{

modo=8;

}

if(input(atalho_2))

{

modo=11;

}

If ((_hora == dh1 ) &&(_mim == dm1))

{

output_high(rele1);

}

else

{

output_low(rele1);

}

if ((_hora >= dh2 ) &&(_mim >= dm2))

{

output_high(rele1);

}

if (input(pin_c0))

{

output_low(rele1);

}

}

}

}

Link para o comentário
Compartilhar em outros sites

no default fiz as leituras da eepron

Está certo mais ou menos. A leitura da eeprom pode ser feita uma unica vez ao iniciar o programa, portanto todos aqueles comandos "read_eeprom" deveriam estar antes do while(true)

void main()
{
output_low(pin_b7);
lcd_init();
delay_ms(50);
ds1307_init();

[B] dh1 = read_eeprom(1);
dm1 = read_eeprom(2);
dh2 = read_eeprom(4);
dm2 = read_eeprom(5);
onoff1 = read_eeprom(3);
onoff2 = read_eeprom(6);
[/B]

printf(lcd_putc,"\fRELOGIO");
delay_ms(1000);

while(true)
{
.........
.........

default:
{
ds1307_get_time(_hora,_mim,_seg);
ds1307_get_date(_dia,_mes,_ano,_dow);
printf(lcd_putc,"\f%s %02d/%02d/%d \n %02d:%02d:%02d",dia_semana,_dia,_mes,_ano,_hora,_mim,_seg);

}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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