Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/17: Рейтинг темы: голосов - 17, средняя оценка - 4.88
zagladkina
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 5
1

ATMega16 (AVR Studio, ASM) - Вывести результат на светодиоды по схеме

16.05.2012, 18:15. Просмотров 3183. Ответов 15
Метки нет (Все метки)

Ребят, помогите, пожалуйста, с решением задачи, не получается вывести результат на светодиоды по схеме((((в асемблере только, только начала работать((
Считать 4-х разрядное число с выводов PA5-PA2 разделить его на 4, затем
прибавить 510 и вывести четырёхбитный результат на светодиоды в двоичном
коде (светодиод горит - “1”, светодиод не горит - “0”)
Я начало программы написала, вроде работает верно, как закончить вариант, не знаю(
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.include "m16def.inc"
ldi r16,255
out DDRB,r16
clr r16
out DDRA,r16
start:
in r16,pinA
andi r16,0b00111100
lsr r16
lsr r16
lsr r16
lsr r16
ldi r17,5
add r16,r17
Добавлено через 1 минуту
Вот сама схема:
0
Миниатюры
ATMega16 (AVR Studio, ASM) - Вывести результат на светодиоды по схеме  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2012, 18:15
Ответы с готовыми решениями:

Считывание числа и вывод на светодиоды (ATMega16, ASM)
Приветствую. Нужно считать 4-х разрядное число с выводов РА5-РА2, разделить на 4 и прибавить 5 (в...

По нажатию кнопки вывести данные на дисплей HD44780 ATMega16 AVR Studio GCC
Здравствуйте, уважаемые любители-программисты. Нуждаюсь в небольшой помощи по программированию...

Вопрос к пишущим на asm в AVR Studio 4-5-6
Собственно хотелось бы услышать какая версия наименее глючная и удобная в этом ключе. Какие глюки...

Инкрементация числа до переполнения на ASM в AVR Studio
1 задача. Ввести число. В цикле инкрементировать его до переполнения. Вывести в порт вывода...

Не происходит возврат из подпрограммы (AVR Studio 4, Asm)
Доброго времени суток. Пишу мигающий светодиод на Avr ассемблере под Atmega16, среда AVR Studio 4. ...

15
pyzhman
809 / 499 / 70
Регистрация: 15.05.2012
Сообщений: 2,826
16.05.2012, 18:43 2
Один сдвиг вправо равносилен делению пополам. 510= 256+254.
0
zagladkina
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 5
16.05.2012, 19:20  [ТС] 3
Это ясно, там по задаче необходимо поделить на 4, поэтому я два раза сдвигала вправо)
0
bill_vs
35 / 35 / 1
Регистрация: 07.02.2012
Сообщений: 79
16.05.2012, 23:01 4
Задание немного странное, но если решать в лоб, то как-то так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.include "m16def.inc"
 
;инициирование портов
;PORTB0,2,3,4 - выход
    ldi     r16,0b00011101
    out     DDRB,r16
;PORTA после сброса - ввод
 
 
start:
    in  r16,PINA        ;вводим состояние кнопок 
    andi    r16,0b00111100  ;выделяем нужные разряды
    lsr     r16     ;сдвигаем, чтобы получить число
    lsr     r16
 
    lsr     r16     ;делим его на 4
    lsr     r16
    ;так как надо прибавить 510 - двухбайтовую константу
    ;регистр r17 будем использовать как старший байт переменной
    clr     r17
    ;прибавляем константу используя команды вычитания, т.е. вычитаем минус константу 
    ;(сложения с константой у AVR нет)
    subi    r16,low(-510)
    sbci    r17,high(-510)
    ;младшие 4 бита выводим на светодиоды
    ;разряды 1,2,3 надо сдвинуть влево, разряд 0 оставить на месте
    andi    r16,0b00001111  ;оставляем младшие разряды
    mov r17,r16
    andi    r17,0b00001110  ;три старших в r17
    add r16,r17     ;их и сдвигаем влево
    out portb,r16
 
    ; останавливаемся
loop:   
    rjmp    loop
В DDRA можно не писать нули, после сброса они там уже есть. Но если и записать, работать будет.

Если учесть, что входное число сразу делим на 4, т.е. отбрасываем младшие два бита, то можно использовать команду SWAP.
Ну и со сложением можно упростить, т.к. используем только 4 младших разряда результата.
3
16.05.2012, 23:01
zagladkina
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 5
20.05.2012, 17:22  [ТС] 5
Спасибо большое!!!!!!!!! Очень, очень выручили)*
0
vlomone
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 8
05.04.2015, 18:21 6
Цитата Сообщение от bill_vs Посмотреть сообщение
lsr * * r16 * * ;сдвигаем, чтобы получить число
* * lsr * * r16
можно поподробнее, зачем это?
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
05.04.2015, 19:58 7
http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/lsr.htm
Сдвиг в право эквивалентен делению на 2
0
vlomone
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 8
05.04.2015, 22:28 8
Это я понял) Но ведь здесь по деление отведены две последних команды lsr, всего их 4 , в итоге получается что делим на 16.
Я имею ввиду зачем "сдвигать, чтобы получить число", разве нельзя делить в упор сразу после команды andi?
0
bill_vs
35 / 35 / 1
Регистрация: 07.02.2012
Сообщений: 79
08.04.2015, 22:28 9
По условию: "Считать 4-х разрядное число с выводов PA5-PA2", т.е. число изначально сдвинуто на два разряда влево. Двумя сдвигами вправо получаем 4-х разрядное число.
0
vlomone
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 8
10.04.2015, 22:25 10
Благодарю! Еще хотел бы у вас попросить источник какой-нибудь про подобную арифметику, конкретно как ассемблер работает с числами, сдвигами и т.п., если знаете конечно)
0
bill_vs
35 / 35 / 1
Регистрация: 07.02.2012
Сообщений: 79
11.04.2015, 13:46 11
По AVR книжек таких не знаю, не интересовался. Можете попробовать Гуртовцев А. «Программы для микропроцессоров» (для 8080) или Фрунзе «Микроконтроллеры. Это же просто!» том 3 (для mcs51). Для теории достаточно. Есть в сети.
0
raxp
10190 / 6573 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
12.04.2015, 13:51 12
Закрепленные темы раздела

Литература по программированию в электронике, микроконтроллеры и ПЛИС
Коллекция исходников по алгоритмам и ссылок по работе с интерфейсами в МК

Но лично рекомендовал бы - Уоррена "Алгоритмические трюки для программистов".
0
vlomone
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 8
13.04.2015, 17:42 13
Еще один момент не понимаю, 5=101 в двоичной системе счисления, как вы здесь 0 учитываете, который между единицами?
subi r16,low(-510)
sbci r17,high(-510)
Как я понял, в r17 загоняется старший байт, в r16 остается младший, но вот где 0?
0
bill_vs
35 / 35 / 1
Регистрация: 07.02.2012
Сообщений: 79
13.04.2015, 22:00 14
Честно говоря, не понял вопрос.
Попробую сначала.
Вводим четырёхразрядное двоичное число, т.е. его значение может быть от 0 до 15.
Делим на 4, результат от 0 до 3 (целочисленное деление).
Прибавляем 510. Значение 510 - двухбайтное, 0b00000001 11111110, поэтому и слагаемое делаем двухбайтным 0b00000000 000000xx (х – или 0, или 1). Старший байт в r17 (0b00000000), младший в r16 (0b 000000xx). Младшие байты складываем без учёта переноса - subi r16,low(-510). Low означает, что берётся младший байт от числа (-510). Старшие байты складываем с учётом переноса предыдущего сложения - sbci r17,high(-510). High означает, что берётся старший байт от числа (-510).
По умолчанию, все числа считаются в тексте десятичными. Если надо двоичное, используем префикс 0b, для шестнадцатеричного – 0x. 510 это десятичное число, которое надо прибавить по условию задания.
1
vlomone
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 8
17.04.2015, 19:23 15
Огромное вам спасибо за такие подробные ответы, я вам очень благодарен. На самом деле вся проблема в том, что мне нужна такая же программа, только с прибавлением 5 в десятичной системе счисления, я все время воспринимал 510 как 5 в десятичной системе, за что извиняюсь.
Еще фишка в том, что ваш код так-то работает если прибавлять 5, 3, 7 и некоторые другие числа, что меня смутило. Наверное это из-за того, что 5, 3, 7 - это однобайтовые константы, т.е. регистр r17 попросту не нужен, и программа работает верно.
Неловко вас еще раз спрашивать, но правильно я понимаю, что для того, чтобы прибавлялась 5 можно убрать sbci r17, high, ведь 5, как я написал выше - однобайтовая константа,0b00000101, т.е. r17 можно использовать только для выделения старших разрядов в конце программы? И какова здесь функция loop: rjmp loop, будет ли работать без нее, у меня к сожалению нет под рукой микроконтроллера, чтобы проверить.
0
bill_vs
35 / 35 / 1
Регистрация: 07.02.2012
Сообщений: 79
17.04.2015, 21:58 16
Цитата Сообщение от vlomone Посмотреть сообщение
правильно я понимаю, что для того, чтобы прибавлялась 5 можно убрать sbci r17, high, ведь 5, как я написал выше - однобайтовая константа,0b00000101,
Если слагаемые и результат помещаются в один байт, то достаточно одной команды subi r16,5.
Цитата Сообщение от vlomone Посмотреть сообщение
r17 можно использовать только для выделения старших разрядов в конце программы?
Да.
Цитата Сообщение от vlomone Посмотреть сообщение
И какова здесь функция loop: rjmp loop, будет ли работать без нее, у меня к сожалению нет под рукой микроконтроллера, чтобы проверить.
Т.к. у AVR нет операции останова, её можно заменить командой перехода на саму себя. Программа зацикливается.

Цитата Сообщение от vlomone Посмотреть сообщение
Неловко вас еще раз спрашивать
Не стесняйтесь. Тем, кто пытается сам разобраться, помогают с удовольствием.
0
17.04.2015, 21:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2015, 21:58

Обращение к регистрам через адреса (ASM, AVR Studio)
Здравствуйте, есть такой вопрос: к примеру у меня в SRAM хранятся реальные адреса регистров общего...

Вычитание двухбайтных чисел в AtMega8535 на ASM (AVR Studio 4)
Составить программу вычитания двухбайтных чисел. Уменьшаемое содержится в регистровой паре R3:R2,...

AVR Studio (ASM). Поменять местами тетрады в данных
№16 Задание делается в AVR Studio Помогите, буду очень признателен, задание сделать надо к...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru