XC8'de assebmly ve C konudun birlikte kullanımında IDE'nin verdiği hatalar

Başlatan volkii, 05 Ağustos 2022, 10:13:54

volkii

Herkese merhaba,

Elimde bir proje var, benden önceki tasarımcılardan kalan. Proje, bootloader ve application olarak iki projeden oluşuyor. kısaca firmware update yapılabiliyor ama şuan çok önemli değil. Projelerin her ikisinin de main.c kodu C'de yazılmış. Diğer kod dosyaları hep .asm uzantılı. main.C'deki kodlar sadece bu asm dosyalarındaki fonksiyonları çağırıyor.

Projede bazı sorunlar var ve düzeltmem gerekiyor ancak MPLAB X'de derleme esnasında hata alıyorum. MPLAB X C kodunu derleyebiliyor ama işin içine asm girince, kendi ürettiği .i uzantılı dosyalarda (örneğin interrupt.i) hata syntax hatası veriyor. bu .i uzantılı dosyalar, sanırım .asm uzantılı dosyaların clean hali ve IDE tarafından üretiliyor (içeriği birbirine çok benzer), sonra bu dosyalar derleniyor sanırım.

EDİT: MPLAB V6.0'da denedim derleme işini ve bu sefer .i dosyaları değil .asm dosyalarında synax error veriyor.

MCU: 18F46K80
IDE: MPLAB V5.1
XC8: V2.0
 

projelerden birinin main.c içeri aşağıdaki gibidir:
#include <main.h>
#include <timer.h>
#include <interrupt.h>
#include <port.h>
#include <eeprom.h>
#include <spi.h>
#include <can.h>

void __at(0x4020) main(void)
{
    canInit();
    eepromInit();
    timerInit();
    interruptInit();
    do
    {
        portCheckSystemOnOffEvent();
        spiMessageProcess();
        portCheckTurnOn();
        spiMessageProcess();
        timerSystemOn();
        spiMessageProcess();
        timerSystemOff();
        spiMessageProcess();
        timerTurnOnUnit();
        spiMessageProcess();
        spiCheckInitExit();
        spiMessageProcess();
        timerSystemOnDelay();
        spiMessageProcess();
        timerDebugLED();
        spiMessageProcess();
        timerWorkingHour();
        spiMessageProcess();
        timerShutdown();
        spiMessageProcess();
        eepromSaveParameters();
        spiMessageProcess();
        spiCheckTimeOut();
        spiMessageProcess();
    }while(1==1);
}


Bu da projede yer alan .asm dosyalarından birisi:
#include <xc.inc>
#include "global.inc"
#include <timer.inc>
#include <eeprom.inc>
#include <spi.inc>
#include <can.inc>

GLOBAL  _TEMP_W
GLOBAL  _TEMP_STATUS
GLOBAL  _TEMP_BSR
GLOBAL  _main

PSECT   resetProgram, abs, ovrld, class=CODE
ORG 0x4000
resetProgram:
    BRA     0x401C
    NOP
    NOP
    NOP
    GOTO    highISR
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    GOTO    lowISR

PSECT   _interruptInit, class=CODE
GLOBAL  _interruptInit
_interruptInit:
    BSF     IPEN, ACCESS
    BSF     GIEH, ACCESS
    BSF     GIEL, ACCESS
    RETURN  NOFAST

PSECT   highISR, class=CODE
highISR:
    BTFSC   SSPIF, ACCESS
    CALL    spiISR, NOFAST
    RETFIE  FAST

PSECT   lowISR, class=CODE
lowISR:
    MOVFF   WREG, _TEMP_W
    MOVFF   STATUS, _TEMP_STATUS
    MOVFF   BSR, _TEMP_BSR

    BTFSC   CCP2IF, ACCESS
    CALL    timerISR, NOFAST
    BTFSC   EEIF, ACCESS
    CALL    eepromISR, NOFAST
    BTFSC   RXB0IF, ACCESS
    CALL    canISR, NOFAST

    MOVFF   _TEMP_BSR, BSR
    MOVFF   _TEMP_STATUS, STATUS
    MOVFF   _TEMP_W, WREG
    RETFIE  NOFAST
    END











mehmet

Asembler yazımında değişikliler
yapılmış.
Eski versiyon ile derlemeyi deneyin
ya da asm dosyalarını elden geçirin.
Olan olmuştur, olacak olan da olmuştur. Olacak bir şey yoktur. http://www.mehmetbilgi.net.tr

volkii

Yanıt için teşekkür ederim, Bahsettiğiniz IDE versiyonu mu yoksa compiler mı? Ben Microchip dünyasına çok yabancıyım, bu sebeple her türlü kullanışlı ip ucuna açığım. Doğru versiyonu bulmak açısından, proje dosyalarında bir yerlerde IDE'nin veya compilerın versiyonu yazıyor olma ihtimali var mı acaba?

mehmet

Derleyici olmalı. Proreus Proteus üzerinde
gelen versiyonu ile deneyin.
Olan olmuştur, olacak olan da olmuştur. Olacak bir şey yoktur. http://www.mehmetbilgi.net.tr

volkii


volkii

nbproject klasörü altında, configuration.xml dosyasında compiler versiyonu yazıyormuş.

volkii

#6
Çok şükür projeleri derleyebiliyorum. Sadece derleyici değil packet versiyonu da önemliymiş anlaşılan. Eski bir paket yükleyince çalıştı. Düzgün config ayarları aşağıdaki gibidir: