Доброго времени суток! Занялся написанием часов/будильника на PIC16F630.. Так вот, при занятых 258 словах памяти программ контроллера всё хорошо, ведет себя как и положено, но стоит только дабавить любую команду в начало исходника, то он начинает отображать не то что надо, в зависимости от места постановки лишнего слова.. Может есть какая-то особенность или секрет, которого я не знаю?
Пишу на ассемблере в MPLAB IDE v8.70 Прошиваю через PICkit 2 Programmer
Вот исходник с 259-й командой NOP в блоке инициализации Собрано на макетной плате: PIC16F630, сдвиговый регистр 74HC595, 4-х разрядный 7-ми сегментный индикатор FYQ-2541AS Схему соединения сейчас нарисую..
И не мудрено. Вы очень вольно обращаетесь с таблицами. И не учитываете, что команда ADDWF PCL не выполняет перенос в старший байт адреса, при переполнении в младшем. У меня для контроля в таких случаях всегда стоял предохранитель:
В даташите этому 2-3 странице посвящено, и насколько помню даже со стрелочками куда какие биты переносятся показано. Даташиты надо изучать, а не хрень самописную всякую. Если программа не сильно объемная, то можно сделать так: в мплабе (если там пишете) ставим
Код:
TABLE1 ORG 0xXXXX ;где XXXX адрес начала страницы памяти команд, смотреть ДШ ADDWF PCL,1 ; RETLW ... ;изымаемые данные ..... RETLW ... ;изымаемые данные
Однако в случае с PICами это утверждение весьма спорно. Сработает только в случае, если у применяемого МК только одна страница памяти программ. Ежли мы имеем дело с МК имеющим более 1 страницы памяти программ, то повылазят дополнительные "подарки" от неучтенного содержимого PCLATH даже при обработке простейших подпрограмм (не говоря уже о таблицах).
Таблица вообще может быть где угодно, хоть кусками в разных местах. Весь это пустопорожний разговор от желания упростить расчет перехода через addwf PCL, f. Универсальный расчет перехода включает в себя вычисление ЗНАЧЕНИЯ для PCL с переносом (переполнения) в PCLATH и лишь затем записью в сам PCL. Это слегка длиннее, но абсолютно универсально.
По выложенному тексту таблица должна находиться в первой странице т.е. в начале программы и заканчиваться не далее 0xFF. Если хотите располагать таблицу в любом месте, то как описал КРАМ. Поиграйте с текстом в MPLAB.
Код:
LIST P=16F630 #INCLUDE <P16F630.INC> ERRORLEVEL -302 __CONFIG 3FF1H ;========= REG EQU 0x20 ;========== ORG 0 CALL TABLE NOP ;================= ORG 220H ; РАСПОЛОЖЕНИЕ В ЛЮБОЙ СТРАНИЦЕ ПАМЯТИ ПРОГРАММ
TABLE MOVLW HIGH TABL ; СТАРШИЙ БАЙТ АДРЕСА ТАБЛИЦЫ MOVWF PCLATH ; В PCLATH MOVF REG,W ; ЗАБИРАЕМ ЧТО НУЖНО ПЕРЕКОДИРОВАТЬ ADDLW LOW TABL ; СКЛАДЫВАЕМ С МЛАДШИМ БАЙТОМ АДРЕСА ТАБЛИЦЫ BTFSC STATUS,C ; ПРОВЕРКА ПЕРЕПОЛНЕНИЯ INCF PCLATH,F ; ЕСТЬ ПЕРЕНОС PCLATH+1 MOVF REG,W ; НЕТ ПЕРЕНОСА.ЗАБИРАЕМ ЧТО НУЖНО ПЕРЕКОДИРОВАТЬ ;================== ADDWF PCL,F ; TABL RETLW B'11000000' ; RETLW B'10011111' ; ; ... END
МММ... Поговорим о "среднемладших"... Исходим из следующего: В большинстве случаев таблица нужна для быстрого преобазования данных и редко превышает 256 байт. Общий объём памяти программ превышает 1 страницу... Возможна работа активных аппаратных перрываний... Поскольку при вызове подпрограммы преобразования по CALL TABLE содержимое PCLATH.4:PCLATH.3 уже автоматически сбрасывается в PCH, то загрузка старшего байта адреса указателя таблицы должна быть выполнена перед вызовом CALL TABLE, а не в самом теле обработчика. Для удобства работы начальную точку желательно размещать на границе областей (0x0000/0xNN00). Следует учесть, что ADDWF PCL,1 при W=0xFF даст "бесконечный цикл"... (если не учитывать перенос в старший разряд при "примитиве" минимальной реализации алгоритма обращения к PCL) Таким образом вводится еще одно ограничение на входные параметры при вызове обработчика. В обработчике прерываний обязательным пунктом будет хранение в программном блоке временных регистров содержимого PCLATH и его последующее восстановление по завершению обработчика прерываний. Пример с дополнительной предобработкой содержимого PCLATH в теле обработчика необходим лишь в случае произвольной точки вхождения в обработчик таблиц в любой точке адресного пространства памяти программ. В большинстве практических применений достаточно предварительное указание старшего байта адреса таблицы, не забывая при том, что исходное (до CALL TABLE) содержимое PCLATH после выполнения RETLW X будет искажено (если не добавить еще один промежуточный регистр временного хранения). Кстати PIC16F630 такие страсти-ужасти практически не угрожают - диапазон адресов не затрагивает PCLATH.4:PCLATH.3 (0x000-0x3FF) да еще при весьма "льготном" режиме доступа ко второму банку РПД. Единственно надо следить за PCLATH.2:PCLATH.1:PCLATH.0, но и это не обязательно, если таблица на границе 256 байтовой области, либо значение в W не превышает 127. Т.е. для 630-го это будет:
REG EQU 0x20 ;========== ORG 0 CALL TABLE NOP ;================= ORG 220H ; РАСПОЛОЖЕНИЕ В ЛЮБОм ; месте памяти программ при разрешенном ; диапазоне значений в W от 0 до 127 (0x00-0x7F) TABLE ADDWF PCL,F ; TABL RETLW B'11000000' ; RETLW B'10011111' ; ; ... END
Если же необходимо использовать страничный механизм, то прийдется сделать такое:
movlw high TABLE movwf PCLATH CALL TABLE _____ TABLE movlw low TABLE addwf reg,w btfsc STATUS,C incf PCLATH,f movwf PCL ну и далее кучка retlw а вот как насчет 0xFF в REG... и дополнительного хранения/восстановления PCLATH - кому надобно - додумывайте.
REG EQU 0x20 ;========== ORG 0 CALL TABLE NOP ;================= ORG 220H ; РАСПОЛОЖЕНИЕ В ЛЮБОм ; месте памяти программ при разрешенном ; диапазоне значений в W от 0 до 127 (0x00-0x7F) TABLE ADDWF PCL,F ; TABL RETLW B'11000000' ; RETLW B'10011111' ; ; ... END
REG EQU 0x20 ;========== ORG 0 CALL TABLE NOP ;================= ORG 220H ; РАСПОЛОЖЕНИЕ В ЛЮБОм ; месте памяти программ при разрешенном ; диапазоне значений в W от 0 до 127 (0x00-0x7F) TABLE ADDWF PCL,F ; TABL RETLW B'11000000' ; RETLW B'10011111' ; ; ... END
BOB51 Не поленись в MPLAB прогнать этот код.
Верно... Зевнул - любая запись весь PCLATH загружает, а старшей двойки там не будет. зато второй пример к месту
Благодарю всех участников данного обсуждения, особо otest за помощь в разрушении "стереотипа ADDWF PCL,f"/подсказку решений относительно особенностей работы с PCL/PCLATH для режимов таблица данных/вычисляемый переход (таблица векторов)!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения