Flash память программ МК PIC18XXXX

Автор: Super User

Все микроконтроллеры семейства  PIC18XXXX  имеют встроенную  энергонезависимую Flash память программ, доступную для чтения, записи и стирания. В отличии от  EEPROM памяти данных, память программ побайтно можно только считать. Запись можно производить только блочно, по 8 байт т.е. записывать нужно не менее 8 байт данных.

 

А операция стирания выполняется блоками по 64 байта.

На время выполнения процесса записи/стирания памяти программ, выполнение текущей программы приостанавливается, пока не закончится цикл записи/стирания (приблизительно 18 мс., выполняется от отдельного таймера). Что конечно вызывает определенные трудности при написание программ, где есть необходимость в точном временном интервале. Вообще в пользовательских программах процесс   записи/стирания   Flash память программ  довольно редкое явление. Очень мало программистов кто этим пользуется и не только из-за приблизительного времени записи/стирания,  но и по количественному ограничению самих процессов до 100 000 циклов. Что не скажешь про операцию чтения Flash память программ, которая наоборот очень часто используется программистами (необходимые данные (шрифт, текстовая информация и др. данные) записанные в Flash память программ на стадии "прошивки" впоследствии передаются при помощи специальной операции  (команды) в память данных).


Чтение памяти программ.

 Для чтения содержимого памяти программ используется инструкция (команда) TBLRD. Она имеет несколько разновидностей, которые мы сейчас рассмотрим:

  • TBLRD*  - происходит чтение  байта таблицы, указанного по адресу регистра TBLPTR (TBLPTRU:TBLPTRH:TBLPTRL), адрес после выполнения не меняется, т.е. при повторном выполнении команды (при условии  адрес TBLPTR программно не менялся) получим те же данные.
  • TBLRD*+ - происходит чтение  байта таблицы, указанного по адресу регистра TBLPTR (TBLPTRU:TBLPTRH:TBLPTRL),после чтения таблицы адрес увеличивается на 1 (инкремент), т.е. при повторном выполнении команды получим значение следующего байта в таблице.
  • TBLRD*- - происходит чтение  байта таблицы, указанного по адресу регистра TBLPTR (TBLPTRU:TBLPTRH:TBLPTRL),после чтения таблицы адрес уменьшается на 1 (декремент), т.е. при повторном выполнении команды получим значение предыдущего  байта в таблице.
  • TBLRD+* - происходит чтение  байта таблицы, указанного по адресу регистра TBLPTR (TBLPTRU:TBLPTRH:TBLPTRL), адрес увеличивается на 1 (преинкремент) перед выполнением команды.

  Результат выполнения команды будет находиться  в регистре TABLAT, который является "посредником" между 16-разрядной памятью программ и 8-разрядной памятью данных. Для доступа к памяти используется указатель TBLPTR  (TBLPTRU:TBLPTRH:TBLPTRL-21 битный указатель), с помощью которого можно обратиться к любому байту адресного пространства памяти программ.

Для удобства можно  указывать метки (названия таблиц ) таблицы данных в памяти программ, воспользовавшись  операторами  low,  high,  upper, в принципе от последнего, (если объем памяти программ не превышает 64 КБ) можно и отказаться, просто сбросив TBLPTRU в "0".

Рассмотрим пример:

У нас есть таблица данных в области памяти программ под  меткой "TEST" и нам необходимо ее прочитать . Для этого задаем указатель TBLPTR:

            clrf           TBLPTRU ; Cбрасываем верхний байт
            movlw       high (TEST); =Задание адреса "TEST"
            movwf          TBLPTRH ;  старшего байта=
            movlw        low (TEST); =Задание адреса "TEST"
            movwf          TBLPTRL ;  младшего байта=

           
Естественно,  если у вас другое название таблиц(и), вместо TEST необходимо написать их названия (метки).

Далее в зависимости от задачи выполняем  подпрограммы (ПП) чтения, как показано здесь...

Важно:

Если таблица данных состоит из нескольких строк, то  количество байт в каждой строке, кроме последней строки, должны быть четными.  Это объясняется тем, что  память программ 16-разрядная (2 байта), а  строки в MPLAB  всегда начинается соответственно с четного адреса. Прочитав младший байт, мы перескочили старший (нечетный). Но во время инкремента (декремента) этот байт будет считываться, что приведет к ошибке. Надеюсь, понятно объяснил....

Если что не понятно, то можно посмотреть видеоурок по теме.....

Переходим к рассмотрению записи в память программ.


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2014 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru