problema de MPLAB XC8 vs MikroC

2

He estado intentando 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ó resultados perfectos. Sin embargo, cuando grabé el programa, el hardware del controlador se negó a mostrar nada. Luego porté el mismo código en MikroC - solo hice un ligero cambio al reemplazar __delay_us y __delay_ms con las rutinas de retardo disponibles en MikroC . Para mi sorpresa, tanto el Proteus como el hardware funcionaron como un encanto.

Estoy confundido de que los bits de configuración son los mismos para MPLAB y MikroC . ¿Dónde está la diferencia? Sospecho que tiene algo que ver con la velocidad de retraso o algo así ...

El código para main es el siguiente porque es lo que yo 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 desde archivos hexadecimales compilados mi MPLAB y MikroC son

    
pregunta Lagrangian

1 respuesta

1

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á desactivado en la captura de pantalla de MicroC ??

Sería más sospechoso que sus tiempos de retardo para la pantalla LCD le estén causando los problemas que ve.

Para solucionar este problema, puede intentar lo siguiente.

A) Cree un programa simple para encender una luz LED y verifique que la frecuencia del parpadeo de la luz sea la misma. Utilice las rutinas de retardo y verifique que funcionen correctamente.
B) Lea detenidamente y vuelva a leer la hoja de datos de su LCD. Un retraso de 100us comparado con 100ms puede hacer una gran diferencia en términos de lograr que la pantalla LCD se muestre correctamente. En su código, parece que se está perdiendo el retraso después de borrar la pantalla. También tenga en cuenta que al reposicionar los retardos del cursor también son necesarios. Los retrasos dependen de la pantalla LCD que está utilizando, pero los tiempos deben respetarse estrictamente. Si no es así, es común que la pantalla LCD no se muestre correctamente.

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

Buena suerte.

    
respondido por el Peter H

Lea otras preguntas en las etiquetas