Problema MPLAB XC8 vs MikroC

He estado tratando de escribir un programa para LCD en PIC18f452. Encontré una biblioteca y trabajé en ella y MPLAB XC8 la compiló con éxito. Lo probé en ISIS y mostró un resultado perfecto. Sin embargo, cuando quemé el programa, el hardware del controlador se negó a mostrar nada. Luego porté el mismo código MikroC, solo hice un ligero cambio de reemplazo __delay_usy __delay_mscon las rutinas de retraso disponibles en MikroC. Para mi sorpresa, el Proteus y el hardware funcionaron a la perfección.

Estoy confundido de que los bits de configuración sean iguales para ambos MPLABy MikroC. ¿Dónde está la diferencia? Sospecho que tiene algo que ver con la velocidad de retardo más o menos...

El código para main es el siguiente porque es lo que cambio

#include <xc.h>
#include <p18f452.h>
#include "lcd.h"

#define _XTAL_FREQ 8000000L


// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (HS oscillator)
#pragma config OSCS = OFF       // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source))

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = ON         // Brown-out Reset Enable bit (Brown-out Reset enabled)
#pragma config BORV = 20        // Brown-out Reset Voltage bits (VBOR set to 2.0V)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 128      // Watchdog Timer Postscale Select bits (1:128)

// CONFIG3H
#pragma config CCP2MUX = ON     // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1)

// CONFIG4L
#pragma config STVR = ON        // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET)
#pragma config LVP = ON         // Low Voltage ICSP Enable bit (Low Voltage ICSP enabled)

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000200-001FFFh) not code protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000200-001FFFh) not write protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) not write protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) not write protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) not write protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks)


//Simple Delay Routine
void Wait(unsigned int delay)
{
    for(;delay;delay--)
        __delay_us(100);
}

void main()
{
    //Let the Module start up
    Wait(500);
        PORTD = 0x00;
        TRISD = 0x00;

    //Initialize the LCD Module
    LCDInit(LS_BLINK);

    //Clear the Module
    LCDClear();

    //Write a string at current cursor pos
    LCDWriteString("F**k Yeh!!");

    Wait(20000);

    //Now Clear the display
    LCDClear();

    LCDWriteString("God Bless all !!");

    //Goto POS (X=0,Y=1 i.e. Line 2)
    //And Write a string
    LCDWriteStringXY(5,1,"<**************>");

    Wait(20000);

    //Write Some Numbers
    for(char i=0;i<100;i++)
    {
            LCDClear();
            LCDWriteInt(i,3);
            Wait(3000);
    }

    LCDClear();
    LCDWriteString("    The  End    ");

    //Loop Forever
    while(1)
        {
            PORTD = ~PORTD;
        }


}

Los bits de configuración vistos por PICkit2 de los archivos hexadecimales compilados en mi MPLAB y MikroC son

ingrese la descripción de la imagen aquí

Gracias. ¿Su oscilador es de 8 MHz (y no está roto)?
Sí, es de 8 mhz y no está roto. Si estuviera roto, no funcionaría para la versión MikroC. funciona para mikroC hex del mismo código pero no para la versión MPLAB

Respuestas (2)

La captura de pantalla que ha proporcionado de los bits de configuración muestra una variación. Config 4 Bit 2, que es el bit de habilitación ICSP de bajo voltaje, ¿está deshabilitado en la captura de pantalla de MicroC?

Sin embargo, sería más sospechoso que sus tiempos de retraso para la pantalla LCD le estén causando los problemas que está viendo.

Para depurar este problema, puede intentar lo siguiente.

A) Cree un programa simple para hacer parpadear una luz LED y verifique que la frecuencia de parpadeo de la luz sea la misma. Utilice las rutinas de retardo y verifique que funcionen correctamente.
B) Lea atentamente y vuelva a leer la hoja de datos de su LCD. Un retraso de 100us en comparación con 100ms puede marcar una gran diferencia en términos de que la pantalla LCD se muestre correctamente. En su código, parece que le falta el retraso después de borrar la pantalla. También tenga en cuenta que al reposicionar el cursor también se requieren retrasos. Los retrasos dependen de la pantalla LCD que esté utilizando, pero los tiempos deben cumplirse estrictamente. De lo contrario, es común que la pantalla LCD no se muestre correctamente.

Si puede verificar que los relojes funcionan a la misma frecuencia para MicroC y MPLAB XC8, podemos eliminar los bits de configuración y podrá concentrar más sus esfuerzos en ajustar el código LCD.

Buena suerte.

Apague la programación de bajo voltaje y reprograme el chip. esto deberia resolver el problema

#pragma config LVP = ON

A

#pragma config LVP = OFF