Ir ao conteúdo

Dificuldade com programação C CCS(pcw)


RaquelSF

Posts recomendados

Postado

Olá amigos, estou com dificuldade para terminar o programa. Quero que um alarme seja acionado por 15s ao mesmo tempo que um led deve permanecer aceso por 5minutos. Consegui fazer o alarme tocar, mas o led acende e não apaga. Comos vôces podem ver sou iniciante em programação. Basei meu código neste aqui: http://forum.clubedohardware.com.br/resolvido-relogio-ds1307/952470

Meu código:



a#use delay(clock=4000000)

#fuses INTRC_IO,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOMCLR
#use i2c(Master, SDA=PIN_A2, SCL=PIN_A4)

#include <ds1307.c>
#include <senai_lcd.c> //acredito que esta seja a mesma biblioteca MOD_LCD.C

#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#define botao_incremento PIN_A0
#define botao_decremento PIN_A1
#define LED PIN_B2
#define ALARM PIN_A6
#define SELECT PIN_B3
#define F_ALARM PIN_A3
#define ON_OFF PIN_A5
BYTE sec;
BYTE min;
BYTE min1;//minuto alarme
BYTE hrs;
BYTE hrs1;//hora alarme
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;
int8 modo;


char dia_da_semana[7][4]=
{
"DOM",
"SEG",
"TER",
"QUA",
"QUI",
"SEX",
"SAB",
};

#int_ccp1
void trata_ccp1()
{

modo++;
if (modo > 7 )
{
modo = 0;
}
}


void liga_lamp(void){
output_high(LED);
delay_ms(50);

}

void desliga_lamp(void){
output_low(LED);
delay_ms(50);
}

void toca_alarme(void)
{
int i;
if(sec<15){ //toca o alarme por 5s
for(i=0;i<50;i++){
output_high(ALARM);
delay_ms(1);
output_low(ALARM);
delay_ms(1);
}
delay_ms(200);
}


}


void padrão(void){

ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);
printf(lcd_escreve,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d",dia_da_semana[dow-1],hrs,min,sec,day,month,yr);
delay_ms(100);
}

void main()
{
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts (int_ccp1);
enable_interrupts (global);

modo = 0;

ds1307_init();

lcd_ini();
delay_ms(50);

while(true){

switch (modo)
{
case 1:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
hrs++;
}

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

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


printf(lcd_escreve,"\fAjuste Hora:\n%u",hrs);
delay_ms (100);
break;
}

case 2:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
min++;
}

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

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


printf(lcd_escreve,"\fAjust Minutos:\n%u",min);
delay_ms (100);
break;
}

case 3:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
sec++;
}

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

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


printf(lcd_escreve,"\fAjuste Segundos:\n%u",sec);
delay_ms (100);
break;
}

case 4:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
day++;
}

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

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

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

printf(lcd_escreve,"\fDia do Mes:\n%u",day);
delay_ms (100);
break;
}

case 5:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
month++;
}

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

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

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

printf(lcd_escreve,"\fAjuste Mes:\n%u",month);
delay_ms (100);
break;
}

case 6:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
yr++;
}

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

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

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

printf(lcd_escreve,"\fAjuste Ano:\n%u",yr);
delay_ms (100);
break;
}

case 7:
{
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;
}
ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);
printf(lcd_escreve,"\fDia da Semana:\n%s",dia_da_semana[dow-1]);
delay_ms (100);


break;
}

default:
{
padrão();
}


}



//parte do alarme

while(input(F_ALARM)){

if(!input(SELECT)){
delay_ms(75);

if(modo>2) {modo=0;}
switch(modo){

case 1:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
hrs1++;
}

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

if ( hrs1>23 )
{
hrs1=0;


}

printf(lcd_escreve,"\fHora_Al1:\n%u",hrs1);
delay_ms (100);
break;
}

case 2:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
min1++;
}

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

if (min1 > 59 )
{
min1 = 0;

}


printf(lcd_escreve,"\fMin_Al1:\n%u",min1);
delay_ms (100);


break;

}

default:
{

padrão();
}

}


}


}


if(input(ON_OFF)){ //on/off manual do led
delay_ms(75);
output_toggle(pin_b2);
}


if((hrs==hrs1)&&(min==min1)&&(hrs!=0)){ //toca alarme
toca_alarme();
liga_lamp();

}



}

}
#include <16F628a.h>

Postado
Quero que um alarme seja acionado por 15s ao mesmo tempo que um led deve permanecer aceso por 5minutos.

.....tens ai um programa bastante grande só pra isso......


// A FORMA MAIS SIMPLES POSSÍVEL
alarme=1;
output_high(LED);
delay_ms(5000):
output_low(LED);
delay_ms(10000):
alarme=0;

Postado

Leo, Realmente meu código é grande e ficará maior ainda, pois ainda tenho que acrescentar outras funções. Já conseguir resolver o problema de apagar o led em 5 minutos. Obrigada por tentar ajudar.

Quando terminar todo o projeto coloco aqui para ver se os amigos me ajudam a melhora-lo.

Postado

Raquel, você pode apagar o led dessa maneira com a qual o LEOPUENO falou, mas se fizer dessa maneira o programa ficará parado no delay e não executará mais nenhuma função enquanto aguarda os 5 minutos. Se você precisar executar outras tarefas enquanto o led fica aceso, você precisará acionar o recurso de interrupção a partir de estouro de timer. Pelo CCS é relativamente fácil de implementar, diga se for precisar.

Postado
o programa ficará parado no delay e não executará mais nenhuma função enquanto aguarda os 5 minutos. Se você precisar executar outras tarefas enquanto o led fica aceso, você precisará acionar o recurso de interrupção a partir de estouro de timer. Pelo CCS é relativamente fácil de implementar, diga se for precisar.

Amigo, infelizmente não deu certo como o Leo falou, mas consegui fazer funcionar como eu queria por enquanto. Ainda vou executar mais duas tarefas enquanto led fica aceso, porém o 16f628a não tem memória suficiente. Tentei passar todo o código para o 16f877a mas está dando erro no proteus(Simulation is not running in real time due to excessive CPU load).

código:

#include <16F877a.h>

#use delay(clock=4000000)

#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD

#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3)

#include <ds1307.c>

#include <lcd.c>

#define LCD_ENABLE_PIN PIN_D0

#define LCD_RS_PIN PIN_D1

#define LCD_RW_PIN PIN_D2

#define LCD_DATA4 PIN_D4

#define LCD_DATA5 PIN_D5

#define LCD_DATA6 PIN_D6

#define LCD_DATA7 PIN_D7

#define botao_incremento PIN_C6

#define botao_decremento PIN_C7

#define ALARM PIN_C0

#define SELECT PIN_C2

#define LED PIN_C1

#define F_ALARM PIN_B7

#define ON_OFF PIN_C5

BYTE sec,min,hrs,min1,min2,min3,hrs1,hrs2,hrs3,day,month,yr,dow;

int8 modo;

int x,temp=100;

char dia_da_semana[7][4]={"DOM","SEG","TER","QUA","QUI","SEX","SAB"};

#int_ccp1

void trata_ccp1()

{

modo++;

if (modo > 7 )

{

modo = 0;

}

}

void liga_lamp(void){

output_high(LED);

}

void desliga_lamp(void){

output_low(LED);

}

void toca_alarme(void)

{

int i;

if(sec<15){ //toca o alarme por 15s

for(i=0;i<50;i++){

output_high(ALARM);

delay_ms(1);

output_low(ALARM);

delay_ms(1);

}

delay_ms(200);

}

}

//libera ração

void libera_racao(void) //ainda vou implementar

{

}

void padrão(void){

ds1307_get_date(day,month,yr,dow);

ds1307_get_time(hrs,min,sec);

printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/20\%02d",dia_da_semana[dow-1],hrs,min,sec,day,month,yr);

delay_ms(temp);

}

void main()

{

setup_ccp1(CCP_CAPTURE_RE);

enable_interrupts (int_ccp1);

enable_interrupts (global);

modo = 0;

ds1307_init();

lcd_init();

delay_ms(50);

while(true){

if(input(ON_OFF)){ //on/off manual da lâmpada

delay_ms(70);

output_toggle(LED);

}

switch (modo)

{

case 1:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs--;

}

if (hrs > 23 )

{

hrs = 0;

}

printf(lcd_putc,"\fAjuste Hora:\n%u",hrs);

delay_ms (temp);

break;

}

case 2:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min--;

}

if (min > 59 )

{

min = 0;

}

printf(lcd_putc,"\fAjust Minutos:\n%u",min);

delay_ms (temp);

break;

}

case 3:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

sec++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

sec--;

}

if (sec > 59 )

{

sec = 0;

}

printf(lcd_putc,"\fAjuste Segundos:\n%u",sec);

delay_ms (temp);

break;

}

case 4:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

day++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

day--;

}

if (day > 31 )

{

day = 1;

}

if (day == 0 )

{

day = 31;

}

printf(lcd_putc,"\fDia do Mes:\n%u",day);

delay_ms (temp);

break;

}

case 5:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

month++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

month--;

}

if (month > 12 )

{

month = 1;

}

if (month == 0 )

{

month = 12;

}

printf(lcd_putc,"\fAjuste Mes:\n%u",month);

delay_ms (temp);

break;

}

case 6:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

yr++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

yr--;

}

if (yr > 99 )

{

yr = 1;

}

if (yr == 0 )

{

yr = 99;

}

printf(lcd_putc,"\fAjuste Ano:\n%u",yr);

delay_ms (temp);

break;

}

case 7:

{

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;

}

ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);

printf(lcd_putc,"\fDia da Semana:\n%s",dia_da_semana[dow-1]);

delay_ms (temp);

break;

}

default:

{padrão();}

}

//parte do alarme

while(input(F_ALARM)){

if(!input(SELECT)){

delay_ms(75);

if(modo>6) {modo=0;}

switch(modo){

case 1:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs1--;

}

if ( hrs1>23 )

{

hrs1=0;

}

printf(lcd_putc,"\fHora_Al1:\n%u",hrs1);

write_eeprom(1,hrs1);

delay_ms (temp);

break;

}

case 2:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min1--;

}

if (min1 > 59 )

{

min1 = 0;

}

printf(lcd_putc,"\fMin_Al1:\n%u",min1);

write_eeprom(2,min1);

delay_ms (temp);

break;

}

case 3:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs2--;

}

if (hrs2 > 23 )

{

hrs2 = 0;

}

printf(lcd_putc,"\fHora_Al2:\n%u",hrs2);

write_eeprom(3,hrs2);

delay_ms (temp);

break;

}

case 4:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min2--;

}

if (min2 > 59 )

{

min2 = 0;

}

printf(lcd_putc,"\fMin_Al2:\n%u",min2);

write_eeprom(4,min2);

delay_ms (temp);

break;

}

case 5:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs3++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs3--;

}

if ( hrs3>23 )

{

hrs3=0;

}

printf(lcd_putc,"\fHora_Al3:\n%u",hrs3);

write_eeprom(5,hrs3);

delay_ms (temp);

break;

}

case 6:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min3++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min3--;

}

if (min3 > 59 )

{

min3 = 0;

}

printf(lcd_putc,"\fMin_Al3:\n%u",min3);

write_eeprom(6,min3);

delay_ms(temp);

break;

}

default:

{padrão(); }

}

}

}

hrs1=read_eeprom(1);

min1=read_eeprom(2);

hrs2=read_eeprom(3);

min2=read_eeprom(4);

hrs3=read_eeprom(5);

min3=read_eeprom(6);

if((hrs==hrs1 && min==min1 && hrs!=0)|| (hrs==hrs2 && min==min2 && hrs!=0) || (hrs==hrs3 && min==min3 && hrs!=0)){ //condição para ligar alarme e lampada e liberar a ração

toca_alarme();

liga_lamp();//depois de ligada, só desliga manualmente após 1 minuto

libera_racao();

x=min1+5; //soma 5 ao minuto do alarme

continue;

}

if(x==60)x=0; //alarme=55min + 5 =60, min=0

else if(x==61) x=1; //alarme=56+5, min=1

else if(x==62) x=2;

else if(x==63) x=3;

else if(x==64) x=4;

if(min==x){desliga_lamp();} //depois de desligada, só liga manualmente após 1 minuto

}

}

Tem uma modo melhor de deixar o código? Estou achando grande demais.

Obrigada aos que tentarem ajudar!

Postado
Amigo, infelizmente não deu certo como o Leo falou, mas consegui fazer funcionar como eu queria por enquanto. Ainda vou executar mais duas tarefas enquanto led fica aceso, porém o 16f628a não tem memória suficiente. Tentei passar todo o código para o 16f877a mas está dando erro no proteus(Simulation is not running in real time due to excessive CPU load).

código:

#include <16F877a.h>

#use delay(clock=4000000)

#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD

#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3)

#include <ds1307.c>

#include <lcd.c>

#define LCD_ENABLE_PIN PIN_D0

#define LCD_RS_PIN PIN_D1

#define LCD_RW_PIN PIN_D2

#define LCD_DATA4 PIN_D4

#define LCD_DATA5 PIN_D5

#define LCD_DATA6 PIN_D6

#define LCD_DATA7 PIN_D7

#define botao_incremento PIN_C6

#define botao_decremento PIN_C7

#define ALARM PIN_C0

#define SELECT PIN_C2

#define LED PIN_C1

#define F_ALARM PIN_B7

#define ON_OFF PIN_C5

BYTE sec,min,hrs,min1,min2,min3,hrs1,hrs2,hrs3,day,month,yr,dow;

int8 modo;

int x,temp=100;

char dia_da_semana[7][4]={"DOM","SEG","TER","QUA","QUI","SEX","SAB"};

#int_ccp1

void trata_ccp1()

{

modo++;

if (modo > 7 )

{

modo = 0;

}

}

void liga_lamp(void){

output_high(LED);

}

void desliga_lamp(void){

output_low(LED);

}

void toca_alarme(void)

{

int i;

if(sec<15){ //toca o alarme por 15s

for(i=0;i<50;i++){

output_high(ALARM);

delay_ms(1);

output_low(ALARM);

delay_ms(1);

}

delay_ms(200);

}

}

//libera ração

void libera_racao(void) //ainda vou implementar

{

}

void padrão(void){

ds1307_get_date(day,month,yr,dow);

ds1307_get_time(hrs,min,sec);

printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/20\%02d",dia_da_semana[dow-1],hrs,min,sec,day,month,yr);

delay_ms(temp);

}

void main()

{

setup_ccp1(CCP_CAPTURE_RE);

enable_interrupts (int_ccp1);

enable_interrupts (global);

modo = 0;

ds1307_init();

lcd_init();

delay_ms(50);

while(true){

if(input(ON_OFF)){ //on/off manual da lâmpada

delay_ms(70);

output_toggle(LED);

}

switch (modo)

{

case 1:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs--;

}

if (hrs > 23 )

{

hrs = 0;

}

printf(lcd_putc,"\fAjuste Hora:\n%u",hrs);

delay_ms (temp);

break;

}

case 2:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min--;

}

if (min > 59 )

{

min = 0;

}

printf(lcd_putc,"\fAjust Minutos:\n%u",min);

delay_ms (temp);

break;

}

case 3:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

sec++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

sec--;

}

if (sec > 59 )

{

sec = 0;

}

printf(lcd_putc,"\fAjuste Segundos:\n%u",sec);

delay_ms (temp);

break;

}

case 4:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

day++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

day--;

}

if (day > 31 )

{

day = 1;

}

if (day == 0 )

{

day = 31;

}

printf(lcd_putc,"\fDia do Mes:\n%u",day);

delay_ms (temp);

break;

}

case 5:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

month++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

month--;

}

if (month > 12 )

{

month = 1;

}

if (month == 0 )

{

month = 12;

}

printf(lcd_putc,"\fAjuste Mes:\n%u",month);

delay_ms (temp);

break;

}

case 6:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

yr++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

yr--;

}

if (yr > 99 )

{

yr = 1;

}

if (yr == 0 )

{

yr = 99;

}

printf(lcd_putc,"\fAjuste Ano:\n%u",yr);

delay_ms (temp);

break;

}

case 7:

{

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;

}

ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);

printf(lcd_putc,"\fDia da Semana:\n%s",dia_da_semana[dow-1]);

delay_ms (temp);

break;

}

default:

{padrão();}

}

//parte do alarme

while(input(F_ALARM)){

if(!input(SELECT)){

delay_ms(75);

if(modo>6) {modo=0;}

switch(modo){

case 1:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs1--;

}

if ( hrs1>23 )

{

hrs1=0;

}

printf(lcd_putc,"\fHora_Al1:\n%u",hrs1);

write_eeprom(1,hrs1);

delay_ms (temp);

break;

}

case 2:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min1++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min1--;

}

if (min1 > 59 )

{

min1 = 0;

}

printf(lcd_putc,"\fMin_Al1:\n%u",min1);

write_eeprom(2,min1);

delay_ms (temp);

break;

}

case 3:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs2--;

}

if (hrs2 > 23 )

{

hrs2 = 0;

}

printf(lcd_putc,"\fHora_Al2:\n%u",hrs2);

write_eeprom(3,hrs2);

delay_ms (temp);

break;

}

case 4:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min2++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min2--;

}

if (min2 > 59 )

{

min2 = 0;

}

printf(lcd_putc,"\fMin_Al2:\n%u",min2);

write_eeprom(4,min2);

delay_ms (temp);

break;

}

case 5:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

hrs3++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

hrs3--;

}

if ( hrs3>23 )

{

hrs3=0;

}

printf(lcd_putc,"\fHora_Al3:\n%u",hrs3);

write_eeprom(5,hrs3);

delay_ms (temp);

break;

}

case 6:

{

if (input(BOTAO_INCREMENTO))

{

delay_ms (75);

min3++;

}

if (input(BOTAO_DECREMENTO))

{

delay_ms (75);

min3--;

}

if (min3 > 59 )

{

min3 = 0;

}

printf(lcd_putc,"\fMin_Al3:\n%u",min3);

write_eeprom(6,min3);

delay_ms(temp);

break;

}

default:

{padrão(); }

}

}

}

hrs1=read_eeprom(1);

min1=read_eeprom(2);

hrs2=read_eeprom(3);

min2=read_eeprom(4);

hrs3=read_eeprom(5);

min3=read_eeprom(6);

if((hrs==hrs1 && min==min1 && hrs!=0)|| (hrs==hrs2 && min==min2 && hrs!=0) || (hrs==hrs3 && min==min3 && hrs!=0)){ //condição para ligar alarme e lampada e liberar a ração

toca_alarme();

liga_lamp();//depois de ligada, só desliga manualmente após 1 minuto

libera_racao();

x=min1+5; //soma 5 ao minuto do alarme

continue;

}

if(x==60)x=0; //alarme=55min + 5 =60, min=0

else if(x==61) x=1; //alarme=56+5, min=1

else if(x==62) x=2;

else if(x==63) x=3;

else if(x==64) x=4;

if(min==x){desliga_lamp();} //depois de desligada, só liga manualmente após 1 minuto

}

}

Tem uma modo melhor de deixar o código? Estou achando grande demais.

Obrigada aos que tentarem ajudar!

Este aviso que você está vendo no Proteus não é um problema no seu programa muito menos no seu circuito. O proteus apenas está avisando que não está conseguindo rodar a SIMULAÇÃO em tempo real porque o seu CPU não tem capacidade para fazer todos os cálculos a tempo. Quando você colocar pra rodar na realidade, isso não será um problema.

Postado

Obrigada pela informação, amigo burn/omegafire. Ainda não tenho o pic16f877a para testar na prática, mas assim que tiver posto o resultado. O que você achou do código? Sou iniciante e antes deste projeto só tinha feito leds piscarem.

Postado
Obrigada pela informação, amigo burn/omegafire. Ainda não tenho o pic16f877a para testar na prática, mas assim que tiver posto o resultado. O que você achou do código? Sou iniciante e antes deste projeto só tinha feito leds piscarem.

Acho que você está no caminho certo mas não estou entendendo tudo muito bem porque não sei quais são os objetivos de cada função. Se quiser, adicione uns comentários mencionando o qual o seu objetivo em cada função que ficará mais fácil de ajudar.

  • 6 meses depois...
Postado

Olá amigo! Conseguir fazer funcionar, mas ficou muito amador já que só sei o básico da programação.

#include <16F876a.h>

#fuses  XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP,NOCPD
#use delay(clock=4000000)
#define use_portb_lcd TRUE 
#include <lcd.c>
#define LCD_ENABLE_PIN  PIN_B0                                   
#define LCD_RS_PIN      PIN_B1                                    
#define LCD_RW_PIN      PIN_B2                                    
#define LCD_DATA4       PIN_B4                                    
#define LCD_DATA5       PIN_B5                                   
#define LCD_DATA6       PIN_B6                                   
#define LCD_DATA7       PIN_B7 
#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3)
#include <ds1307.c>
 
#define botao_incremento PIN_C6
#define botao_decremento PIN_C7
#define ALARM        PIN_C0   
#define SELECT       PIN_C2
#define RELE_LAMP    PIN_B3
#define F_ALARM      PIN_A2
#define ON_OFF_LAMP  PIN_C5
 
 
 int8 sec,min,hrs,min1,min2,min3,hrs1,hrs2,hrs3,day,month,yr,dow;
 int8 modo;
 int const temp=100;
 int const delay=75;
 int8 x1,x2,x3;
 char dia_da_semana[7][4]={"DOM","SEG","TER","QUA","QUI","SEX","SAB"};
 
#int_ccp1
void trata_ccp1()
{
 
   modo++;
   if (modo > 7  )
   {
      modo = 0;
   }
}
//Protótipos de funções
void liga_lamp(void){ 
 
output_high(RELE_LAMP);
}
 
void desliga_lamp(void){
output_low(RELE_LAMP);
}
 
 
void toca_alarme(void)
{
char i;
if(sec<15){ //toca o alarme por 15s
for(i=0;i<50;i++){
output_high(ALARM);
delay_ms(1);
output_low(ALARM);
delay_ms(1);
}
delay_ms(200);
}
       }
//libera ração
void libera_racao(void) //ainda vou implementar
   {
   if(sec<2){
      output_high(pin_a0);
      delay_ms(1000);
      output_low(pin_a0);
   
      output_high(pin_a1);
      delay_ms(1000);
      output_low(pin_a1);
      
      return;
   }
      }
 
void padrão(void) // Tela principal do LCD
{
 
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);
 
printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d ",dia_da_semana[dow-1],hrs,min,sec,day,month,yr);
delay_ms(temp);
}                
//Programa principal
void main()
{
   
   output_a(0x00);
   setup_ccp1(CCP_CAPTURE_RE);
   enable_interrupts (int_ccp1);
   enable_interrupts (global);
   modo = 0;
   ds1307_init();
   lcd_init();
   delay_ms(30);
 
while(true){ 
 
if(input(ON_OFF_LAMP)){ //on/off manual da lâmpada
      delay_ms(delay);
       output_toggle(RELE_LAMP);
      
                    }
switch (modo)
      {
         case 1:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               hrs++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               hrs--;
            }
            
            if (hrs > 23 )
            {
               hrs = 0;
            }
            
            lcd_gotoxy(1,1);
            printf(lcd_putc,"\fAjuste das Horas:");
            lcd_gotoxy(1,2);
            printf(lcd_putc,"%u",hrs);
            delay_ms (temp);
            break;
         }
         
         case 2:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               min++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               min--;
            }
            
            if (min > 59 )
            {
               min = 0;
            }
       
            
            printf(lcd_putc,"\fAjuste dos\nMinutos:%u",min);            
            delay_ms (temp);
            break;
         }
         
         case 3:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               sec++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               sec--;
            }
            
            if (sec > 59 )
            {
               sec = 0;
            }
        
            
            printf(lcd_putc,"\fAjuste dos\nSegundos:%u",sec);            
            delay_ms (temp);
            break;
         }
         
         case 4:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               day++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               day--;
            }
            
            if (day > 31 )
            {
               day = 1;
            }
            
            if (day == 0 )
            {
               day = 31;
            }
            
            printf(lcd_putc,"\fAjuste do\nDia do Mes:%u",day);            
            delay_ms (temp);
            break;
         }
         
         case 5:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               month++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               month--;
            }
            
            if (month > 12 )
            {
               month = 1;
            }
            
            if (month == 0 )
            {
               month = 12;
            }
            
            printf(lcd_putc,"\fAjuste do\nMes:%u",month);            
            delay_ms (temp);
            break;
         }
         
         case 6:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               yr++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               yr--;
            }
            
            if (yr > 99 )
           {
               yr = 1;
            }
            
            if (yr == 0 )
            {
               yr = 99;
            }
            
            printf(lcd_putc,"\fAjuste do\nAno:%u",yr);            
            delay_ms (temp);
            break;
         }
         
         case 7:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               dow++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               dow--;
            }
            
            if (dow > 7 )
            {
               dow = 1;
            }
            
            if (dow == 0)
            {
               dow = 7;
            }
            ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);
            printf(lcd_putc,"\fAjuste da\nSemana:%s",dia_da_semana[dow-1]);            
            delay_ms (temp);
            
            break;  
         }
       
          default:
          {padrão();}
      
      }
  
//parte do alarme
 
    while(input(F_ALARM)){
 
     if(!input(SELECT)){
          delay_ms(delay);
        
      if(modo>6) {modo=0;}
       switch(modo){
         
         case 1:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               hrs1++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               hrs1--;
            }
            
            if ( hrs1>23 )
            {
              hrs1=0;
              
             
            }
            
            printf(lcd_putc,"\fHora Alarme 1:\n%u",hrs1);  //hora do alarme1
            write_eeprom(1,hrs1);//escreve valor de hrs1 na posição 1 da eeprom
            delay_ms (temp);
            break;
         }
         
         case 2:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               min1++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               min1--;
            }
            
            if (min1 > 59 )
            {
               min1 = 0;
               
            }
              
            
            printf(lcd_putc,"\fMinuto Alarme 1:\n%u",min1); //minuto do alarme1
            write_eeprom(2,min1);
            delay_ms (temp);
            
            
            break;
           
         }
          
          case 3:
          {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               hrs2++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               hrs2--;
            }
            
            if (hrs2 > 23 )
            {
               hrs2 = 0;
            }
            
           
            
            printf(lcd_putc,"\fHora Alarme 2:\n%u",hrs2);//hora alarme2  
            write_eeprom(3,hrs2);
            delay_ms (temp);
            break;
         }
         
         case 4:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               min2++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               min2--;
            }
            
            if (min2 > 59 )
            {
               min2 = 0;
            }
  
            
            printf(lcd_putc,"\fMinuto Alarme 2:\n%u",min2);//minuto alarme2 
            write_eeprom(4,min2);
            delay_ms (temp);
            
           break;
           
         }
         case 5:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               hrs3++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               hrs3--;
            }
            
            if ( hrs3>23 )
            {
              hrs3=0;
              
             
            }
            
            printf(lcd_putc,"\fHora Alarme 3:\n%u",hrs3); //hora alarme3 
            write_eeprom(5,hrs3);
            delay_ms (temp);
            break;
         }
         
         case 6:
         {            
            if (input(BOTAO_INCREMENTO))
            {
               delay_ms (delay);
               min3++;
            }
            
            if (input(BOTAO_DECREMENTO))
            {
               delay_ms (delay);
               min3--;
            }
            
            if (min3 > 59 )
            {
               min3 = 0;
               
            }
              
            
            printf(lcd_putc,"\fMinuto Alarme 3:\n%u",min3); //minuto alarme3
            write_eeprom(6,min3);
            delay_ms(temp); 
            break;
           
         }
         
          default:
          {padrão(); }
                   }
             
    }
    
}
 
//ler valores da eeprom
hrs1=read_eeprom(1);
min1=read_eeprom(2);
hrs2=read_eeprom(3);
min2=read_eeprom(4);
hrs3=read_eeprom(5);
min3=read_eeprom(6);        
 
//condições para ligar alarme e lâmpada e liberar a ração
//hrs!=0 para evitar que as funções sejam executadas quando o relógio não estiver configurado(00:00:00)
if((hrs==hrs1 && min==min1 && hrs!=0)|| (hrs==hrs2 && min==min2 && hrs!=0) || (hrs==hrs3 && min==min3 && hrs!=0))
{
 
 
toca_alarme();
liga_lamp();//depois de ligada, só desliga manualmente após 1 minuto
 
libera_racao();
 
continue;
}
 
x1=min1+5; //soma 5 ao minuto do alarme, variáveis usadas para desligar a lampada após 5 minutos
x2=min2+5;
x3=min3+5;
if((x1==60)||(x2==60)||(x3==60))      {x1=0;x2=0;x2=0;} //alarme=55min + 5 =60, min=0 
else if((x1==61)||(x2==61)||(x3==61)) {x1=1;x2=1;x2=1;} //alarme=56+5, min=1
     else if(x1==62||x2==62||x3==62)  {x1=2;x2=2;x3=2;} 
          else if((x1==63)||(x2==63)||(x3==63)) {x1=3;x2=3;x3=3;} 
               else if(x1==64||x2==64||x3==64)  {x1=4;x2=4;x3=4;}
if(min==x1||min==x2||min==x3){desliga_lamp();} //depois de desligada, só liga manualmente após 1 minuto
 
//Ex.de acionamento do alarme:
//13:55:00 o alarme toca, a lampada acende e a ração é liberada
//Às 13:55:15 o alarme para  de tocar
//Às 14:00:00 a lampada desliga
    }//fim while(true)
}//fim main

  • Coordenador
Postado

Parabéns RaquelSF!,

Mesmo que considere sendo "Amador" seu programa, foi uma conquista!!! :aplausos:  , Tem muito aprendizado  atrás dele!....

Ninguém atinge a perfeição sem antes errar MUITO!!!!...

Parabéns!...

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!