Necesita ayuda para depurar el programa para la foto 16f877a

-1

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;
        }
    
pregunta user45584

1 respuesta

1

Finalmente, la pregunta subyacente es: ¿cómo realizar la depuración cuando se trabaja en el objetivo real?

Bueno, depende del equipo que tenga alrededor y de los requisitos de su diseño. Algunos diseños pueden funcionar bien cuando se ejecutan paso a paso y se puede usar un depurador en el sitio como el ICD2. No estoy al día con las cosas de los microchips y no sé si el ICD3 es compatible con el 16f877a.

Usando un depurador de este tipo, uno puede ejecutar el código paso a paso y ver qué sucede, si el flujo es correcto e inspeccionar el contenido de cada variable en cualquier momento.

¡PERO!

Algunos diseños no están contentos con la depuración paso a paso:

Por ejemplo, un controlador de motor no estará contento si detiene el código justo en el medio del bucle de control. Bueno, de hecho, al controlador no le importará, pero lo controlado podría destruirse ...

Este es un ejemplo extremo, pero si lo que está conectado a tu MCU es crítico en el tiempo, hace que la depuración utilizando un depurador en el sitio sea más difícil. No imposible, pero más complicado.

Una forma de hacer el trabajo es volver a los viejos tiempos donde los depuradores existían o eran muy caros y usar métodos de ese tiempo:

Por ejemplo:

  • depuración de LED! Solo agregue algunos LED a su diseño y habilítelos de acuerdo con algunas condiciones. Entonces podrá monitorear estas condiciones en tiempo real. Al verificar la sincronización, el LED se puede reemplazar o mantener y conectar en paralelo a un osciloscopio. De esa manera, puede verificar los tiempos de ejecución de su código, registrar tiempos, etc., con muy poco impacto en su código. Pero tenga en cuenta que se requieren algunos ciclos adicionales para alternar los pines de los LED.

  • Depuración de UART. Envíe datos usando un UART a una PC para monitorear las cosas internas. PERO recuerda que el uso del UART puede cambiar drásticamente el tiempo de tu código. Depende de la forma en que implementó su controlador UART: si está basado en interrupciones; utilizando FIFOs o no; Si es una simple función de bloqueo o no. En algún momento (de hecho, a menudo ) su código funcionará con la depuración de UART en su lugar y cuando se eliminen las cosas de depuración, ya no funcionará. Es probable que este sea un problema de sincronización.

respondido por el Blup1980

Lea otras preguntas en las etiquetas