Soy un iniciador en PIC y he hecho un programa en el compilador pic c para el siguiente problema
Cuando el PIC A0 recibe una entrada de más de 4 v, se convierte en salida digital y se envía a un contador. Cuando el conteo llega a 5, la memoria se incrementa en 1 y se multiplica por 3 y se muestra como costo y se reinicia el contador.
Estos se muestran en una pantalla LCD 16 * 2. siempre que el costo supere los 20, se envía un mensaje a través de sms utilizando un módulo gsm 900 a un número descrito previamente. y, finalmente, el costo se restablece a 0.
He adjuntado un archivo de Word del programa. El problema al que me enfrento es que la pantalla LCD no funciona tan bien como el mensaje no se envía a través del gsm.
Ahora el problema es que el programa funciona bien con el modelo proteus pero en tiempo real no funciona. Incluso la pantalla LCD 16 * 2 no muestra el resultado y no se envía ningún mensaje a través del gsm.
¿Puede alguien ayudarme con este programa y decirme cuáles son los errores que he cometido?
Gracias de antemano. Esperando recibir ayuda.
Este es el programa que hice para PIC 16f877a:
#include"C:\Users\vijay\Desktop\project\Program for\main.h"
#bit lcdrs=0X09.2
#bit lcde=0X09.0
#bit lcdrw=0X09.1
#byte lcddata = 0x8
void lcdinit();
void lcdclear();
void lcdclock();
void lcddly();
void line1();
void line2();
void lcdputc(char c);
//unsigned char disp[16],discou,dl;
void lcddly()
{
delay_ms(1);
}
void lcdxy(char r,char c)
{
if(r==1)
{
lcdrs=0;
lcddata=0x80+c;
lcdclock();
lcdrs=1;
}
else if(r==2)
{
lcdrs=0;
lcddata=0xC0+c;
lcdclock();
lcdrs=1;
}
}
void lcdinit()
{
lcde=0;
lcddata=0x38;
lcdrs=0;
lcdclock();
lcddata=0x14;
lcdclock();
lcddata=0x0c;
lcdclock();
lcddata=0x06;
lcdclock();
lcddata=0x01;
lcdclock();
lcdrs=0;
lcddata=0x80;
lcdclock();
}
void lcdclock()
{
lcde=1;
lcddly();
lcde=0;
lcddly();
}
void lcdclear()
{
lcdrs=0;
lcddata=0x01;
lcdclock();
lcddata=0x0c;
lcdrs=0;
lcdclock();
}
void lcdputc(char c)
{
switch(c)
{
case '\f':
{
lcdrs=0;
lcddata=0x01;
lcdclock();
lcddata=0x0c;
lcdrs=0;
lcdclock();
lcdrs=0;
lcddata=0x80;
lcdclock();
lcdrs=1;
}break;
case '\n':
{
lcdrs=0;
lcddata=0xc0;
lcdclock();
lcdrs=1;
}break;
default:
lcddata=c;
lcdclock();
}
}
int value;
int8 c=0,cost=0,d,u=0,a;
void main()
{
start:
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,127,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_adc_channel(0);
delay_us(20);
set_tris_b(0xFF);
set_tris_d(0X00);
set_tris_e(0X00);
set_tris_a(0xF0);
set_tris_c(0x0F);
lcdinit();
lcdclear();
lcdxy(1,0);
lcdclear();
// for(qw=0;qw<=2;qw++)
while(1)
{
delay_ms(1);
value=read_adc();
lcdinit();
lcdclear();
lcdxy(1,0);
lcdclear();
lcdxy(1,0);
printf(lcdputc, "count:%d",d);
if(value>=31)
{
c++;
d=c;
lcdinit();
lcdclear();
lcdxy(1,0);
lcdclear();
lcdxy(1,0);
//delay_ms(100);
printf(lcdputc, "count:%d",d);
}
if(d>=5)
{
u++;
a=u;
c=0;
cost=(u*3);
lcdinit();
lcdclear();
lcdxy(1,0);
lcdclear();
lcdxy(1,0);
//delay_ms(100);
printf(lcdputc,"Units:%d",a);
printf(lcdputc, " Cost:%d", cost);
goto start;
}
if (cost>=20)
{
//serial_init(9600);
printf("AT\n");
delay_ms(20); // 2 sec delay
printf("AT+CMGF=1\n");
delay_ms(20); // 2 sec delay
printf("AT+CMGS=\"09825858509\"\n");
delay_ms(20); // 2 sec delay
printf ("Cost=%d ", cost); // sends ADC value as SMS
putchar(26); // Ctrl-Z indicates end of SMS and transmit
delay_ms(20); // 2 sec delay
cost=0;
}
else
{
goto start;
}