Страница 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
Админы ! Доброе утро, как Вы полагаете, надо ли тему переносить в "Сделайте за меня задание." ?
Это вроде как сезонное явление, да ?
Извините, если невнимательно прочёл, может всё же задача серьёзная.. :dont_know:

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 не описано.

В архиве реализовано две кнопки, вам остается реализовать одновременное нажатие.