Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вектор прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
swagger
Добрый день!
Сейчас изучаю модуль mssp, хочу сделать обмен по I2C c внешней памятью. Скачал архив AN734 (http://www.microchip.com), переделал линкер под 16F876a(закомментированые строчки от предыдущего файла)
Код
// File: 16f876a.lkr
// Linker Script file, modified
// Date: 06/07/2000
// Modified 7/18/2000 -.RLF


LIBPATH  .

CODEPAGE   NAME=vectors  START=0x0000   END=0x0004   PROTECTED
CODEPAGE   NAME=page0    START=0x0005   END=0x07FF
CODEPAGE   NAME=page1    START=0x0800   END=0x0FFF
CODEPAGE   NAME=page2    START=0x1000   END=0x17FF
CODEPAGE   NAME=page3    START=0x1800   END=0x1FFF
CODEPAGE   NAME=.idlocs  START=0x2000   END=0x2003   PROTECTED
CODEPAGE   NAME=.config  START=0x2007   END=0x2007   PROTECTED
CODEPAGE   NAME=eedata   START=0x2100   END=0x21FF   PROTECTED


//CODEPAGE   NAME=vectors  START=0x0      END=0x70    PROTECTED
//CODEPAGE   NAME=page0    START=0x71     END=0x7FF
//CODEPAGE   NAME=page1    START=0x800    END=0xFFF    PROTECTED
//CODEPAGE   NAME=.idlocs  START=0x2000   END=0x2003   PROTECTED
//CODEPAGE   NAME=.config  START=0x2007   END=0x2007   PROTECTED

//Special Function Registers in Banks 0-3
DATABANK   NAME=sfr0     START=0x0      END=0x1F     PROTECTED
DATABANK   NAME=sfr1     START=0x80     END=0x9F     PROTECTED
DATABANK   NAME=sfr2     START=0x100    END=0x10F    PROTECTED
DATABANK   NAME=sfr3     START=0x180    END=0x18F    PROTECTED
//General Purpose RAM in Banks 0-3
DATABANK   NAME=gpr0     START=0x20     END=0x6F
DATABANK   NAME=gpr1     START=0xA0     END=0xEF
DATABANK   NAME=gpr2     START=0x110    END=0x16F
DATABANK   NAME=gpr3     START=0x190    END=0x1EF
//General Purpose RAM - available in all banks
SHAREBANK  NAME=gprnobnk START=0x70     END=0x7F
SHAREBANK  NAME=gprnobnk START=0xF0     END=0xFF
SHAREBANK  NAME=gprnobnk START=0x170    END=0x17F
SHAREBANK  NAME=gprnobnk START=0x1F0    END=0x1FF


//DATABANK   NAME=sfr0     START=0x0      END=0x1F     PROTECTED
//DATABANK   NAME=sfr1     START=0x80     END=0x9F     PROTECTED
//DATABANK   NAME=sfr2     START=0x100    END=0x10F    PROTECTED
//DATABANK   NAME=sfr3     START=0x180    END=0x18F    PROTECTED

//DATABANK   NAME=gpr0     START=0x20     END=0x7F
//DATABANK   NAME=gpr1     START=0xA0     END=0xFF


SECTION    NAME=STARTUP  ROM=vectors    // Reset and interrupt vectors
SECTION    NAME=PROG1    ROM=page0      // ROM code space - page0
SECTION    NAME=PROG2    ROM=page1      // ROM code space - page1
SECTION       NAME=IDLOCS   ROM=.idlocs    // ID locations
SECTION    NAME=CONFIG   ROM=.config    // Configuration bits location


и пытаюсь запустить, но МПЛАБ пишет ошибку:

MPLINK 4.11, Linker
Copyright © 2007 Microchip Technology Inc.
Error - section 'INT_VECTOR' can not fit the absolute section. Section 'INT_VECTOR' start=0x00000004, length=0x000001a4
Errors : 1

Как я понимаю, чтото с вектором прерывания. В чем ошибка? Что надо подправить?

Может вообще надо както делать обмен по другому?
swagger
Посмотрел в хелпе, там пишется
Код
Section 'secName' can not fit the absolute section. Section 'secName' start=0xHHHH, length=0xHHHH.
A section which has not been assigned to a memory in the linker command file can not be allocated. Use the -m <mapfile> switch to generate an error map file. The error map will show the sections which were allocated prior to the error. More memory must be made available by adding a CODEPAGE, SHAREBANK, or DATABANK directive, or by removing the PROTECTED attribute, or the number of input sections must be reduced.


вот map файл
Код
MPLINK 4.11, Linker
Linker Error Map File - Created Wed Apr 09 18:49:06 2008

*Warning* - This is only a partial map file due to a link time error.
   Only sections which were allocated prior to the error are shown below.

CODEPAGES:
    Memory      Start        End              Section    Address Size(Bytes)
---------  ---------  ---------            ---------  ---------  ---------
   vectors     0x0000     0x0004                                          

     page0     0x0005     0x07ff                                          

     page1     0x0800     0x0fff                                          

     page2     0x1000     0x17ff                                          

     page3     0x1800     0x1fff                                          

   .idlocs     0x2000     0x2003                                          

   .config     0x2007     0x2007              .config     0x2007     0x0002

    eedata     0x2100     0x21ff                                          


SHAREBANKS:
    Memory      Start        End              Section    Address Size(Bytes)
---------  ---------  ---------            ---------  ---------  ---------
  gprnobnk     0x0070     0x007f                                          

  gprnobnk     0x00f0     0x00ff                                          

  gprnobnk     0x0170     0x017f                                          

  gprnobnk     0x01f0     0x01ff                                          


DATABANKS:
    Memory      Start        End              Section    Address Size(Bytes)
---------  ---------  ---------            ---------  ---------  ---------
      sfr0     0x0000     0x001f                                          

      sfr1     0x0080     0x009f                                          

      sfr2     0x0100     0x010f                                          

      sfr3     0x0180     0x018f                                          

      gpr0     0x0020     0x006f              INT_VAR     0x0020     0x0003

      gpr1     0x00a0     0x00ef             INT_VAR1     0x00a0     0x0001

      gpr2     0x0110     0x016f                                          

      gpr3     0x0190     0x01ef                                          


ACCESSBANKS:

провел эсперимент: изменил адрес вектора прерывания с 004 на 005 - все нормально копмилится. Вывод - этот макрос не подходит для этого контроллера? Или как то можно обойти это?
dac
точно не знаю, на асме уж лет несколько не писал, но кажется нельзя указывать 0х0004 потому что по этому адресу вектор прерывания находится (справедливо для всего семейства PIC16)
blackbit
Вы неправильно отредактировали скрипт - практически не оставили памяти под размещение обработчика прерываний:
CODEPAGE NAME=vectors START=0x0000 END=0x0004 PROTECTED
CODEPAGE NAME=page0 START=0x0005 END=0x07FF
Вот линкер вам и говорит, что не может разместить код обработчика в пределах памяти, выделенной вами под эту секцию. Увеличивайте значение параметра END в этой строке, а следущей сделайте адрес хотя бы на 1 больше в параметре START, поскольку секции vectors и page0 не должны перекрываться.

У вас:
Error - section 'INT_VECTOR' can not fit the absolute section. Section 'INT_VECTOR' start=0x00000004, length=0x000001a4
Не забудьде, что длину секции линкер приводит в байтах, но адресация идет в словах. Значит у вас конечный адрес под секцию обработчика: (0x04+0x1A4/2-1)=0xD5. А начальный адрес следующей секции кода: 0xD6

CODEPAGE NAME=vectors START=0x0000 END=0x00D5 PROTECTED
CODEPAGE NAME=page0 START=0x00D6 END=0x07FF

Это если слово в слово, но если вставите в обработчик прерываний хотя бы еще одну команду, получите ту же ошибку. Поэтому лучше для отладки лучше устанавите размер секции с запасом. Потом подрежете.
swagger
Спасибо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.