roboforum.ru

Технический форум по робототехнике.

 

Преобразования 16 bit to 5 digit ASCII

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Angel71 » 03 авг 2013, 01:27

а ещё лучше на перфокартах обычной почтой. :) есть dropbox и куча других нормальных сервисов, зачем емыло для обмена файлами?
Аватара пользователя
Angel71
 
Сообщения: 9227
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 03 авг 2013, 01:51

arm-17 писал(а):Не получается добавить программу можно я на Mail скину

Здесь не все расширения файлов разрешены, переименуй расширение своего файла в pdf
Ты уже на эти грабли наступал, когда пытался мой файл открыть...

Добавлено спустя 1 минуту 26 секунд:
Ангел, хватит человека пугать, не видишь он педали путает? Все были такими :)
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Angel71 » 03 авг 2013, 02:23

я не пугаю, просто почта для обмена файлами не очень удобная штука, да и доставки/не попадание в спам не гарантировано (особо приятно, если не с сайта почту смотришь, а в почтовом клиенте) + у каждой почты свои завихи (как минимум размер или расширение файлов). :oops: в общем, как будет время, рекомендую присмотреться к альтернативам.
Аватара пользователя
Angel71
 
Сообщения: 9227
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 03 авг 2013, 03:54

Вот программа. С прерываниями все понятно. А главный вопрос как число 9999 до 0 преобразовать для отображение в LCD c помощью bin16ASCII15? Как подставить допустим число 35?
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 04 авг 2013, 05:19

Хм, посмотрел...
А зачем ты заменил:
.include "2313def.inc"
на
.include file "C:\AVR\AvrAssembler2\Appnotes\tn2313def.inc"
???
2313def.inc стандартный файл, зачем его менять на экзотику? Как ты понимаешь у меня по твоему пути нет такого файла, соотв. студия выдает ошибку при компиляции. Я поменял обратно...

А зачем ты дал русское название своей программе? Это плохой тон, в мире люди плохо себе представляют, что такое "русский". Соотв. студия отказывается его компилить. Переименовал в impulse.asm

Ошибка на ссылку:
.include file "C:\AVR\WH4\hd44780.asm"
закомментировал...
Соотв. появились ошибки на "rcall LCD_WriteCommand" и.т.д. Закомментировал.
Зачем ты их вообще сейчас включаешь, если до вывода на индикатор как до луны пешком?

Начало компилиться, теперь появились варнинги:
Код: Выделить всёРазвернуть
C:\avr\test\impulse.asm(23): warning: Register r11 already defined by the .DEF directive
C:\avr\test\impulse.asm(29): warning: Register r16 already defined by the .DEF directive


Так, становится скучновато. Ладно, разберемся потом с этим. Запускаем дебагер, жмем f11
Доходим до основного цикла "Inf". Йо майо, зачем ты опять засунул разрешение глобального прерывания в основной цикл? Ты когда ходишь по коридору туда сюда, жмешь выключатель чтоб включить свет, даже когда он горит? Или делаешь это один раз? Убрал sei из цикла.
Так, почему идет опрос флагов, которые не инициировались раньше? "sbrc flags, EventForward ". Почему ты убрал "clr flags" в инициализации ???
Куда делось опять форматирование программы? Почему команды начинаются с начала строки? Почитай это:
http://kazus.ru/forums/showpost.php?p=5 ... ostcount=4
Взял тута:
http://kazus.ru/forums/showthread.php?p=576123
Пожалей меня и нас :)
Вот как должны выглядеть программы:
http://www.electroclub.fatal.ru/RusAVR/ ... CDapp2.htm
http://caxapa.ru/49289.html

Ты дебагером пользуешься?
Ладно, мы зациклены в основном цикле "inf", в котором ничего не происходит. Давай поставим курсор на "rjmp Forward" и правой кнопкой мыши выберем "set next Statement". Жмем f11, перешли на "Forward:" . Тут делается "inc temp1", это твой двоичный счетчик, который, кста, нигде не инициирован, т.е. там мусор от использования этого регистра для настройки портов. Ладно, он инкрементировался, у меня он стал 0xC1 (R19). Ок, давай посмотрим как его будет преобразовывать bin2ASCII16 в ascii код. bin2ASCII16 пытается преобразовать двоичный код в регистрах fASCIIL,fASCIIH, которые дефайном сделаны r11,r12. A твой счетчик в temp1, который в R19. С чего он должен правильно считать???
Так, пойду покурю, т.е. я не курю, но теперь курю :)

Добавлено спустя 51 минуту 18 секунд:
Курнул, ща пойдет лучше :)
Делаем ресет в дебагере. Тактика: попробуем проверить работоспособность bin2ASCII16, мы знаем, что двоичный код должен быть в fASCIIL,fASCIIH (r11,r12). При подходе к этой процедуре, засунем в эти регистры ff ff , это 0xffff - в десятичном виде это 65535.
Поехали...
Ладно, мы зациклены в основном цикле "inf", в котором ничего не происходит. Давай поставим курсор на "rjmp Forward" и правой кнопкой мыши выберем "set next Statement". Жмем f11, перешли на "Forward:"

Попадаем в bin2ASCII16. В регистры r11 и r12 забиваем "ff"
Все пока хорошо, bin2ASCII_digit_loop вычитает из нашего 0xffff число 10000, пока не произойдет переполнение. Колич. вычетов подсчитывается в cnt16a, это и будет наше десятичное число пятого знака "65535". Йес, cnt16a (r16) насчитал "6" и вывалился из цикла. Опс, пошли какие-то:
Код: Выделить всёРазвернуть
ldi r16,0x01 ;Команда очистки дисплея

Ну йо майо, там наш "6" многострадальный был. Стоп дебагер. Удаляем весь бред до "ret". Компилим. Доходим до этого места. Во, сбросим "Cycle counter", посмотрим сколько циклов занимает преобразование.
Поехали, ура, преобразовалась одна цифра "6", прошло 49 тактов, цифра записалась в:
Код: Выделить всёРазвернуть
mov     tASCII4, cnt16a

Так, мы знаем что теперь все работает, чтоб не жамкать пошагово f11, поставим точку останова на ret в bin2ASCII_digit_loop. И будем запускать отладку f5, в нужном месте прога остановится и мы будем видеть как преобразовывается число.
Опс, получили 4-й знак и он = 5 :)
Код: Выделить всёРазвернуть
mov     tASCII3, cnt16a

Опс, получили 3-й знак и он = 5 :)
Код: Выделить всёРазвернуть
mov     tASCII2, cnt16a

Опс, получили 2-й знак и он = 3 :), и почему-то вывалились из bin2ASCII16, полученное число осталось в cnt16a, а остаток единиц "5" остался в fASCIIL, ок, будем знать.
Итог, число 0xffff преобразовалось в 65535 (десятичное) и лежит в tASCII4,tASCII3,tASCII2,cnt16a,fASCIIL. Заняло 162 такта. Все работает.
Сложно? Кассандра? Ушел курить :)
impulse.asm.pdf
(4.8 КиБ) Скачиваний: 0
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 05 авг 2013, 01:57

А я курю. Чувствую скоро пить начну :)
пошел курить материал

Добавлено спустя 32 минуты:
Проверил и правду все работает :)
"Итог, число 0xffff преобразовалось в 65535 (десятичное) и лежит в tASCII4,tASCII3,tASCII2,cnt16a,fASCIIL. Заняло 162 такта. Все работает."
А как теперь вытащить это число? Собрать все воедино, чтоб передать в подпрограмму (LCD_WriteData).
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 05 авг 2013, 03:16

Ну, сначала вызываешь rcall bin2ASCII16, а потом своей функцией печати на lcd:
Код: Выделить всёРазвернуть
;**********************************************************************
;Печать счетчика на lcd
   rcall   bin2ASCII16
   mov   temp1,0x30   ;смещение для ASCII кода
   _add_   tASCII4,temp1    ;преобразовать десятичный код в ASCII
   _add_   tASCII3,temp1    ;
   _add_   tASCII2,temp1    ;
   _add_   cnt16a,temp1    ;
   _add_   fASCIIL,temp1    ;

;вывод на lcd
   mov   temp1,tASCII4
   rcall   LCD_WriteData
   mov   temp1,tASCII3
   rcall   LCD_WriteData
   mov   temp1,tASCII2
   rcall   LCD_WriteData
   mov   temp1,cnt16a
   rcall   LCD_WriteData
   mov   temp1,fASCIIL
   rcall   LCD_WriteData
;**********************************************************************


Только смотри чтоб опять регистры не пересекались, у тебя вроде так:
Код: Выделить всёРазвернуть
;Число должно быть в r16,чтоб отобразить на LCD
;   rcall LCD_WriteData


Не дает форум текст программы нормально вставлять. смотри файл:
read.txt.pdf
(1.01 КиБ) Скачиваний: 0
Последний раз редактировалось Dmitry__ 05 авг 2013, 19:00, всего редактировалось 2 раз(а).
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 05 авг 2013, 18:58

Поправил пост, запрещенное слово для форума взято в _ _
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 08 авг 2013, 00:05

Привет! Вывел на LCD 65535 :good: .А как из этого числа отнять или прибавить 1-у? :crazy:
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 08 авг 2013, 20:02

Ну, тенденции есть :good:

arm-17 писал(а):А как из этого числа отнять или прибавить 1-у?

Я так всю программу тебе напишу, мы так не договаривались :)

Твоему двоичному счетчику надо выделить память, чтоб он спокойно там считал и его никто не затирал. Т.к он у тебя 16-ти битный, надо выделить 2 байта, обзовем например CountLow и CountHigh и обнулить их при инициализации программы:
Код: Выделить всёРазвернуть
.def   CountLow   =r24
.def   CountHigh   =r25

   clr   flags      ;сбросить флаги
   clr   CountLow    ;сбросить двоичный счетчи
   clr   CountHigh    ;



Инкремент и декремент счетчика надо делать по правилу 16-ти битной арифм. В авр есть adiw и sbiw, но у этих команд есть ограничение на используемые регистр, см. соотв. доку, поэтому наши регистры в r25:r24
Код: Выделить всёРазвернуть
;**********************************************************************
Forward:
   cbr   flags, (1__EventForward);сбросить флаг,обработали событие
   adiw   CountHigh:CountLow,1   ;инкремент 16-ти битного счетчика
   rcall   PrintASCII
   ret
;**********************************************************************
Back:
   cbr   flags, (1__EventRevers)   ;сбросить флаг,обработали событие
   sbiw   CountHigh:CountLow,1   ;декремент 16-ти битного счетчика
   rcall   PrintASCII
   ret
;**********************************************************************

Коррекцию и вывод на печать оформим подпрограммой:
Код: Выделить всёРазвернуть
;**********************************************************************
PrintASCII:
   mov   fASCIIL,CountLow   ;переслать счетчик в регистры 10-ой коррекции
   mov   fASCIIH,CountHigh   ;

   rcall   bin2ASCII16   ;десятичная коррекция
;преобразовать десятичный код в ASCII   
   ldi   temp1,0x30   ;Смещение для ASCII кода
   _add_   tASCII4,temp1    ;r15
   _add_   tASCII3,temp1    ;r14
   _add_   tASCII2,temp1    ;r13
   _add_   cnt16a, temp1    ;r19
   _add_   fASCIIL,temp1    ;r23

;вывод на lcd
   mov   temp1,tASCII4
;   rcall   LCD_WriteData
   mov   temp1,tASCII3
;   rcall   LCD_WriteData
   mov   temp1,tASCII2
;   rcall   LCD_WriteData
   mov   temp1,cnt16a
;   rcall   LCD_WriteData
   mov   temp1,fASCIIL
;   rcall   LCD_WriteData
   ret
;**********************************************************************


Вот тебе домашнее задание :)
Твой счетчик при инкременте с 0xffff (65535 десятичное значение) сбросится в 0. И соотв. при декременте с 0 станет: 0xffff, надо бы дописать ограничивалку минимального и максимального значения. А кто сказал что будет легко?

Ты там не диплом сдаешь? :D
Оцени какую я красоту навел в файле :P
STENDIMPULS4.asm.pdf
(5.96 КиБ) Скачиваний: 0
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 08 авг 2013, 23:47

Я работаю в очень крупной лифтовой компании Ведущим инженером. Эта штука мне нужна для ремонта Тахо-датчиков от частотных преобразователей, а то они летят как семечки и разработчики дерут не малые деньги за ремонт надо утереть им нос :).Может я смогу оказать какую-нибуть услугу вам Dmitry__?
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 08 авг 2013, 23:53

arm-17 писал(а):Я работаю в очень крупной лифтовой компании Ведущим инженером.

ВАУУУУУУУУУУУУУУУУУУУУУУУУУУ!!!
Я пытаюсь сделать знакомому лифт в коттедж, ТЫ МНЕ НУЖЕН!!! :Yahoo!:
А что за компания?
Фсеееее, начинаем делать свои контроллеры, я весь твой :)
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 09 авг 2013, 00:03

Круто :D .Весь к вашим услугам. :) :) :) Вот уж не думал что пригожусь :good:
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 09 авг 2013, 00:12

Я щаз пляшу как у тебя на аватарке. :)
Давай в личку...
Аватара пользователя
Dmitry__
 
Сообщения: 5982
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Angel71 » 09 авг 2013, 04:56

о, уже в отдел хардкорщиков/оптимизиторов переманиваешь :D ну ничё, ничё, скоро и до кратеньких нормальных мануальчиков, тип такого Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes:1, 2A, 2B, 2C, 3A, 3B, and 3C дойдёт
Аватара пользователя
Angel71
 
Сообщения: 9227
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Mail.ru counter