-

Домашняя страничка Александра Зайцева

   

Ошибки микроконтроллеров PIC18Fxx2


На основе документов 
PIC18FXX2 Rev. B5 Silicon/Data Sheet Errata
PIC18FXX2 Rev. B3/B4 Silicon/Data Sheet Errata
PIC18FXX2 Rev. B2 Silicon/Data Sheet Errata

PIC18FXX2 Rev. B5 Silicon/Data Sheet Errata

На момент подготовки документа все образцы микроконтроллеров имели описанные ниже проблемы.

1. Память программ

В момент выполнения табличной записи возможно искажение данных, если возникает периферийное прерывание. Этот эффект возникает, если разрешены прерывания установкой соответствующих битов в регистрах INTCON и PIE.

Решение

Перед выполнением операции табличной записи отключите все периферийные прерывания. Лучше всего это сделать сбросом всех битов разрешения периферийных прерываний (PIE1, PIE2) и управляющих регистров прерываний (INTCON, INTCON2 и INTCON3). После выполнения табличной записи восстановите значения управляющих регистров прерываний.
 

2. EEPROM память данных

При чтении данных из EEPROM значение в регистре EEDATA может быть искажено во время выполнения второй команды, после установки бита RD в 1 (EECON1 бит 0). Содержимое в прочитанной ячейке EEPROM не искажается.

Решение

Чтобы гарантировать достоверность данных в регистре EEDATA, необходимо прочитать содержимое регистра EEDATA сразу после установки бита RD. Чтение EEDATA может быть выполнено командами MOVF и MOVFF (смотрите пример). Кроме того, при выполнении чтения необходимо запрещать прерывания, поскольку переход на обработку прерываний может тоже исказить данные в регистре EEDATA.

Пример

BCF      INTCON,GIEH 
BSF      EECON1,RD 
MOVF  EEDATA,W 
BSF      INTCON,GIEH
 

3. Прерывания

При использовании двухприоритетной системы прерываний возможен полный пропуск команды программы. Подобный эффект возникает только при выполнении двух следующих условий:

  • Разрешены высокоприоритетные и низкоприоритетные прерывания

  • Высокоприоритетное асинхронное прерывание возникает в следующем цикле после любого низкоприоритетного прерывания

При этом возникает двойная запись в стек, что в конечном счете приведет к его переполнению.

Решение

Два возможных решения представлены ниже, также могут существовать и другие решения этой проблемы.

1. Разрешать только высокоприоритетные прерывания для всех источников, и синхронных и асинхронных.

2. Если необходимо использовать двухприоритетную систему прерываний, то:

  •  назначать для асинхронных прерываний только низкий приоритет (Это не относится к прерыванию INT0, т.к. оно всегда настраивается как высокоприоритетное)

  • назначать синхронные прерывания как высоко- так и низкоприоритетными.
     

4. Ядро (область памяти программ)

Выполнение операций табличного чтения с адресами выше пользовательской памяти программ (адреса выше 1FFFFFh) может привести к получению ошибочных значений при работе на нижней границе температурного диапазона микроконтроллера (-40 гр.С).

Эффект возникает только при обращении к адресам выше 1FFFFFh, включая расположение пользовательского ID (200000h - 200007h), байты конфигурации (300000h - 30000Dh) и идентификатора микроконтроллера (3FFFFEh и 3FFFFFh). 

Область программы пользователя не затронута.

Решение

Два возможных решения представлены ниже, также могут существовать и другие решения этой проблемы.

1. Не использовать операции табличного чтения выше области пользовательской памяти программ при температуре ниже или близкой -40гр.С.

2. Добавить команды NOP (код FFFFh) до и после любых команд табличного чтения. Наиболее оптимальным является 4 команды NOP то табличного чтения и 8 команд NOP после табличного чтения. Число команд NOP может меняться в зависимости от специфики приложения, и должно быть оптимизировано пользователем.
 

5. EEPROM память данных

При чтении данных из EEPROM значение в регистре EEDATA может быть искажено, если бит RD был установлен сразу же за операцией записи адреса в регистр EEADR. Содержимое в прочитанной ячейке EEPROM не искажается.

Решение

Не выполняйте установку бита RD следующей командой за записью адреса в регистр EEADR. Выполните хотя бы одну любую команду перед инициализацией чтения из EEPROM (Вставьте, например, команду NOP). 
 

6. MSSP (все режимы I2C и SPI)

Флаг полного буфера BF (SSPSTAT бит 0) может быть случайно сброшен без чтения регистра SSPBUF. Эффект возникает при выполнении следующих условий:

  • Значение регистр BSR равно 0Fh (BSR 3:0 = 1111) и

  • Выполнена любая команда, содержащая константу C9h в 8-ми младших значащих битах (адрес регистра, данные, смещение адреса и т.д.).

Решение

Все предложенные решения сводятся к установки значения BSR отличного от 0Fh.
К предложенным ниже решениям могут существовать и другие варианты.

1. При написании кода программы или его изменении учитывать следующие требования:

  •  Назначать для всех переменных 12-разрядный адрес. Это позволяет ассемблеру знать, когда может использоваться банк быстрого доступа.

  • Не устанавливайте значение BSR = 0Fh (выбор банка 15)

  • Разрешите ассемблеру самостоятельно управлять битом доступа к быстрому банку. Доступ к банку 15 будет сделан через банк быстрого доступа. Используйте регистр BSR для доступа к регистрам общего назначения.

2. При обращении к младшей части банка 15 необходимо использовать только косвенную адресацию.

3. Если обращение к банку 15 возможен только прямой адресацией (используя регистр BSR) проверьте в листинге программы, что в командах не присутствует константа C9h (8 младших бит константы), когда выбран банк 15 (BSR = 0Fh).
 

7. MSSP (режим ведомого SPI)

В режиме ведомого SPI (SSPM3:SSPM0 = 0100) сигнал управления -SS, формируемый внешним процессором, может быть пропущен микроконтроллером. Замечено, что более быстрые фронты сигнала с большей вероятностью будут пропущены.

Решение

Установите последовательно резистор между формирователем сигнала -SS и микроконтроллером. Номинал резистора зависит от схемотехники устройства и типа микроконтроллера. Рекомендуются провести полный цикл испытаний работы устройства. Возможны и другие решения этой проблемы.
 

8. Ядро (команда DAW)

При выполнении команды DAW может неправильно сброситься в нуль бит переноса CARRY (STATUS бит 0).

Решение

Проверьте состояние бита CARRY перед выполнением команды DAW. Если бит CARRY = 1, добавьте инкремент следующего старшего байта, используя команду INCFSZ (эта команда не влияет на флаги регистра STATUS и не вызовет переполнение математики BCD). После выполнения команды DAW состояние бита CARRY будет соответствовать документации.

Пример

MOVLW 0x80 
ADDLW  0x80 
BTFSC    STATUS,C 
INCFSZ   byte2 
DAW
BTFSC     STATUS,C 
INCFSZ    byte2
Эту последовательность необходимо повторять для каждой команды DAW.
 

9. Генератор таймера TMR1

При переключении с основного источника тактового сигнала на генератор TMR1 микроконтроллер может иметь повышенное энергопотребление.

Решение

Нет
 

PIC18FXX2 Rev. B3/B4 Silicon/Data Sheet Errata

Описанные ниже ошибки исправлены в образцах, выпущенных после 52 недели 2002 года (код на микроконтроллерах 0252)

1. Ядро (память программ)

Примечание. Ошибка относится только к микроконтроллерам PIC18F252 и PIC18F452 с 32кб flash памяти программ и не затрагивает микроконтроллеры PIC18F242 и PIC18F442.

При некоторых условиях выполнение табличного чтения может дать ошибочный результат. Эффект возникает, когда инструкция табличного чтения и читаемая ячейка расположены в разных половинах памяти программ (середина памяти программ 4000h). Табличное чтение выполняется корректно, когда команда и читаемая ячейка расположены в одной и той же части памяти программ.

Решение

Добавьте команду с кодом FFFFh (этот код будет выполнен как пустой цикл NOP) сразу после команды табличного чтения. Использование обычной команды NOP не даст таких же результатов как команда с кодом FFFFh. Возможны и другие решения этой проблемы.
 

2. Ядро (память программ)

Примечание. Ошибка относится только к микроконтроллерам PIC18F252 и PIC18F452 с 32кб flash памяти программ и не затрагивает микроконтроллеры PIC18F242 и PIC18F442.

При некоторых условиях выполнение управляющих команд может привести к непредсказуемым последствиям. Ошибка возникает при переходе через границу середины памяти программ 4000h командами микроконтроллера или по вектору прерывания (CALL, GOTO, RETURN, RETLW, RETFIE).

Кроме того, ошибка может возникнуть, когда прерывание вызывает переход по векторы прерывания через границу 4000h. Не обнаружено никаких проблем при выполнении переходов внутри двух половин памяти программ.

Решение

Три возможных решения представлены ниже, также могут существовать и другие решения этой проблемы. Рекомендуется выполнять одну или несколько представленных рекомендаций:

1. Добавить команду с кодом FFFFh первой для выполнения после переходов CALL или GOTO.

2. Добавить команду с кодом FFFFh в адресах векторов прерываний (0008h b 0018h).

3. Добавить команду с кодом FFFFh сразу после команды возврата (RETURN, RETFIE или RETLW).

Использование обычной команды NOP не даст таких же результатов как команда с кодом FFFFh.
 

PIC18FXX2 Rev. B2 Silicon/Data Sheet Errata

Описанные ниже ошибки исправлены в образцах, выпущенных после 11недели 2002 года (код на микроконтроллерах 0211)

1. Память программ (защита кода программы)

Включение защиты блока памяти программ от считывания программатором автоматически включит защиту от записи командами микроконтроллера для данного блока. В любом защищенном блоке памяти программ заблокированы функции самопрограммирования, используемые, например, в bootloader.

Решение

Не включайте защиту памяти программ для блока, в котором планируется изменять память программ командами табличной записи.
  

Rambler's Top100

Страничка только разрабатывается, поэтому, 
если что не так, то пишите alex-uc@narod.ru

Hosted by uCoz