Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.01.2008, 15:09
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Да, эта идея хороша (писал о ней в начале темы ![Улыбка](images/smilies/icon_smile.gif) ) Только вот по быстродействию храмает. Перебирать прийдется все значения из таблиц, да еще и флаг проверять, потом всеравно переход идет, а это еще время, на мой взгляд последний вариант подходящий. Всем спасибо за помощь.
|
|
|
|
09.01.2008, 22:53
|
|
Прохожий
Регистрация: 10.10.2006
Сообщений: 1
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
CALL TABLE ;
;теперь выполнена нужная подпрграмма
TABLE ADDWF PC ;W=смещение
goto M1 ;переход на М1
goto M2 ;переход на М2
Решение для PIC стандартное, но необходимо обязательно отследить два момента:
1) расположение таблицы в памяти программы должно быть таким, чтобы при выполнении ADDWF PC не произошел переход через 0.
2) При вычисляемых переходах используется регистр PCLATH. Не разобравшись с этим механизмом кроме глюков ничего не получишь.
|
|
|
|
09.01.2008, 23:56
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 113
Сказал спасибо: 14
Сказали Спасибо 32 раз(а) в 21 сообщении(ях)
|
Есть такой вариант:
Код:
|
; Подготовка параметров вызова таблицы
TABLE_OP MOVLW high TBL_OP
MOVWF PCLATH
MOVLW low TBL_OP
ADDWF N_OP,W
SKPNC
INCF PCLATH,F
MOVWF PCL ; прямой переход на строку таблицы N:
; Таблица вызовов операций
TBL_OP CALL PROC_ENDMES ; 0
GOTO END_OP
CALL PROC_RST ; 1
GOTO END_OP
CALL PROC_CLS ; 2
GOTO END_OP
CALL PROC_CR ; 3
Обратите внимание на фрагмент:
ADDWF N_OP,W
SKPNC
INCF PCLATH,F |
Здесь реализована проверка, не переходит ли сгенерированное смещение через границу 0xFF и, соответственно, коррекция PCLATH.
P.S. То, что N_OP должен быть умножен на 2 (сдвинут влево), я думаю понятно. Недостаток - можно обработать напрямую только 128 кодов.Я пороюсь в старых asm программах на предмет более ёмкой процедуры, но и в лоб можно разбить множество кодов на две группы ![Улыбка](images/smilies/icon_smile.gif)
C Новым годом !
|
|
|
|
11.01.2008, 18:02
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Интересный код. А есть к нему более подробные описания, с удовольствием возьму на заметку.
|
|
|
|
11.01.2008, 22:57
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 113
Сказал спасибо: 14
Сказали Спасибо 32 раз(а) в 21 сообщении(ях)
|
Сообщение от J-t
|
Интересный код. А есть к нему более подробные описания, с удовольствием возьму на заметку.
|
Спрашивайте конкректно, пожалуйста.
|
|
|
|
13.01.2008, 16:14
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 113
Сказал спасибо: 14
Сказали Спасибо 32 раз(а) в 21 сообщении(ях)
|
Вот ещё примерчик (немного громоздко держать фактически три таблицы: ст.байта адреса символа, мл.байта адреса символа и непосредственно знакогенератор, но ничего, в 16F877 помещалось ![Подмигивание](images/smilies/icon_wink.gif) ). Первые две таблицы можно без всяких премудростей расположить на границе сегментов, напр.
ORG 100h
первая таблица
ORG 200h
вторая таблица
(если, конечно, достаточно 255 символов в знакогенераторе ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) ).
Код:
|
;================================================
; Считывание одной строки матрицы символа ASCII
; IN: N_STR - номер строки (0-8)
; CHAR - внутр. код символа
; OUT: W - байт матрицы
; TEMP: TEMP1, TEMP2
; NOTE: После возврата (RETLW) из "улёта"
; необходимо восстановить PCLATH‹4:3›
; в соответствии с тек. страницей,
; если таблица пересекает границу
;================================================
READ_STR
MOVFW CHAR ; код символа
CALL TBL_CHAR_MSB
MOVWF TEMP1 ; ст. байт адреса матрицы
MOVFW CHAR
CALL TBL_CHAR_LSB ; мл. байт адреса матрицы
ADDWF N_STR,W ; + номер строки
MOVWF TEMP2 ; мл. байт адреса строки
SKPNC ; перешли на сл. страницу ?
INCF TEMP1,F ; да, коррекция ст. байта
RD_STR MOVFW TEMP1
MOVWF PCLATH
MOVFW TEMP2
MOVWF PCL ; и улетели ... , но обещали вернуться
; |
|
|
|
|
13.01.2008, 16:52
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 113
Сказал спасибо: 14
Сказали Спасибо 32 раз(а) в 21 сообщении(ях)
|
Sorry, забыл вставить кусочки самих таблиц:
Код:
|
; ‹первая страница 00h-FFh›
;------------------------------------------------
; Таблица сносок на матрицы символов (lsb)
;------------------------------------------------
TBL_CHAR_LSB
CLRF PCLATH
ADDWF PCL,F
dt low M20, low M21, low M22, low M23, low M24, low M25, low M26, low M27
.................................................. .
; ‹вторая страница - см. org и incf pclath›
;------------------------------------------------
; Таблица сносок на матрицы символов (msb)
;------------------------------------------------
org 100h
TBL_CHAR_MSB
CLRF PCLATH
INCF PCLATH,F
ADDWF PCL,F
dt high M20, high M21, high M22, high M23, high M24, high M25, high M26, high M27
..............................................
; ‹где-то в далёкой-далёкой галактике...›
M20 ;- пробел
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
RETLW B'00000000'
M21 ;- !
RETLW B'00001000'
RETLW B'00011100'
RETLW B'00011100'
RETLW B'00011100'
RETLW B'00011100'
RETLW B'00001000'
RETLW B'00001000'
RETLW B'00000000'
RETLW B'00001000'
......................................... |
|
|
|
|
28.01.2008, 05:09
|
|
Прохожий
Регистрация: 24.07.2005
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
2varostov
хм.. зачем лишние навороты с таблицами адресов
код символа умножаем на 9 (из вашего примера) и адрес у нас в кармане
|
|
|
|
28.01.2008, 15:57
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 113
Сказал спасибо: 14
Сказали Спасибо 32 раз(а) в 21 сообщении(ях)
|
Сообщение от T-34
|
2varostov
хм.. зачем лишние навороты с таблицами адресов
код символа умножаем на 9 (из вашего примера) и адрес у нас в кармане
|
1. Данному куску кода уже лет 11 ![Голова кругом](images/smilies/icon_rolleyes.gif) , и тогда у меня не было ни плавающей, ни тонущей точки ![Улыбка](images/smilies/icon_smile.gif) .
2. Совет дан для начинающих, а в этом случае лучше пусть код будет объёмным, но железно работающим.
|
|
|
|
29.01.2008, 22:39
|
|
Прохожий
Регистрация: 24.07.2005
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
плавающая точка!? 8O
кстати, реорганизовав таблицу знакогенератора (1-ая строка всех символов, 2-ая и т.д.) можно соптимизировать расчет адреса.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:56.
|
|