Всем привет! Неделю назад решил поиграться с МК.Понравился случайно увиденный проект http://www.radioparty.ru/device-pic/483-thermometer-pic12f683-nokia3310-lcd. Собрал на хлебной доске,работает.Не нравится оформление на экранчике,особенно реклама давно почившего сайта. Для покорения PICов выбрал язык JAL.Очень приглянулся,простой и понятный даже для такого "полного" новичка,как я.Нагуглил библиотеку в интернетах для работы с экраном Нокиа 3310.И все вроде бы ничего,работает,за одним исключением. В файлике http://www.andremiller.net/download/nokia_3310lcd_jal_2004-03-29.zip три файла библиотек. Один из них,font_5x7.jal,формирует на экранчике символы(у Нокии нет знакогенератора).И в этом то файлике есть ошибка:
Код:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fixed width font, 5 wide, 7 high ;; Will give text resolution of 14 x 6 ;; - Andre Miller
function _font_5x7_table ( byte in H, byte in L ) return byte is assembler local table_start hpage table_start bank H addwf H, w movwf PCLATH bank L movfw PCL addlw 5 addwf L, w skpnc incf PCLATH, f movwf PCL table_start: retlw 0x00 ;; space, 32, 0, 0 retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x00 ;; !, 33, 1, 1 retlw 0x00 retlw 0x2f retlw 0x00
Строчку hpage table_start,она 11я,компилятор считает неправильной.Написан этот кусок на АСМе,но гугл не в курсе что такое hpage.В PICах нет такой команды.Если убрать ее вообще,получается мешанина из линий на экране. Помогите победить,пожалуйста!
Тоже ошибка.Покурив маны к Джалу,обнаружил,что, среди прочего, он поддерживает команду PAGE. Которая,как раз идет в команде с LOCAL. Насколько я понял в силу уровня своей подготовки и знания английского,команда PAGE возвращает значения регистрам после выполнения защищаемого ею участка кода. Исправил,ни фига,весь экран в полосах,ничего не меняется.Может это быть из-за применения МК 12й серии? Может,он физически не может "защищать" регистры. СпойлерWhen all else fails, one can resort to inline assembly. This can be in the form of a single statement: ASM ... or an entire block: ASSEMBLER statements END ASSEMBLER Using assembly should be a last resort -- it is needed only when either a feature is not possible using JALv2 (for example, the TRIS and OPTION codes), or when speed is of the essence. JALv2 includes the entire assembly language set in the PIC16F87x data sheet, several instructions from earlier micro controllers, and several common macros. There is some support for the 16 bit keywords. To guarantee the correct data bank is selected when accessing a file register, use one of the following: BANK opcode ... or BANK f The former takes the file register from the command, the later takes it directly. Similarly, to guarantee the correct page bits are set (for GOTO or CALL), use one of the following: PAGE opcode ... or PAGE lbl Again, the former takes the label from the command, the later takes it directly. Normally, the codes to set or clear the bank or page bits are only generated when necessary. If the bits are already in the correct states, no further commands are generated.
Зарегистрирован: Сб мар 28, 2015 23:06:05 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток! Как я понимаю суть всего кода функции- здесь просто идет переход на нужную точку массива и выдача этой точки наружу. Про защиту массива здесь и слова быть не должно. попробуйте закоментировать строки local table_start , hpage table_start - смысловой нагрузки в них не вижу честно говоря. Похожий код и объяснения к нему есть здесь. Увы в джале не силен , но если вы в нем разобрались - посмотрите как задать массив и склепайте функцию заново-но уже целиком в джале. Полоски какие? вертикальные или горизонтальные? полосатость для котов - штука важная
Зарегистрирован: Сб мар 28, 2015 23:06:05 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток
BOB51 писал(а):
А про МАКРОСЫ ктой-нибудь вспомнил?
В данном месте - это кусок ассемблерного кода, вставленный в другой язык программирования. А в асемблере, для вызова макроса как раз используется команда CALL по моему, но её тут нет . кстати "команда" skpnc - тоже мне подозрительна. смысл всех телодвижений должен складываться в следующее (помоему): возврат значения из массива, где номер возвращаемого элемента равен H+L. могу дать кусок кода в С, но это не тот язык Но возможно я ошибаюсь (давненько не писал на асме) - тогда просветите . возможно автор просто очепятался, перед выкладкой в интернет
Спасибо всем за помощь! Долгое время не мог добраться до компьютера,много работы.Автор действительно очепятался,вместо hpage должен быть page. Но исправление и всякие операции с куском этого кода ни к чему не приводят. Если найду микру,попробую скомпилить для 16ф628.Есть мысль,что 12ф683 просто железно не поддерживает задумку прижимистого автора библиотеки. Задав вопрос в яхугруппе проекта,получил ответ:
- "если ты используешь jallib,то вот тебе библиотека и некоторые примеры".Никто не стал даже смотреть в код и разбираться.
ЗЫ Мне искренне непонятно, зачем авторы кода намеренно делают его нерабочим.Человеку знающему эти писульки ни к чему,он сам себе напишет,это будет быстрее,чем разбираться с чужим кодом.А новичку,типа меня,разобраться,в чем дело,задача практически нереальная подчас.
Зарегистрирован: Сб мар 28, 2015 23:06:05 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток!
ask3t писал(а):
Если найду микру,попробую скомпилить для 16ф628.Есть мысль,что 12ф683 просто железно не поддерживает задумку прижимистого автора библиотеки.
Задав вопрос в яхугруппе проекта,получил ответ: - "если ты используешь jallib,то вот тебе библиотека и некоторые примеры".Никто не стал даже смотреть в код и разбираться. А новичку,типа меня,разобраться,в чем дело,задача практически нереальная подчас.
1. По командам (35 штук) и по программной памяти (2048) 16f628 и 12f683 идентичны. Памяти хватает и эффект будет думаю тот же. Посмотрев еще раз коды и литературку по ассемблеру, предоставленную BOB51 (за что ему огромное спасибо!), я могу только согласиться с BOB51 - hpage - название макроса. 1.1 Для начинаний рекомендую все таки Протеус, а не судорожно жечь железо (был у меня такой опыт), да и поменять в протеусе микруху куда как проще, чем в железе. 2.В общем-то человека понять можно, там все ответы по jallib есть (не по ассемблеру) и даны текстовки библиотек. просто по папке пройтись и посмотреть - там все шрифты лежат и переработано все под чистый jal. У тебя шрифт именно в ассемблере расписан - вот и не хочет человек копаться в чем не знает (или не помнит), и дает по своему мнению ссылку, где все готовенькое и лежит. 3. АТТРАКЦИОН НЕВИДАННОЙ ЩЕДРОСТИ. Раз лень самому разбираться (получить опыт и набить шишки) - пробуем так Спойлерconst byte FONT_5X7_CHARS[] = { 0x00, 0x00, 0x00, 0x00, 0x00, -- sp 0x00, 0x00, 0x2f, 0x00, 0x00, -- ! 0x00, 0x07, 0x00, 0x07, 0x00, -- " 0x14, 0x7f, 0x14, 0x7f, 0x14, -- # 0x24, 0x2a, 0x7f, 0x2a, 0x12, -- $ 0xc4, 0xc8, 0x10, 0x26, 0x46, -- % 0x36, 0x49, 0x55, 0x22, 0x50, -- & 0x00, 0x05, 0x03, 0x00, 0x00, -- ' 0x00, 0x1c, 0x22, 0x41, 0x00, -- ( 0x00, 0x41, 0x22, 0x1c, 0x00, -- ) 0x14, 0x08, 0x3E, 0x08, 0x14, -- * 0x08, 0x08, 0x3E, 0x08, 0x08, -- + 0x00, 0x00, 0x50, 0x30, 0x00, -- , 0x10, 0x10, 0x10, 0x10, 0x10, -- - 0x00, 0x60, 0x60, 0x00, 0x00, -- . 0x20, 0x10, 0x08, 0x04, 0x02, -- / 0x3E, 0x51, 0x49, 0x45, 0x3E, -- 0 0x00, 0x42, 0x7F, 0x40, 0x00, -- 1 0x42, 0x61, 0x51, 0x49, 0x46, -- 2 0x21, 0x41, 0x45, 0x4B, 0x31, -- 3 0x18, 0x14, 0x12, 0x7F, 0x10, -- 4 0x27, 0x45, 0x45, 0x45, 0x39, -- 5 0x3C, 0x4A, 0x49, 0x49, 0x30, -- 6 0x01, 0x71, 0x09, 0x05, 0x03, -- 7 0x36, 0x49, 0x49, 0x49, 0x36, -- 8 0x06, 0x49, 0x49, 0x29, 0x1E, -- 9 0x00, 0x36, 0x36, 0x00, 0x00, -- : 0x00, 0x56, 0x36, 0x00, 0x00, -- ; 0x08, 0x14, 0x22, 0x41, 0x00, -- < 0x14, 0x14, 0x14, 0x14, 0x14, -- = 0x00, 0x41, 0x22, 0x14, 0x08, -- > 0x02, 0x01, 0x51, 0x09, 0x06, -- ? 0x32, 0x49, 0x59, 0x51, 0x3E, -- @ 0x7E, 0x11, 0x11, 0x11, 0x7E, -- A 0x7F, 0x49, 0x49, 0x49, 0x36, -- B 0x3E, 0x41, 0x41, 0x41, 0x22, -- C 0x7F, 0x41, 0x41, 0x22, 0x1C, -- D 0x7F, 0x49, 0x49, 0x49, 0x41, -- E 0x7F, 0x09, 0x09, 0x09, 0x01, -- F 0x3E, 0x41, 0x49, 0x49, 0x7A, -- G 0x7F, 0x08, 0x08, 0x08, 0x7F, -- H 0x00, 0x41, 0x7F, 0x41, 0x00, -- I 0x20, 0x40, 0x41, 0x3F, 0x01, -- J 0x7F, 0x08, 0x14, 0x22, 0x41, -- K 0x7F, 0x40, 0x40, 0x40, 0x40, -- L 0x7F, 0x02, 0x0C, 0x02, 0x7F, -- M 0x7F, 0x04, 0x08, 0x10, 0x7F, -- N 0x3E, 0x41, 0x41, 0x41, 0x3E, -- O 0x7F, 0x09, 0x09, 0x09, 0x06, -- P 0x3E, 0x41, 0x51, 0x21, 0x5E, -- Q 0x7F, 0x09, 0x19, 0x29, 0x46, -- R 0x46, 0x49, 0x49, 0x49, 0x31, -- S 0x01, 0x01, 0x7F, 0x01, 0x01, -- T 0x3F, 0x40, 0x40, 0x40, 0x3F, -- U 0x1F, 0x20, 0x40, 0x20, 0x1F, -- V 0x3F, 0x40, 0x38, 0x40, 0x3F, -- W 0x63, 0x14, 0x08, 0x14, 0x63, -- X 0x07, 0x08, 0x70, 0x08, 0x07, -- Y 0x61, 0x51, 0x49, 0x45, 0x43, -- Z 0x00, 0x7F, 0x41, 0x41, 0x00, -- [ 0x55, 0x2A, 0x55, 0x2A, 0x55, -- 55 0x00, 0x41, 0x41, 0x7F, 0x00, -- ] 0x04, 0x02, 0x01, 0x02, 0x04, -- ^ 0x40, 0x40, 0x40, 0x40, 0x40, -- _ 0x00, 0x01, 0x02, 0x04, 0x00, -- ' 0x20, 0x54, 0x54, 0x54, 0x78, -- a 0x7F, 0x48, 0x44, 0x44, 0x38, -- b 0x38, 0x44, 0x44, 0x44, 0x20, -- c 0x38, 0x44, 0x44, 0x48, 0x7F, -- d 0x38, 0x54, 0x54, 0x54, 0x18, -- e 0x08, 0x7E, 0x09, 0x01, 0x02, -- f 0x0C, 0x52, 0x52, 0x52, 0x3E, -- g 0x7F, 0x08, 0x04, 0x04, 0x78, -- h 0x00, 0x44, 0x7D, 0x40, 0x00, -- i 0x20, 0x40, 0x44, 0x3D, 0x00, -- j 0x7F, 0x10, 0x28, 0x44, 0x00, -- k 0x00, 0x41, 0x7F, 0x40, 0x00, -- l 0x7C, 0x04, 0x18, 0x04, 0x78, -- m 0x7C, 0x08, 0x04, 0x04, 0x78, -- n 0x38, 0x44, 0x44, 0x44, 0x38, -- o 0x7C, 0x14, 0x14, 0x14, 0x08, -- p 0x08, 0x14, 0x14, 0x18, 0x7C, -- q 0x7C, 0x08, 0x04, 0x04, 0x08, -- r 0x48, 0x54, 0x54, 0x54, 0x20, -- s 0x04, 0x3F, 0x44, 0x40, 0x20, -- t 0x3C, 0x40, 0x40, 0x20, 0x7C, -- u 0x1C, 0x20, 0x40, 0x20, 0x1C, -- v 0x3C, 0x40, 0x30, 0x40, 0x3C, -- w 0x44, 0x28, 0x10, 0x28, 0x44, -- x 0x0C, 0x50, 0x50, 0x50, 0x3C, -- y 0x44, 0x64, 0x54, 0x4C, 0x44 -- z }
;; Writes a character to the display procedure print_char_5x7 (byte in letter) is var byte indxl = 0 var byte indxh = 0 var byte offset var byte x
offset = letter - 32 ;; Fix for ascii value
for offset loop _16b_add (0, 5, indxh, indxl) end loop
for 5 loop x = FONT_5X7_CHARS[ (indxh + indxl)] NLCD_Write (x, true) _16b_add (0, 1, indxh, indxl) end loop
NLCD_Write (0, true) ; Add blank space between characters end procedure
;; Writes an inverted character to the display procedure print_char_5x7_i (byte in letter) is var byte indxl = 0 var byte indxh = 0 var byte offset var byte x
offset = letter - 32 ;; Fix for ascii value
for offset loop _16b_add (0, 5, indxh, indxl) end loop
for 5 loop x = FONT_5X7_CHARS[ (indxh + indxl)] x = x ^ 0xFF NLCD_Write (x, true) _16b_add (0, 1, indxh, indxl) end loop
NLCD_Write (0xFF, true) ; Add blank space between characters end procedure это вместо font_5x7.jal , выделенное цветом - мои исправления которые по логике здесь должны быть. Jal - я не знаю (не пинайте) и исправления сделаны по "наитию" после прочтения выданных вам ссылок. 4. Что все таки с полосками? если полоски горизонтальные - проверьте подключение экрана (data и clok могут быть перепутаны) , вертикальные - вероятней шрифты.
Огромное спасибо за проделанный труд. Сразу по библиотекам,предложенным в яхугруппе - они не для маленьких тараканов. Прогнал масенький примерчик в компиляторе, получил out of data space. Чтобы ее использовать,нужно цеплять еще кучу тяжелых библиотек.Плюсы-все работает "из коробки",легко и просто,минусы-жрет агроменное количество ресурсов,коих в данном проекте нехватка жуткая.Так что придется разбираться и набивать шишку.Спасибо еще раз за Ваш труд,о прогрессе буду отписываться. ПС Непонятно,почему JAL так мало известен,отличная среда для начинающих.Я разобрался с основными моментами за один присест,остальное практика и "набивание шишек" =)
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения