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

Последовательное зажигание светодиодов по кнопке (ATmega8515, ASM)

07.11.2014, 15:03. Просмотров 6971. Ответов 33
Метки нет (Все метки)

Добрый день. Требуется помощь для написания программы на ассемблере под AVR ATmega8515 микроконтроллер. В этом деле я новичок.

Исходная программа на ассемблере для микроконтроллеров AVR должна иметь следующую структуру:
Assembler
1
2
3
4
5
6
7
8
9
*/ (Название программы)
(Необходимый минимум пояснений)*/
.list               ; Включается вывод листинга и задается тип МК
.include  "m8515def.inc"    ; Включение файла с описанием регистров МК
.cseg               ; Выбор сегмента программного кода
.org  0                         ; Установка текущего адреса на ноль
rjmp  main                          ; Обход области векторов прерываний 
.org    (Адрес)     ; Установка текущего адреса на начало программы
main:       ----------          ----------- ; Начало основной программы
Задание
Обеспечить при нажатой кнопке SW1 поочередное засвечивание светодиодов LED0… LED7 на 1с в последовательности LED0, LED1,.., LED7, LED0 и т. д. При нажатой кнопке SW4 зажигание светодиодов должно происходить в обратном порядке. Кнопки подключены к порту B, а светодиоды - к порту D.

Заранее спасибо!!!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2014, 15:03
Ответы с готовыми решениями:

Последовательное зажигание светодиодов по кнопке (ATtiny2313, Cи)
Здравствуйте.Есть такая проблема.Написал код для подпрограммы последовательного зажигания...

Последовательное зажигание светодиодов
Собственно задание: при включении МК светодиоды не горят, через 2 с загораются 1-й, затем...

Зажигание светодиодов AT90S2313
Доброго времени суток. На AVR только начинающий Вот написал программу для циклического зажигания...

Зажигание полос светодиодов на мк AT90S8515
Здравствуйте! Задача такова:написать и отладить программу на ассемблер обрабатывающую прерывание...

Последовательное включение сегментов 7-с индикатора ATmega8515
Здравствуйте, Возможно ли последовательно переключать сегменты семисегментного индикатора так...

33
pyzhman
797 / 489 / 68
Регистрация: 15.05.2012
Сообщений: 2,776
07.11.2014, 17:56 2
Так, начало есть.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
07.11.2014, 20:18 3
Djaswent, вот для затравки немного кода
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
.def tmp0 = r16
.def tmp_delay = r17
 
.org 0x0
    rjmp Reset
.org 0x20
 
Reset:    
    ldi tmp0, HIGH(RAMEND)
    out SPH, tmp0
    ldi tmp0, LOW(RAMEND)
    out SPL, tmp0
main:
 
;Задержка  
Delay:
    ldi tmp_delay, 0
Loop_delay:
        inc tmp_delay
        cpi tmp_delay, 255
        brne Loop_delay
    ret
Напишите инициализацию портов и пойдем дальше
1
pyzhman
797 / 489 / 68
Регистрация: 15.05.2012
Сообщений: 2,776
08.11.2014, 07:27 4
Витальич, а как же с названием программы?
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
08.11.2014, 07:34 5
Да пожалуйста
Assembler
1
2
;Супер-мега программища с элементами искусственного разума 
;для интеллектуального управления светодиодами.  Сокращенно ИУС
0
AlexVRud
483 / 194 / 73
Регистрация: 04.07.2014
Сообщений: 547
08.11.2014, 11:00 6
А я бы немного подправил заголовок в соответствии с Datasheet (стр. 55)

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
.nolist
.include "m8515def.inc"
.list
 
.cseg           ; Выбор сегмента программного кода
.org  0         ; Установка текущего адреса на ноль
        rjmp    main    ; Обход области векторов прерываний, а правильнее, реакция на прерывание Reset
        reti            ; реакция на прерывание IRQ0
        reti            ; реакция на прерывание IRQ1
        reti            ; реакция на прерывание Timer1 Capture
        reti            ; реакция на прерывание Timer1 Compare A
        reti            ; реакция на прерывание Timer1 Compare B
        reti            ; реакция на прерывание Timer1 Overflow
        reti            ; реакция на прерывание Timer0 Overflow
        reti            ; реакция на прерывание SPI Transfer Complete
        reti            ; реакция на прерывание USORT RX Complete
        reti            ; реакция на прерывание UDR0 Empty
        reti            ; реакция на прерывание USORT TX Complete
        reti            ; реакция на прерывание Analog Comparator
        reti            ; реакция на прерывание IRQ2
        reti            ; реакция на прерывание Timer0 Compare
        reti            ; реакция на прерывание EEPROM Ready
        reti            ; реакция на прерывание Store Program memory Ready
.org  $11       ; Установка текущего адреса на начало программы
main:
        ...
Добавлено через 42 минуты
Цитата Сообщение от Витальич Посмотреть сообщение
Assembler
1
2
3
4
5
6
7
Delay:
* * ldi tmp_delay, 0
Loop_delay:
* * * * inc tmp_delay
* * * * cpi tmp_delay, 255
* * * * brne Loop_delay
* * ret
Цитата Сообщение от Djaswent Посмотреть сообщение
поочередное засвечивание светодиодов LED0… LED7 на в последовательност
Тут задержки приведут к некорректной работе программы. Можно проспать нажатие кнопки. Нужно задействовать таймер, например как в


Код
Прерывание переполнения внутреннего таймера:
    увеличивает некий счётчик на 1.
    Если счётчик превысил макс.значение то:
        Если указано направление сдвига, то
             сдвигаем бит в порте B
        обнуляем счётчик

В главном цикле:
    Определяем нажатия клавиши.
    Если они задали новое направление, то
        обнуляем счётчик
        сдвигаем бит в порте B
        сохраняем новое направление
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
08.11.2014, 18:50 7
Цитата Сообщение от AlexVRud Посмотреть сообщение
Тут задержки приведут к некорректной работе программы
У меня не приведут
0
Djaswent
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 8
09.11.2014, 13:05  [ТС] 8
Набросал тут алгоритм программы + функциональная схема (http://files.fm/g/ulkaurs#aa/lab.docx). Именно по этому алгоритму нужно написать программу.

Для инициализации, я так понимаю, нужно с помощью регистра DDRx установить порты либо на ввод, либо на вывод. Соответственно для портов PB1 и PB4 в регистр DDRx нужно записать 0 и для портов PD0..7 1.

Assembler
1
2
3
4
5
LDI R16, 0x00  ; загрузить 0b00000000 в R16
OUT DDRB, R16  ; Установить порт B на ввод
 
LDI R16, 0xFF  ; загрузить 0b11111111 в R16
OUT DDRD, R16  ; Установить порт D на вывод
Так получаеться?
Заранее извиняюсь за свои ошибки
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
09.11.2014, 14:10 9
Молодец. Ошибок нет. Вот что у нас получилось:
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
.def tmp0 = r16
.def tmp_delay = r17
 
.org 0x0
    rjmp Reset
.org 0x20
 
Reset:    
    ldi tmp0, HIGH(RAMEND)
    out SPH, tmp0
    ldi tmp0, LOW(RAMEND)
    out SPL, tmp0
 
    ldi tmp0, 0x00  ; загрузить 0b00000000 в R16
    out DDRB, tmp0  ; Установить порт B на ввод
 
    ldi tmp0, 0xFF  ; загрузить 0b11111111 в R16
    out DDRD, tmp0  ; Установить порт D на вывод
main:
 
;Задержка  
Delay:
    ldi tmp_delay, 0
Loop_delay:
        inc tmp_delay
        cpi tmp_delay, 255
        brne Loop_delay
    ret
Теперь бы схемку нарисовать, вообще то с неё и надо было начинать, сможешь?
1
Djaswent
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 8
09.11.2014, 14:25  [ТС] 10
Такой вот вопрос, а какую именно схемку? У меня есть нарисованная функциональная схема + куча других в методическом указании к этой работе. Судя по ним, на этом этапе рисовать больше ничего не надо.
0
raxp
10190 / 6573 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
09.11.2014, 15:01 11
...принципиальную.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
09.11.2014, 15:04 12
Цитата Сообщение от Djaswent Посмотреть сообщение
У меня есть нарисованная функциональная схема
А откуда Вы знаете как у Вас светодиоды, кнопки подключены? Как тактируется МК?
0
Djaswent
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 8
09.11.2014, 15:44  [ТС] 13
Как я уже говорил, все есть в методических указаниях. У нас есть готовая плата STK500 с микроконтроллером Atmega8535L, на которую со временем нужно будет залить эту программу. Все необходимые схемы и описания там также присутствуют.
Сылка - http://files.fm/g/orvxayh#aa/MU_LR-AVR-2014k.doc
На всяких случай перешлю все методичку.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
09.11.2014, 15:57 14
Хорошо, убедили.

Не по теме:

я считаю такой подход не правильным, смысл изучение ассемблера абстрагировавшись от железа


Тогда надо определится решаем задачу по дубовому в лоб (через задержки) или как советовал товарищ AlexVRud через прерывания?
В любом случаи найдите частоту на которой работает МК.
Мы на какую оценку работу делаем? Если так проще ответить
0
Djaswent
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 8
09.11.2014, 16:24  [ТС] 15
Да, нужно использовать таймер (тоесть нужна еще подпрограмма обработки прерывания таймера). Нам по сути там нужно сделать сдвиг бита вправо и выждать 1с. Частота у нас 1 МГц.
Если честно, на оценку "Сдать". ) Сама работа должна быть сделана правильно (программа должна выполнять свои функции), а оценка будет зависить от ее защиты.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
09.11.2014, 16:56 16
Таймер так таймер.
Предлагаю такой алгоритм: опрашиваем кнопки каждые 20 мс если кнопка будет нажата не менее 10 циклов, то считать её нажатой и выполнить соответствующие действие.
Возьмем таймер T0 (он самый простой). Выберем режим Normal(прямой счет) и настроем прерывание на переполнение счетного регистра. В этой конфигурации таймер через заданные промежутки времени будет формировать прерывание в котором мы и разместим код.
Для настройки таймера и прерывания Вам понадобятся следующие регистры:
TCNT0
TIFR
TIMSK
TCCR0
Читаем, пробуем написать код инициализации таймера, если не получается спрашиваем.
Пример:
Assembler
1
2
     ldi tmp0, 0x00  ; загрузить TCNT0 
     out TCNT0, tmp0
0
Djaswent
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 8
09.11.2014, 17:01  [ТС] 17
Попробую написать.

Небольшое уточнение:
Светодиоды должны гореть пока мы держим кнопку. Как только мы ее отпускаем, так светдодиоды сразу гасятся.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
09.11.2014, 17:08 18
Предлагаю такой алгоритм: опрашиваем кнопки каждые 20 мс
Флаг кнопки отжаты: если кнопка будет нажата не менее 10 циклов, то считать её нажатой и выполнить соответствующие действие: Зажечь светодиоды. Выставить флаг Флаг кнопка нажата.
Флаг кнопка нажата: если кнопка будет не нажата не менее 10 циклов, то считать её отжатой и выполнить соответствующие действие. "Мигать светодиодами". Выставить флаг Флаг кнопка не нажата.
Не хилый обработчик прерывания получится.
0
Djaswent
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 8
09.11.2014, 17:18  [ТС] 19
Нет, не совсем так.
Если кнопка нажата (И продолжаем держать) - выполнить действие: "мигать светодиодами".
Кнопка SW1 - LED0..7
Кнопка SW4 - LED7..0 - в обратном направлении

Если кнопку отпустили (или не нажата) - выполнить действие: "гасить светодиоды" или ничего не делать.
Там даже не нужны эти циклы

Assembler
1
2
3
4
5
6
7
8
    ldi tmp0,0
    out TCNT0,tmp0
    ldi tmp0,$D8
    out TCCR0,tmp0
    ldi tmp0, 0b11111111
    out TIFR, tmp0          
    ldi tmp0,$02    
    out TIMSK,tmp0
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
09.11.2014, 21:49 20
C TIFR зачем так радикально http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_26.htm
TIMSK почему значение 2? http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_25.htm
TCCR0 не проверял но он не на месте.

Цитата Сообщение от Djaswent Посмотреть сообщение
Там даже не нужны эти циклы
Эти циклы для анти дребезга. Хотя можете и без них сначала написать.
0
09.11.2014, 21:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2014, 21:49

Управление светодиодами (ASM, ATmega8515)
Есть задание Разработать алгоритм и управляющую программу на Ассемблере МК ATmega 8515, в которой...

Последовательное плавное управление яркостью светодиодов
Нужно написать программку на Atmega48 в CodevisionAVR Используя PORTD 0 1 2 С начало загорается...

Последовательное гашение светодиодов на окружности с интервалом
Помогите пожалуйста! Разработать программу, осуществляющую последовательное гашение светодиодов на...


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

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

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