Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

DX168B писал(а):Если есть метод попроще, то можете подсказать.
Как минимум, воспользоваться непрервными кусками. Скажем, символы от 'А' до 'Я' идут подряд по кодам, 0-9 тоже, всякие запятые-скобки хуже, так как тут в таблице не всё, что в Win1251
Как-то так

Код: Выделить всё

        cpi     temp0, '0'
        brlt check_punctuation
        cpi     temp0, '9'+1
        brsh check_alpha
         ; тута цифры
        subi    temp0, '0'
        ldi     ZL, Low( digits*2 )
        ldi     ZH, High( digits*2 )
        rjmp process_code

check_alpha:
        cpi     temp0, 'А'
        brlt not_alpha
        cpi     temp0, 'Я'+1
        brsh not_alpha
         ; тута буквы

        subi    temp0, 'А'
        ldi     ZL, Low( alpha*2 )
        ldi     ZH, High( alpha*2 )
        rjmp process_code

        ...

process_code:
        ldi     temp1, 5
        mul     temp1, temp0
        add     ZL, R0
        adc     ZH, R1
         ; тута в ZH:ZL указатель на начало растра для символа

digits:
       ; кусок знакогенератора для цифр

alpha:
       ; кусок знакогенератора для букв
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Спасибо, попробую. :) :beer:
I am DX168B and this is my favourite forum on internet!
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

upd:
Если внимательно посшивать куски символов с кодами подряд в цепочки и идти начиная с минимальных кодов, то можно ещё немного сократить.
Для упрощения считается, что нужно отобраать только '0'-'9', ':', ';', 'А'-'Я'
Сначала вычитаем '0', если заём (был код меньше '0'), то символ не поддерживается (загрузить указатель знакогенератором пробела или прямоугольничка). Дальше учитываем, что '0' уже вычтен.

Код: Выделить всё

         ; После 9-ки идут ':', ';'
        subi    temp0, '0'
        brcs not_supported_code
        cpi     temp0, ';'-'0'+1    ; '0' был вычтен раньше
        brsh check_alpha
         ; тут вычитать '0' уже не нужно
        ldi     ZL, Low( digits*2 )
        ldi     ZH, High( digits*2 )
        rjmp process_code

check_alpha:
        cpi     temp0, 'А'-'0'   ; '0' был вычтен раньше, CODE - '0' - ('A'-'0') = CODE - 'A'
        brcs not_supported_code  ; между ';' и 'А' ничего нет
        cpi     temp0, 'Я'-'А'+1 ; 'А' было вычтено раньше
        brsh not_supported_code  ; выше 'Я' уже ничего нет
         ; аналогично, вычитать уже не нужно
        ldi     ZL, Low( alpha*2 )
        ldi     ZH, High( alpha*2 )
        rjmp process_code

digits: ; знакогенератор для '0'-'9', ':', ';'

Для большого знакогенератора (там был растр 12*20) было не жалко места и нужно было ускорить работу, так я просто табличку на 256 байт сделал - для каждого символа в табличке индекс его места в знакогенераторе, если символа в знакогенераторе нет, то сразу индекс прямоугольничка. Потом уже индекс множился на нужный размер и добавлялся к адресу начала знакогенератора.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

А где можно табличку символов поискать? Как правильно называется эта кодировка.
Ну, та, по которой компилятор ориентируется.
То есть таблица такая: Символ -> эквивалентное значение в HEX (8бит)
Я когда составлял этот парсер, то применял и латинские буквы вместе с русскими в одном проекте.
Компилятор успешно различил русские и латинские буквы.
I am DX168B and this is my favourite forum on internet!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

А-а-а!!!
Даже не так, а вот так:

Код: Выделить всё

         ; После 9-ки идут ':', ';'
        subi    temp0, '0'
        brcs not_supported_code
        cpi     temp0, ';'-'0'+1    ; '0' был вычтен раньше
        brsh check_alpha
         ; тут вычитать '0' уже не нужно
        rcall process_code ; возврата сюда не будет!!!
         ; знакогенератор для '0'-'9', ':', ';' - так вот сразу после rcall

check_alpha:
        subi     temp0, 'А'-'0'   ; '0' был вычтен раньше, CODE - '0' - ('A'-'0') = CODE - 'A'
        brcs not_supported_code  ; между ';' и 'А' ничего нет
        cpi     temp0, 'Я'-'А'+1 ; 'А' было вычтено раньше
        brsh not_supported_code  ; выше 'Я' уже ничего нет
         ; аналогично, вычитать уже не нужно
        rcall process_code ; возврата сюда не будет!!!
         ; знакогенератор для букв

not_supported_code:
   ldi   ZL, Low( not_supp*2 )
   ldi   ZH, High( not_supp*2 )
        rjmp process_character

process_code:
        ldi     ZL, 5     ; ZL как temp1
        mul     temp0, ZL
        pop     ZH  ; достаём "адрес возврата", который на самом деле адрес знакогенератора
        pop     ZL
        lsl     ZL  ; от слов к байтам
        rol     ZH
        add     ZL, R0
        adc     ZH, R1
process_character:
        ; выводим на индикатор
Если знакогенератор распадается больше, чем на два куска, то pop ZH, pop ZL, lsl ZL, rol ZH займут меньше места, чем два ldi для каждого куска знакогенератора

---
Исправлено, замена описки cpi temp0, 'А'-'0' на subi temp0, 'А'-'0'
Последний раз редактировалось avreal Пт фев 18, 2011 01:18:00, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

DX168B писал(а):А где можно табличку символов поискать? Как правильно называется эта кодировка.

http://ru.wikipedia.org/wiki/CP1251
И для нижней половины http://ru.wikipedia.org/wiki/ASCII
(да, там перед '0' много пунктуации идёт и к цифрам пришиваются в цепочку - я просто из головы не помнил всё по порядку :-) )

Кстати, в том большом знакогенераторе с промежуточной табличкой для одинаковых по начертанию лат и кириллических сомволов индекс был одинаковый и для них был один подмассив в собственно знакогенераторе. При сорока байтах на символ было за что бороться.
Последний раз редактировалось avreal Пт фев 18, 2011 01:08:14, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Так эта кодировка восьмибитная?
Скопировал Ваш пример, позже буду разбирать его. :)
Ещё раз спасибо. :beer:
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

Восьмибитная. То в клетках рядом коды юникода, на них не смотреть.
Строки и столбцы таблицы подписаны. К примеру, буква 'Б' в строке C. колонке .1 Значит код 0xC1
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Вот я нашёл табличку. :)
Теперь смогу сориентироваться. :)

Теперь понял. Спасибо за помощь и за то, что натолкнули на идею. :beer:
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

DX168B писал(а):Если есть метод попроще, то можете подсказать.

Табличный вызов подпрограмм:

Код: Выделить всё

.....
lpm           r16,              Z
adiw          Z,                0x01
lpm           r17,              Z
mov           ZL,               r16
mov           ZH,               r17
.....


... две строчки "лишние"
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Не лишние, это связано с ограничениями в микроконтроллере, под который это писалось.
Ну например для многих МК, строчка adiw Z, 0x01 является лишней, так как можно было записать проще: lpm r16, Z+, но tiny26 это не поддерживает. LPM работает в нём только с парой Z, ijmp и icall тоже работают только с Z. MOVW им тоже не поддерживается.
А где ещё есть лишнее?
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

DX168B писал(а):А где ещё есть лишнее?
... можно было так

Код: Выделить всё

.....
lpm           r16,              Z+
lpm           r31,              Z
mov           ZL,               r16
.....
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Код: Выделить всё

lpm r31, Z

А что? Можно копировать в используемую пару?
Это же равносильно записи:

Код: Выделить всё

lpm ZH, Z

Разве можно так?
Последний раз редактировалось DX168B Пт фев 18, 2011 18:59:34, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

... а разве нет? :)
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

То есть так можно только со старшим байтом и в последнюю очередь. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

... необязательно - можно и с младшим, но при условии, что r31 не изменится (тогда собственно строка lpm r31,Z и не нужна )
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Skyer »

Всем привет. Такая проблема, решил в качестве примера собрать матричную клавиатуру и опрашивать ее 32ой мегой. В Proteuse схема работает как надо, а вот в железе нет, светодиоды просто друг за другом загораются. МК использую на плате, подробнее тут. Код и файл симуляции в аттаче.
Вложения
Test.zip
Файл от протеуса и код проекта
(16.95 КБ) 229 скачиваний
Последний раз редактировалось Skyer Пт фев 18, 2011 22:32:12, всего редактировалось 1 раз.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

Skyer писал(а):... но не знаю как исправить. Помогите кто может.
... вся Ваша программа - "одна большая задержка" :) А если серьезно - используйте прерывание по таймеру, иначе не сможете (не хватит ресурсов МК) сделать в программе ничего "полезного" ИМХО
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Блин, да вы когда-нибудь научитесь вкладывать простыни кода в файлы???
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Skyer »

Можно поподробнее? Я только начал МК изучать, а подавление дребезга видел только на задержках как у меня
Ответить

Вернуться в «AVR»