Страница 1 из 1
Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 14:39:25
drac0Sha
Здравствуйте, столкнулся с такой проблемой
Как необходимость решить работу для микроконтроллеров AVR
Первым делом написать программу на Ассемблере
Но чтобы не изобретать велосипед хотел сначала посоветоваться со знающими людьми по поводу шаблонных вариантов
Я уверен, почти наверняка, что такие задачи уже есть в Интернете, наподобие
Так вот, прошу их реализацию мне скинуть
Если не трудно
Заранее благодарю
Вот пример:
Разработать программу, реализующую генератор изменяемой частоты. Начальная частота 0.5 Гц, т.е. жёлтый индикатор горит 1 с, и 1 с не горит. Нажатие кнопки 1 приводит к увеличению частоты на 40%, нажатие кнопки 2 уменьшает частоту на 40%. Для облегчения замера частот использовать красный и зелёный индикаторы: красный должен мигать с частотой в 10 раз большей основной частоты (желтого индикаторы), а зелёный должен мигать с частотой в 10 раз меньше основной. Одновременное нажатие обеих кнопок должно возвращать генератор в исходное состояние – 0.5 Гц.
Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 15:29:04
conler
Скидывать никто ничего не будет, существует поиск. Кому нужно - тот и ищет.
Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 16:43:35
urry
Курсовые пошли ?
Еще и на асме проценты считать...

Ну-ну...
Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 16:52:39
petrenko
Админы ! Доброе утро, как Вы полагаете, надо ли тему переносить в "Сделайте за меня задание." ?
Это вроде как сезонное явление, да ?
Извините, если невнимательно прочёл, может всё же задача серьёзная..

Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 17:24:03
drac0Sha
Про сделать за меня задание я не слово не написал! Я написал про то, что "скиньте пожалуйста примеры выполненных задач наподобие той, что я скинул".
Надеюсь, на этот раз ВСЕ ВСЁ ПРАВИЛЬНО прочитали!?
Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 17:35:27
ploop
Админы ! Доброе утро, не тормозите, пожалуйста, видимо скоро надо будет не только эту тему переносить в "Сделайте за меня задание."
Не кричите. Тема будет там, где положено, в зависимости от поворота событий

Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 17:51:47
Engineer_Keen
Видите ли drac0Sha, программирование на ассемблере - штука специфическая. Даже изменение одного из чисел в задании может довольно сильно поменять программу. Не говоря уже о различиях в алгоритме ее работы. Для языков высокого уровня принцип копипасты различных кусков кода для решения своей задачи может быть еще бы и прокатил (и то можно потом долго отлавливать глюки в полученном быдлокоде), с ассемблером это так просто не выйдет, нужен некоторый опыт и знание, а судя по заданному вопросу этого как раз нет, так что проще написать программу с нуля. Единственный шанс - если найдется человек, который действительно решал именно такую задачу. В противном случае - вперед, в обучалку.
Re: Задачи по программированию на AVR
Добавлено: Вт окт 09, 2012 19:57:42
korsaj
Вот вам пример генератора 0,5 Гц
Код: Выделить всё
.include "tn13def.inc"
.equ j = 10 ;
;---------------------------------------------
; Биты портов
;---------------------------------------------
.equ b0 = 0
.equ b1 = 1
.equ b2 = 2
.equ b3 = 3
.equ b4 = 4
.equ b5 = 5
.equ b6 = 6
.equ b7 = 7
;---------------------------------------
.org 0x0000
rjmp start
;=====================
; ПП задержки
;=====================
Delay:
ldi r17,j
Loop2:
ldi r18,0x2A
Loop1:
dec r18
brne Loop1
dec r17
brne Loop2
dec r22
brne Delay
ret
;=====================
; Основная программа
;=====================
start:
ldi r20,0b11111111
out DDRB,r20
cli
start1:
ldi r22,100
rcall Delay
sbi PORTB,b0
ldi r22,100
rcall Delay
cbi PORTB,b0
rjmp start1
Re: Задачи по программированию на AVR
Добавлено: Вт окт 16, 2012 17:00:03
drac0Sha
Спасибо большое, что-то попробовал) помогите переделать немного)
Разработать программу, реализующую генератор изменяемой частоты. Начальная частота 0.5 Гц, т.е. жёлтый индикатор горит 1 с, и 1 с не горит.
Нажатие кнопки 1 приводит к тому, что красный индикатор должен мигать каждую секунду,а при нажатии кнопки 2 зелёный индикатор должен мигать каждые 5 секунд
Одновременное нажатие обеих кнопок должно возвращать генератор в исходное состояние – 0.5 Гц.
Спойлер
Код: Выделить всё
.include "m128def.inc"//включение заголовочного файла
.device ATmega128//назначение модели процессора
.equ j = 10 ;
;---------------------------------------------
; Биты портов
;---------------------------------------------
.equ b0 = 0
.equ b1 = 1
.equ b2 = 2
.equ b3 = 3
.equ b4 = 4
.equ b5 = 5
.equ b6 = 6
.equ b7 = 7
;---------------------------------------
.org 0x0000
rjmp start
;=====================
; ПП задержки
;=====================
Delay:
ldi r17,j
Loop2:
ldi r18,0x2A
Loop1:
dec r18
brne Loop1
dec r17
brne Loop2
dec r22
brne Delay
ret
;=====================
; Основная программа
;=====================
start:
ldi r20,0b11111111
out DDRB,r20
cli
start1:
ldi r22,100
rcall Delay
sbi PORTB,b0 ;включаем СИД (желтый)
sbis PinD ;Проверяем нажата ли кнопка уменьшения частоты
rjmp UpSpeed ;Не нажата - переходим в UpSpeed
UpSpeed:
sbic PinD,1 ;проверяем кнопку увеличения частоты
rjmp start1 ;Не нажата - возвращаемся в start1
ldi Counter,2 ;Инициализируем регистр Counter
sbi PORTB,b1 ;Включаем СИД (Красный)
Second: ;секунда задержка
rcall Delay
dec Counter
brne Second
cbi PORTB,b1 ;выключаем СИД (красный)
brne ReleaseUp
ReleaseUp:
sbis PinD,0 ;ждем отпускания кнопки
rjmp ReleaseUp
rjmp DownSpeed ;Нажата - переходим в DownSpeed
DownSpeed:
sbic PinD,1 ;проверяем кнопку увеличения частоты
rjmp DownSpeedOne ;Не нажата
rjmp UpSpeed ;нажата
DownSpeedOne:
ldi Counter,10 ;Инициализируем регистр Counter
sbi PORTB,b2 ;Включаем СИД (зеленый)
FiveSecond: ;5 секунд задержка
rcall Delay
dec Counter
brne FiveSecond
cbi PORTB,b1 ;выключаем СИД (зеленый)
brne ReleaseDown
ReleaseDown:
sbis PinD,0 ;ждем отпускания кнопки
rjmp ReleaseDown
ldi r22,100
rcall Delay
cbi PORTB,b0 ;Выключаем СИД
rjmp start1
korsaj писал(а):Вот вам пример генератора 0,5 Гц
Код: Выделить всё
.include "tn13def.inc"
.equ j = 10 ;
;---------------------------------------------
; Биты портов
;---------------------------------------------
.equ b0 = 0
.equ b1 = 1
.equ b2 = 2
.equ b3 = 3
.equ b4 = 4
.equ b5 = 5
.equ b6 = 6
.equ b7 = 7
;---------------------------------------
.org 0x0000
rjmp start
;=====================
; ПП задержки
;=====================
Delay:
ldi r17,j
Loop2:
ldi r18,0x2A
Loop1:
dec r18
brne Loop1
dec r17
brne Loop2
dec r22
brne Delay
ret
;=====================
; Основная программа
;=====================
start:
ldi r20,0b11111111
out DDRB,r20
cli
start1:
ldi r22,100
rcall Delay
sbi PORTB,b0
ldi r22,100
rcall Delay
cbi PORTB,b0
rjmp start1
Re: Задачи по программированию на AVR
Добавлено: Вт окт 16, 2012 21:24:47
korsaj
Вот это уже другое дело!

Re: Задачи по программированию на AVR
Добавлено: Вт окт 16, 2012 22:09:38
korsaj
Вот исходник моргания 3-х светодиодов. Зеленый - основная частота, Желтый - в 10 раз быстрее, Красный - в десять раз медленнее.
Все что вам остается сделать опрос кнопок, и в зависимости от их состояния менять значение записанное в r22, заменив строку ldi r22,10 на команду загрузки из регистра, в который будет записыватся число на 40% меньше/больше или равное 100%.
Спойлер
;Код: Выделить всё
created by KornilovAF
; at 2012/09/15 - 12:33:21
;---------------------------------------
; AVR_TYPE=<Attyne13>
;---------------------------------------
;---------------------------------------
; constants:
.include "tn13def.inc"
.equ j = 10 ;
;---------------------------------------------
; Биты портов и регистров
;---------------------------------------------
.equ b0 = 0x00
.equ b1 = 0x01
.equ b2 = 0x02
.equ b3 = 0x03
.equ b4 = 0x04
.equ b5 = 0x05
.equ b6 = 0x06
.equ b7 = 0x07
;---------------------------------------
.org 0x0000
rjmp start
;=====================
; ПП задержки
;=====================
Delay:
ldi r17,j
Loop2:
ldi r18,0x2A
Loop1:
dec r18
brne Loop1
dec r17
brne Loop2
dec r22
brne Delay
ret
;=====================
; Настройка
;=====================
start:
ldi r20,0b11111111
out DDRB,r20
cli ;Запрещаем прерывания
ldi r19,10
ldi r20,100
;=====================
; Основная программа
;=====================
start1:
ldi r22,10
rcall Delay ;задержка на 100мС
dec r19 ;Усменьшаем счетчик 10 импульсов
breq GreenLed ;Если равно нулю переходим к обработке зеленого светодиода
St2:
;Иначе поподаем сюда
sbic PINB,b1 ;Светолдиод горит?
rjmp YelLedOff ;Да! Переходим к его гашению
sbi PORTB,b1 ;Нет! Зажигаем его
rjmp St3 ;Переходим к следующиму условию
YelLedOff:
cbi PORTB,b1 ;Гасим светодиод
St3:
dec r20 ;Уменьшаем счетчик 100 импульсов
brne start1 ;Если неравно нулю переходим к началу нашего цикла
ldi r20,100 ;Иначе обновляем счетчик 100 импульсов
sbic PINB,b2 ;Светолдиод горит?
rjmp RedLedOff ;Да! Переходим к его гашению
sbi PORTB,b2 ;Нет! Зажигаем его
rjmp start1 ;Переходим к началу нашего цикла
RedLedOff:
cbi PORTB,b2 ;Гасим светодиод
rjmp start1 ;Переходим к началу нашего цикла
GreenLed:
ldi r19,10 ;Обновляем счетчик 100 импульсов
sbic PINB,b0 ;Светолдиод горит?
rjmp GreenLedOff ;Да! Переходим к его гашению
sbi PORTB,b0 ;Нет! Зажигаем его
rjmp St2 ;Переходим к следующиму условию
GreenLedOff:
cbi PORTB,b0 ;Гасим светодиод
rjmp St2 ;Переходим к следующиму условию
Ну а вот архив с проектом в АврСтудио и Протеус.
Re: Задачи по программированию на AVR
Добавлено: Чт окт 18, 2012 19:59:46
drac0Sha
korsaj, спасибо, что помогаете!
Вот у меня появился вопрос.
Пользуюсь AVR Studio 6.0. Создаю проект - AVR Assembler project - выбираю device (ATmega128). Дальше пишу туда код и делаю debug. Как я могу посмотреть, что у меня загорается желтый, красный, зеленый. Не могу найти где это находится.. Подскажите, пожалуйста.
Re: Задачи по программированию на AVR
Добавлено: Чт окт 18, 2012 21:52:20
korsaj
Поставте себе Proteus. В архиве, который я в вас кинул есть проект (схема) для протеуса. В ней все видно )
http://eldigi.ru/site/prog/1.php
Re: Задачи по программированию на AVR
Добавлено: Пт окт 19, 2012 16:29:33
drac0Sha
Поставил, удобная программа) Но вот я никак не могу понять: как создать кнопки. В коде писал строчку :
sbic PinD ;проверяем кнопку - сразу ругается.. Как создать подскажите, пожалуйста.
И я еще не много не понял про
korsaj писал(а):в зависимости от их состояния менять значение записанное в r22, заменив строку ldi r22,10 на команду загрузки из регистра, в который будет записыватся число на 40% меньше/больше или равное 100%.
Re: Задачи по программированию на AVR
Добавлено: Пт окт 19, 2012 20:50:46
korsaj
sbic PIND,0
где 0 - это номер порта к которому подключена кнопка.
Re: Задачи по программированию на AVR
Добавлено: Пт окт 19, 2012 21:45:03
drac0Sha
Ну вот я написал:
Код: Выделить всё
start1:
ldi r22,10
rcall Delay
sbic PIND,3
dec r19
breq GreenLed
По этой картинке порты 3 и 4 свободны ( я так понимаю это PB3 и PB4), но он выдает ошибку при компиляции.
Undefined symbol:PIND
Re: Задачи по программированию на AVR
Добавлено: Сб окт 20, 2012 15:04:38
korsaj
))
Чудите вы! )
У Attiny 13 есть только один порт - PORTB, соответственно и регистр входов - PINB.
А компилятор вам кричит, что слово PIND не описано.
В архиве реализовано две кнопки, вам остается реализовать одновременное нажатие.