TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gaitan en 14 de Noviembre de 2018, 03:42:28

Título: pic16f877a
Publicado por: gaitan en 14 de Noviembre de 2018, 03:42:28
Buenas amigos de foro:
 bueno programe un reloj con ds1307 y pic 16f877a y muestra en la lcd normalmente pero necesito encender un led cuando llegue a los 11 minutos adjunto el codigo y como lo intente hacer resaltado para que me puedan ayudar, gracias de antemano cualquier colaboracion.

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;

sbit Soft_I2C_Scl at RC3_bit;
sbit Soft_I2C_Sda at RC4_bit;

sbit Soft_I2C_Scl_Direction at TRISC3_bit;
sbit Soft_I2C_Sda_Direction at TRISC4_bit;



unsigned char segundos, segundos10, minutos, minutos10, horas, horas10, date, date10, mes, mes10, year, year10, day;
unsigned int dato,Temp,baja,alta;
float tem;
char txt[16];
//char txt1[16];

void conversor(){
dato=ADC_Read(0);
 delay_mS(250);
 tem=0.244*dato;
 Temp=tem;
 //portb=dato;
 baja=dato&0xff;
 alta=(dato>>8)&0x03;
 }
void transmisor(){
UART1_write(baja);
UART1_write(9);
UART1_write(alta);
UART1_write(13);
UART1_write(10);
  }
void Write_value(char address, char data_){
Soft_I2C_Start();
Soft_I2C_Write(0XD0);//id para escribir 0XD0 para leer es 0XD7
Soft_I2C_Write(address); //direccion de memoria
Soft_I2C_Write(data_); //datos a ingresar
Soft_I2C_Stop();
}

void reiniciar(){
Write_value(0,0X00);//segundos
Write_value(1,0X00);//minutos
Write_value(2,0X00);//horas
Write_value(3,0X00);//day
Write_value(4,0X00);//date
Write_value(5,0X00);//mes
Write_value(6,0X18);//year
Write_value(7,0X00);//control de 1 Hz para config 32678 Hz
Lcd_Out(1,6,":  :"); //hora
Lcd_Out(2,1,"Dia:"); //fecha
}

void display(){
segundos10=(segundos & 0x70)>>4;
segundos = segundos & 0x0F;
if(segundos10>=0x02&&segundos>=0x9){
PORTB.F1=1;
Delay_ms(5000);
PORTB.F1=0;
Delay_ms(5000);

}
if(segundos10>=0x01&&segundos>=0x08){
PORTB.F1=1;
Delay_ms(5000);
PORTC.F1=0;
Delay_ms(5000);
}
[/color]
minutos10=(minutos & 0x70)>>4;
minutos = minutos & 0x0F;
horas10=(horas & 0x30)>>4;
horas = horas & 0x0F;
date10=(date & 0x30)>>4;
date = date & 0x0F;
mes10=(mes & 0x10)>>4;
mes = mes & 0x0F;
year10=(year & 0x0F)>>4;
year = year & 0x0F;



Lcd_Chr(1,11,segundos+48);
Lcd_Chr(1,10,segundos10+48);
Lcd_Chr(1,8,minutos+48);
Lcd_Chr(1,7,minutos10+48);
Lcd_Chr(1,5,horas+48);
Lcd_Chr(1,4,horas10+48);
Lcd_Chr(2,9,date+48);
Lcd_Chr(2,8,date10+48);


}


void main(void) {
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Soft_I2C_Init();

Write_value(0,0X00);//segundos
Write_value(1,0X00);//minutos
Write_value(2,0X00);//horas
Write_value(3,0X00);//day
Write_value(4,0X00);//date
Write_value(5,0X00);//mes
Write_value(6,0X18);//year
Write_value(7,0X00);//control de 1 Hz para config 32678 Hz
Lcd_Out(1,6,":  :"); //hora
Lcd_Out(2,3,"Dia:"); //fecha

ADCON1=0b11000001;
ADC_Init();
UART1_Init(57600);
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
 TRISB.F1=0;
PORTB.F1=0;
while(1){
Delay_us(1000);
PORTC.F0=0;
Delay_us(19000);
Soft_I2C_Start();
Soft_I2C_Write(0xD0); //id
Soft_I2C_Write(0);//posicion 0
Soft_I2C_Start();
Soft_I2C_Write(0xD1);
segundos=Soft_I2C_Read(1);//leer segundos
minutos=Soft_I2C_Read(1);//leer  minutos
horas=Soft_I2C_Read(1);//leer  horas
day=Soft_I2C_Read(1);//leer dias
date=Soft_I2C_Read(1);//leer  date
mes=Soft_I2C_Read(1);//leer meses
year=Soft_I2C_Read(0);//leer  año
Soft_I2C_Stop();
display();
conversor();
transmisor();
intToStr(Temp,txt);
Lcd_Out(2,11,txt);
Lcd_Out(2,10,"T");
delay_mS(500);


}

}
Título: Re:pic16f877a
Publicado por: KILLERJC en 14 de Noviembre de 2018, 08:06:37
Mi pregunta antes de leer todo el codigo...

Sobre el LCD te dice bien la hora ? Si es asi entonces lo tenes ya realizado.
Porque le haces esperar 1 segundo cuando es mayor a 18segundos ?... Peor aun, cuando es mayor a 29, esperas 2 segundos, ya que entra a los 2 if, me refiero a la funcion "display"

De la misma forma que hiciste con esos segundos, pero sin delays :

Código: C
  1. if(minutos10>=0x01&& minutos>=0x01){
  2.   PORTB.F2=1;
  3. } else {
  4.   PORTB.F2=0;
  5. }

Para este caso, cuando minutos sean igual a 11, la salida va a estar en 1, en cualquier otro minuto va a estar en 0.
Título: Re:pic16f877a
Publicado por: gaitan en 14 de Noviembre de 2018, 15:56:47
muchas gracias por el aporte amigo ya esta funcional.