Problem zwischen MPLAB XC8 und MikroC

Ich habe versucht, ein Programm für LCD auf zu schreiben PIC18f452. Ich habe eine Bibliothek gefunden und daran gearbeitet, und MPLAB XC8 hat sie erfolgreich kompiliert. Ich habe es in ISIS getestet und es zeigte eine perfekte Ausgabe. Als ich das Programm jedoch brannte, weigerte sich die Controller-Hardware, etwas anzuzeigen. Dann habe ich den gleichen Code in portiert MikroC- nur eine geringfügige Änderung des Ersetzens __delay_usund __delay_msmit verfügbaren Verzögerungsroutinen in vorgenommen MikroC. Zu meiner Überraschung wirkten sowohl der Proteus als auch die Hardware wie ein Zauber.

Ich bin verwirrt, dass die Konfigurationsbits für und gleich MPLABsind MikroC. Wo liegt der Unterschied? Ich vermute, es hat etwas mit der Verzögerungsgeschwindigkeit oder so zu tun ...

Code für main ist wie folgt, weil es die Sache ist, die ich ändere

#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;
        }


}

Config-Bits, die von PICkit2 aus Hex-Dateien gesehen werden, die mein MPLAB und MikroC kompiliert haben

Geben Sie hier die Bildbeschreibung ein

Danke. Ist Ihr Oszillator 8MHz (und nicht kaputt)?
Ja, es sind 8 MHz und nicht kaputt. Wenn es kaputt wäre, würde es für die MikroC-Version nicht funktionieren. Es funktioniert für mikroC hex mit demselben Code, aber nicht für die MPLAB-Version

Antworten (2)

Der von Ihnen bereitgestellte Screenshot der Konfigurationsbits zeigt eine Abweichung. Config 4 Bit 2, das das Low Voltage ICSP Enable-Bit ist, ist auf dem MicroC-Screenshot deaktiviert??

Ich würde eher vermuten, dass Ihre Verzögerungszeiten für den LCD-Bildschirm Ihnen die Probleme bereiten, die Sie jedoch sehen.

Um dieses Problem zu debuggen, können Sie Folgendes versuchen.

A) Erstellen Sie ein einfaches Programm zum Blinken einer LED-Leuchte und überprüfen Sie, ob die Blinkfrequenz der Leuchte gleich ist. Verwenden Sie die Verzögerungsroutinen und überprüfen Sie, ob sie richtig funktionieren.
B) Lesen Sie Ihr LCD-Datenblatt sorgfältig und erneut. Eine Verzögerung von 100 us im Vergleich zu 100 ms kann einen großen Unterschied machen, wenn es darum geht, dass das LCD korrekt angezeigt wird. In Ihrem Code scheint Ihnen die Verzögerung nach dem Löschen der Anzeige zu fehlen. Beachten Sie auch, dass beim Neupositionieren des Cursors auch Verzögerungen erforderlich sind. Die Verzögerungen sind abhängig vom verwendeten LCD, die Timings müssen jedoch strikt eingehalten werden. Ist dies nicht der Fall, wird das LCD häufig nicht korrekt angezeigt.

Wenn Sie überprüfen können, ob die Uhren für MicroC und MPLAB XC8 mit der gleichen Frequenz laufen, können wir die Konfigurationsbits eliminieren und Sie können sich mehr auf die Anpassung des LCD-Codes konzentrieren.

Viel Glück.

Schalten Sie die Niederspannungsprogrammierung aus und programmieren Sie den Chip neu. Dies sollte das Problem lösen

#pragma config LVP = ON

Zu

#pragma config LVP = OFF