Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/119: Рейтинг темы: голосов - 119, средняя оценка - 4.97
OOS
1

Работа с семисегментным индикатором, asm

11.12.2011, 18:25. Показов 21934. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разбираюсь по-маленьку с программированием. Светодиодами мигать уже не интересно, хочется что нибудь полезное сделать.
Хочу сделать вольтметр, для начала самый простой, самое главное разобраться. С АЦП разобрался, там все просто. Как на индикатор вывести какое нибудь одно число представляю, но как выводить значения соответствующие каждому из уровней АЦП на индикатор?
Для простоты планирую использовать 8 старших разрядов АЦП. Товарищи, помогите разобраться. Интересует сам алгоритм, если можно примеры на ассемблере. Или что почитать на эту тему?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2011, 18:25
Ответы с готовыми решениями:

Микропрограмма для устройства управления семисегментным индикатором
Доброго времени суток! Нужна помощь в написании кода программы на языке Assembler для 8-битного...

Учусь. Оцените программу для работы с семисегментным индикатором
Хочу понять, правильно ли я подхожу к решению поставленной задачи? Не слишком ли это "тяжело" для...

Задача с семисегментным индикатором
В общем, курсач мой горит синим пламенем. Нужно написать для МК программу, которая будет хранить...

Дешифратор с семисегментным индикатором VHDL
Интересно как реализовать индикатор, связать его с дешифратором и как пронаблюдать результат? ...

11
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
11.12.2011, 19:50 2
Цитата Сообщение от OOS
Интересует сам алгоритм, если можно примеры на ассемблере. Или что почитать на эту тему?
Надеюсь эта статья Вам поможет. Там, правда на Си, но общий подход (алгоритм) расписан.
0
Ztot
16.12.2011, 00:09 3
Тоже есть вопрос. Делал динамическую индикацию (atmega16, rec-s5461asr, sn74hc164). Использовал прерывания по таймеру в режиме normal. Во время отладки стал подбирать частоту индикации - выбором предделителя (clk/1024, clk/256, clk/64 и clk/8). Ни одно значение не устроило, решил перейти в режим СТС и установить частоту где-то около 50 кГц (OCR0=160). Тут-то бобик и сдох - индикатор вообще потух (в proteus все работает). Как оказалось, при OCR0=255 в режиме СТС он светит, а уже при OCR0=254 - нет. В чем могут быть грабли? Спасибо.
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.12.2011, 00:28 4
Цитата Сообщение от Ztot
решил перейти в режим СТС и установить частоту где-то около 50 кГц
Фигасе, обычно пары сотен Гц за глаза. Схему покажите?
0
Ztot
16.12.2011, 01:07 5
приложил схему (без транзисторов, резисторов) и хекс. Нажимая на кнопочки Freq, можно менять TCCR0 от 0b0001010 до 0b0001101. 0 на lcd - это clk/1024, а 3 - clk/8. Макетка ведет себя также.

[20.97 Кб]
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
16.12.2011, 02:28 6
Цитата Сообщение от tyzord66

Фигасе, обычно пары сотен Гц за глаза. Схему покажите?
+100.
Стало интересно, если обновлять светодиодный индикатор с частотой 50 кгц, сегменты будут успевать гаситься или визуально будут все гореть? )
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.12.2011, 12:25 7
Цитата Сообщение от Ztot
приложил схему (без транзисторов, резисторов) и хекс. Нажимая на кнопочки Freq, можно менять TCCR0 от 0b0001010 до 0b0001101. 0 на lcd - это clk/1024, а 3 - clk/8. Макетка ведет себя также.
В прерывании должна быть следующая последовательность действий – стековые операции, погасить индикатор, вычислить символ для текущего цикла отображения, натолкать его образ в сдвиговый регистр, вычислить бит для включения нужного разряда, зажечь его, снова стек. Для повторения с частотой в 50кГц довольно длинная процедура, не исключено, что при выходе из нее проц снова в нее и уходит, начиная с гашения. Вот Вы на индикаторе ничего и не видите. Уменьшайте обновление на два порядка не меньше.
0
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
16.12.2011, 12:42 8
Интересует сам алгоритм, если можно примеры на ассемблере.
Для начала надо преобразовать двоичное значение в три десятичных цифры. Это делается последовательным делением на 10.
Затем - каждую цифру в "рисунок" согласно сегментам индикатора. Потом только выводить.
Пример преобразования
Код
;-------------------------------------------------------------------------------
; Декодирование 16-битного числа в десятичные цифры
; Число должно быть в X, в Y - указатель на память, куда сложить результат
; Число записывается в память справа налево, Y должен быть со смещением
; (он декрементируется), максимум 5 знаков.
;-------------------------------------------------------------------------------
word2dec:
clr r24                           ; младшее число десятков
clr r25                           ; старшее число десятков
w2d0:
sbiw XL,10                      ; считаем количество десятков
brcs w2d1
odyw r24,1
rjmp w2d0
w2d1:                             ; Десятки посчитали. Забираем остаток
odyw XL,10
st -Y,XL                        ; Сохраняем его
movw XL,r24
or r24,r25                      ; Если десятки остались,
breq w2d3                       ; отправляем заново на переработку
rjmp word2dec
w2d3:
ret
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.12.2011, 19:59 9
Цитата Сообщение от ptoop
Для начала надо преобразовать двоичное значение в три десятичных цифры. Это делается последовательным делением на 10.
Затем - каждую цифру в "рисунок" согласно сегментам индикатора. Потом только выводить.
Думаю, сперва придется промасштабировать полученные с АЦП данные относительно опорного с учетом входного делителя. Хотя можно и схитрить – рассчитать делитель таким образом, чтоб при напряжении на входе 25.6V, на выходе он обеспечивал напряжение равное опорному. В этом случае при восьми битном преобразовании (как хочет ТС) один отсчет будет равен одной десятой вольта на входе делителя. BCD я делал согласно апноте от атмела, получилось на пару КОПов длиннее от их заявленного, но в то время я особо об оптимизации не задумывался. Основное преимущество метода это скорость, не зависимо от входного значения цикл повторяется 16 раз.

Код
;********************************************************
; bin2BCD16
;********************************************************
c2to10:      ldi      count1,   $10
clr      byte_0
clr      byte_1
clr      byte_2
clr      ZH
loop_b:              lsl      bin_l
rol      bin_h
rol      byte_0
rol      byte_1
rol      byte_2
dec      count1
brne              nm1
ret
nm1:        ldi      ZL,   $5
nm2:              ld      sector,   -Z
ldi      temp,   $03
add      sector,   temp
sbrc              sector,   3
st      Z,   sector
ld      sector,   Z
ldi      temp,   $30
add      sector,   temp
sbrc         sector,   7
st      Z,   sector
cpi      ZL,   $2
brne         nm2
rjmp         loop_b

./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18
[94.37 Кб]
0
Ztot
17.12.2011, 23:18 10
Использовал прерывания по таймеру в режиме normal. Во время отладки стал подбирать частоту индикации - выбором предделителя (clk/1024, clk/256, clk/64 и clk/8). Ни одно значение не устроило, решил перейти в режим СТС и установить частоту где-то около 50 кГц (OCR0=160).
эээ, я не совсем корректно выразился - имелось ввиду, что я менял частоту индикации изменением частоты 8-битного таймера. Процесс вывода осуществлялся в прерывании по переполнению, а это значит, частота индикации выбиралась из значений около 3900, 490, 122, 30 Гц, а желаемым 50 кГц таймера соответствовала бы...ну вы поняли )

tyzord66, подправил алгоритм в соответствии с вашим описанием - удалось избавиться от засветок, да и работа стала ровнее - возможно эксперименты с СТС и не пригодятся )
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
18.12.2011, 01:37 11
Выбери частоту переключений светодиодов.
Например, 200Гц - это хорошая частота.
Стало быть, каждое переключение должно срабатывать раз в 5мс (миллисекунд).
Значит, нужно подобрать таймер так, чтобы он переполнялся раз в ... чуть больше, чем 5мс.

Примем тактовую частоту МК = 1Мгц.

Сначала делим тактовую частоту на 256 (максимум тиков до переполнения).
1000000/256 = 3906 раз в секунду будет переполняться таймер = одно переполнение в 256мкс. Маловато, верней - быстровато.
Начинаем подбирать прескалер.
Если взять самый большой прескалер 1024, то таймер будет тикать раз в 256*1024 = 262мс - многовато. Нам надо немного больше 5мс.
Подходит прескалер 64, ибо 8 - мало. При прескалере 8 тйамер переполяется каждые 256*64 = 16384мкс = 16мс.
Ок. теперь нам нужно приблизиться к 5мс, то есть к 5000мкс. 5000/256 = 19.5.
Примем 20. Значит, наше волшебное число 20 - столько раз должен переполниться таймер при частоте 1МГц и прескалере 64.

В обработчике прерывания мы используем глобальную переменную DyspTimer.
Я не помню(мне не хочется) ASM, буду писать на Си-подобном псевдокоде

Код
-------------------
#define   DISPLAY_TIME   20
uint8_t   DyspTimer;
uint8_t   Digit;
.....
ISR(Timer0_Over)
{
DyspTimer++;
}
....
main()
{
....
TIMER_INIT;   // настройка таймера
....
while(1)
{
if ( DyspTimer >= DISPLAY_TIME )
{
DyspTimer = 0;
DysplayDigit();
}
}
}
....
DysplayDigit()
{
Digit++;
if ( Digit >=4 )   //  при 4-разрядном индикаторе
Digit=0;
DN_ALL_DIGITS;  // гасим все цифры
OUT_DIGIT(Digit);   // выводим на индикатор нужную цифру
UP_DIGIT(Digit);   // зажигаем нужный разряд
}
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
18.12.2011, 21:22 12
Цитата Сообщение от OOS
Для простоты планирую использовать 8 старших разрядов АЦП. Товарищи, помогите разобраться. Интересует сам алгоритм, если можно примеры на ассемблере. Или что почитать на эту тему?
Если пример на асме еще актуален:

[108.61 Кб]

0
18.12.2011, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2011, 21:22
Помогаю со студенческими работами здесь

Изобразить на экране работающие электронные часы с цифровым индикатором семисегментным
Изобразить на экране работающий электронный часы с цифровым индикатором семисегментним

Работа с индикатором WS0010
Привет всем! Столкнулся с проблемой по работе с индикатором , в графическом режиме, по...

ATMega16. Работа с индикатором HD4478
В программировании на С делаю первые шаги так что сильно не пинайте. Делаю генератор на...

Работа с индикатором на базе ТМ1638
Недавно прикупил себе сабж (https://www.google.com.ua/seorsh?q=TM16 ... Q_AUIBigB#), и вроде как...

Работа с 7 сегментным индикатором на ATmega 328P
Сделать счёт на 7 сегментном индикаторе от 0 до F и обратно, при этом кнопкой принудительно...

Работа с индикатором (Code Vision AVR)
Помогите разобраться с програмой. Она должна выводит на индикатор 4 цифры но никак не могу её...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru