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

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

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

Сообщение arm-17 » 15 июл 2013, 15:30

Помогите новичку!
Вот написал такую программу,которая должна преобразовывать числа от 0 до 225 и выводить на ЖКИ, но она считает только до 9-и кто подскажет что не так?
Куда цифры подставлять?не пойму.И откуда потом значения снимать? :sorry:
Код ASM

;Не судите строго я новичек. А на C писать не умею.
Код: Выделить всё
; ПРОГРАММА - счетчик электронный для счета импульсов
;
; Кварц - 4 МГц
;
.include file "C:\AVR\AvrAssembler2\Appnotes\tn2313def.inc"

;======================================================
#define F_CPU (4000000)
;Здесь идёт определение тактовой частоты. Нужно для
;библиотеки задержек,используемой в этой либе.
;Частота в Герцах.
;======================================================
.def temp =r16 ;временный
.def temp1 =r17 ;временный
.def temp2 =r18 ;временный
.def temp3 =r19 ;временный
.def temp4 =r20 ;временный


.CSEG
.org 0
rjmp START ; На основную программу

.org INT0addr
rjmp Forward ;Oбработкa прерывания по INT0 (инкремент)
.org INT1addr
rjmp Back ;Oбработкa прерывания по INT1 (декремент)

;*************************************************************************
START:
; ldi temp,$0F
; out WDTCR,temp ;Включение сторожевого таймера 1,9 секунды.

;======================================================
ldi Temp1,RamEnd ; установка указателя стека
out SPL,Temp1
;Инициализация стека. Обязательно!!!
;------------------------------------------------------

ldi temp1,0b00000000
out DDRD,temp1 ;Направление данных PortD (1)-выходы
ldi temp1,0b11111111
out PORTD,temp1
ldi temp1,0b11111111
out DDRB,temp1 ;Направление данных порта B на вывод,В.1,2 -как входы
out PORTB,temp1 ;Выдать данные на порт В


; rcall LongDelay ;программная задержка при включении
wdr ;сбросить стор. таймер

; sbic pinb,Kn_2 ;если кнопка не нажата перейти на следующую команду
ldi temp1,(1<<ISC01|1<<ISC11);устанавливаем прерывания INT0 и INT1 по спадающему фронту (ШУЛМ)

out MCUCR,temp1
;**************************************************************************

rcall lcd_init;Инициализация дисплея.

nop
nop

ldi temp,225

;**************************************************************************

sei ;разрешаем прерывания
Inf:
ldi temp1,(1<<INT1)+(1<<INT0);разрешаем прерывания INT1,INT0
out GIMSK,temp1

rjmp Inf ;бесконечный цикл


;*************************************************************************
Forward:;(ПРИБАВИТЬ)

;*************************************************************************

inc temp
ldi r17,0
; ldi r16,9

rcall bin16_ascii

;ldi r16,0x45
;rcall LCD_SetAddressDD

;-------------------------------------------------------------------------

reti ;выход из обработчика

;//////////////////////////////////////////////////////////////////////////////
;*************************************************************************
bin16_ascii:
;*************************************************************************
;* *
;* Convert unsigned 16 bit to 5 digit ASCII *
;* *
;* *
;* *
;*************************************************************************
;
;входной: R17, R16 = 16 bit значение 0... 65535
; выход: R20, R18, R19, R17, R16 = 5 цифр (ASCII)
; цикл: 20... 170

ldi r21, 10 + '0'
_bcd0: dec r21
subi r16, low(-100000) ;+100000
sbci r17, high(-100000)
brcs _bcd0

ldi r20, -1 + '0'
_bcd1: inc r20
subi r16, low(10000) ;-10000
sbci r17, high(10000)
brcc _bcd1

ldi r19, 10 + '0'
_bcd2: dec r19
subi r16, low(-1000) ;+1000
sbci r17, high(-1000)
brcs _bcd2

ldi r18, -1 + '0'
_bcd3: inc r18
subi r16, low(100) ;-100
sbci r17, high(100)
brcc _bcd3

ldi r17, 10 + '0'
_bcd4: dec r17
subi r16, -10 ;+10
brcs _bcd4

subi r16, -'0'

;-------------------------------------------------------------------------


push temp

ldi r16,0x01 ;Команда очистки дисплея
rcall LCD_WriteCommand
ldi r16,0x45
rcall LCD_SetAddressDD

pop temp




;Число должно быть в r16,чтоб отобразить на LCD
rcall LCD_WriteData

; А вывод кода неупакованного BCD на дисплей зависит от его типа (дисплея).
; Если требуются ASCII символы, перед выводом добавляете к цифре $30 (0x30h).
ret

Back:;(Отнять)
;//////////////////////////////////////////////////////////////////////////////
;*************************************************************************

dec temp
ldi r17,0
; ldi r16,9

rcall bin16_ascii

;ldi r16,0x45
;rcall LCD_SetAddressDD

;-------------------------------------------------------------------------

reti ;выход из обработчика
;**************************************************************************
; Подпрограммы выдержек времени (0,5 сек и 2,5 миллисекунды)

LongDelay: ;Задержка 0,5 сек
push temp1
ldi temp1,$85
out TCNT1H,temp1 ;загрузим старший байт Т1
ldi temp1,$EE
out TCNT1L,temp1 ;загрузим младший байт Т1
rjmp PUSK

Delay: ;Задержка 2,5 мсек
push temp1
ldi temp1,$FF
out TCNT1H,temp1 ;загрузим старший байт Т1
ldi temp1,$64
out TCNT1L,temp1 ;загрузим младший байт Т1

PUSK: ;запуск таймера
ldi temp1,3
out TCCR1B,temp1 ;загрузим к-т предделителя Т1 и запустим его

LooP: ;цикл
in temp1,TIFR
sbrs temp1,7 ;таймер-счетчик переполнен?
rjmp LooP
ldi temp1,0
out TCCR1B,temp1 ;остановить счетчик таймера
ldi temp1,$80
out TIFR,temp1 ;сбросить флаг переполнения таймера
pop temp1
ret

.include file "C:\AVR\WH4\hd44780.asm"

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

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

Сообщение Myp » 15 июл 2013, 15:39

на асме далеко не уедешь :)
отличный момент чтобы начать писать на С
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

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

Сообщение arm-17 » 15 июл 2013, 15:50

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

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

Сообщение Dmitry__ » 15 июл 2013, 18:00

Твой способ перевода совсем кислый. Тебе надо перевести двоичное число в двоичнодесятичное, а потом преобразовать в ASCII. Самый красивый способ перевода - это сдвиг влево регистра и десятичная коррекция, так n раз (по ширине преобразуемого двоичного числа). В аврах нет команды десятичной коррекции :o , делают программно. В гугле: bin2bcd avr
И да, в си это жоппа совсем, или делением числа на 10 и брать остаток (очень долго), или тот же асм во вставках :)

http://caxapa.ru/49279.html
http://kazus.ru/forums/showthread.php?p=576123
http://radiokot.ru/forum/viewtopic.php?f=57&t=392
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Myp » 15 июл 2013, 19:48

родная дока: http://www.atmel.com/Images/doc0938.pdf
только ну нафик надо этим заниматься, сидеть парить мозг как что-то куда-то, вместо того чтобы ещё вчера всё сделать и радоваться.
жизнь слишком коротка :)

лентяи с ардуино просто пишут bin2bcd()
те у кого нет ардуины тоже не особо парятся, им надо лишний #include написать
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

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

Сообщение Dmitry__ » 15 июл 2013, 20:08

Myp писал(а):жизнь слишком коротка

Об этом начинаешь задумываться когда ожидаешь посылки по 90 дней? :D
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Myp » 15 июл 2013, 21:41

посылки я заказываю в расчёте на то что когданибуть будет приятный сюрприз когда открою почтовый ящик)))

ладно, не жизнь, сутки, слишком коротки)))
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

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

Сообщение arm-17 » 15 июл 2013, 22:52

"Об этом начинаешь задумываться когда ожидаешь посылки по 90 дней? :D"
Вот-вот 2-ю неделю бьюсь. Ни как смысла не уловлю :(
Я конечно дико извиняюсь за свою невежественность,но куда цифры вставлять? Как этой х-нью пользоваться?
Подскажите на моем примере пожалуйста?

Добавлено спустя 2 минуты 52 секунды:
Ну хотя бы в форуме САХАРА "BIN2BCD можно шустрей как-нить? На 2313 делаю. почти 2000 циклов"

Добавлено спустя 4 минуты 46 секунд:
Какой из этих примеров пойдет для счета от 0 до 9999 :o
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

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

Сообщение Dmitry__ » 15 июл 2013, 23:13

Твои вопросы сильно смахивают на задачу: "препод дал хрень, надо найти ошибку и сдать, с минимальным нанесением вреда своему мозгу". Вывод такой из: Слишком много написано и хорошо закомментировано кода, чтоб не понимать "но куда цифры вставлять"?
Попробуй убедить в обратном, тогда помогу :)
Пускай тут ссылки полежат:
http://electroclub.fatal.ru/RusAVR/Doc/ ... CDapp2.htm
Взял из тута:
forum2/topic1070-1920.html#p240713
еще:
http://forum.easyelectronics.ru/viewtop ... =14&t=9561

Добавлено спустя 58 секунд:
А тут что-то интересное про баг в AVR204, сильно не вникал...
http://www.ustr.net/avrfiles/avr204f.htm
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение arm-17 » 16 июл 2013, 00:14

Отличный ты парень Dmitry__ :) Я тебя обязательно в друзья добавлю :good:
Я тут на форумах просто замучался спрашивать, ни кто даже сылки не скинул.
Все только подкалывают. Тяжело быть начинающим AVR-щиком.
Не у кого спросить только как на форумах.
А так я простой радиолюбитель.
Ты тут много пищи для размышления оставил. Дня на 2-а :) Надо изучить чтобы совсем лицом в грязь не ударить :)
Обязательно отпишу как дойдет до меня.

А тут я тебя на словах поймал :)
"Попробуй убедить в обратном, тогда помогу :)"
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

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

Сообщение Dmitry__ » 16 июл 2013, 04:30

Вау, я по ходу ашибся, думал школота, тогда переманиваем тебя на темную сторону асма :)
Кста, у тебя в одном сообщении смайликов больше чем у меня, здесь ЭТО разрешено только мне :D
По делу:
Вот создал я новый проект "test" в avr studio4, задал конфиг - твой tn2313, асм проект, в файл "test.asm" вставил твой код из первого сообщения. Компильнул, получил кучу ошибок:
еггог: .include file "C:\AVR\AvrAssembler2\Appnotes\tn2313def.inc"
исправляем на:
.include "2313def.inc"
отсутствующий у меня: .include file "C:\AVR\WH4\hd44780.asm" закомментируем, ибо он не влияет на понимание работы десятичной коррекции :)
Соотв. появилась куча ошибок, типа:
C:\avr\test\test.asm(58): error: Undefined symbol: lcd_init
C:\avr\test\test.asm(145): error: Undefined symbol: LCD_WriteCommand
C:\avr\test\test.asm(147): error: Undefined symbol: LCD_SetAddressDD
C:\avr\test\test.asm(155): error: Undefined symbol: LCD_WriteData
C:\avr\test\test.asm(214): No EEPROM data, deleting C:\avr\test\test.eep

Закомментируем их все. Компилим, ошибок нет.

И вот тут начинается волшебство, появляется возможность пройтись дебагером по программе и увидеть где как что не работает :)
debug/start debug:
test_avr.PNG


Завтра продолжим, хотя, скорее всего, я тебе уже и не нужен, 3 дня в дебагере и ты будешь по другому смотреть на мир :)
Последний раз редактировалось Dmitry__ 16 июл 2013, 04:46, всего редактировалось 1 раз.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение dccharacter » 16 июл 2013, 04:42

извините, а зачем переводить в двоично-десятичное?

Добавлено спустя 2 минуты 42 секунды:
ну т.е. нафига? Куда спешим? 5 раз разделить на 10 - за это время троллейбус что ли уедет?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение Dmitry__ » 16 июл 2013, 04:55

Ну, я как ломатель всего, считаю что надо знать азы логики. Тем более деление на 10 и брать остаток - это извращенное понимание сути на языке си, т.к. другое ТАМ не доступно.

Добавлено спустя 3 минуты 10 секунд:
dccharacter писал(а):ну т.е. нафига? Куда спешим? 5 раз разделить на 10 - за это время троллейбус что ли уедет?

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

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

Сообщение dccharacter » 16 июл 2013, 05:00

я бы использовал itoa и не морочился

Добавлено спустя 48 секунд:
Dmitry__ писал(а):Примерно в 100 раз медленнее, это много или нормально?

Это ни о чем совершенно, Дим

А про азы я согласен. Если это интересно, то это надо раскапывать.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение Dmitry__ » 16 июл 2013, 05:05

itoa - смерть для avr2313, ибо это таблица (если я прав. понял) а в ATtiny2313 флеша - кот наплакал

Добавлено спустя 2 минуты 18 секунд:
блин, это ваще из си, не путай меня, я сам запутаюсь. На ATtiny2313 у кого-нибудь получилось создать что-то на си?
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

След.

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

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

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

cron