AVR Studio (AtMega) — видео для начинающих

noimage.jpg

Внизу представлено обучающее видео по работе с микроконтроллерами. Процедура от поиска и скачивания программ, до создания своего проекта, меньше чем за 27 минут. Видео состоит из двух частей. Надеемся, что данное видео поможет в освоении микроконтроллеров.
Работу программы можно эмулировать в Proteus.
Если на PC есть LPT порт (25 контактный для принтера) то ищите схемку программатора на 5 проводков — и желательно что бы она работала с \»PonyProg\» софт для прошивки. Если только USB — ATMEL AVR-910.
На реальном железе нужно вначале всё хорошо просчитать, а только потом браться за паяльник, а то можно и МК спалить и порты.Внизу представлено обучающее видео по работе с микроконтроллерами. Процедура от поиска и скачивания программ, до создания своего проекта, меньше чем за 27 минут. Видео состоит из двух частей. Надеемся, что данное видео поможет в освоении микроконтроллеров и заинтересует начинающих радиолюбителей. Работу программы можно эмулировать в Proteus, непосредственно через интерфейс Windows.
Если на PC есть LPT порт (25 контактный для принтера) то ищите схемку программатора на 5 проводков — и желательно что бы она работала с \»PonyProg\» софт для прошивки. Если только USB — ATMEL AVR-910.
На реальном железе нужно вначале всё хорошо просчитать, а только потом браться за паяльник, а то можно и МК спалить и порты.

[attachment=1]

Выкладываю код программы \»Светофор\» с описанием, для самообучения. Можно написать своё решение, используя прграмму Flowcode AVR.
Это среда разработки, позволяющая составлять программу в виде обычной блок-схемы.

.include "C:\\Program Files\\Atmel\\AVR Tools\\AvrAssembler\\Appnotes\\m128def.inc"

.cseg
.org 0
 jmp RESET



RESET:ldi r16,high(RAMEND) 
   out SPH,r16     
   ldi r16,low(RAMEND)
   out SPL,r16
  

main: 

ldi r16,(1<<PB4)|(1<<PB0)
; PBx - пины PORTB. Записываем в регистр r16 информацию о состоянии пинов PORTB. 
; Теперь регистр r16 будет хранить информацию о том, что нужно подать 1 на нулевой и четвёртый пины PORTB. 
; Когда в некоторые биты регистра будет записан 1, на соответствующих пинах порта B выходе будет 1.
;  По умолчанию состояние всех битов 0, т.е. на всех пинах порта B стоит 0.
; Визуальный эффект операции  отсутствует.
; !!! В порт напрямую можно записывать только состояние регистра!
; Поэтому то, что нужно записать в порт, записывай в регистр, а потом этот регистр записывай в порт!

ldi r17,(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
; DDRx - пины DDRB. Записываем в регистр r17 информацию о состоянии пинов DDRB. 
; Теперь регистр r17 будет хранить информацию о том, что нужно подать 1 на нулевой, первый и второй пины DDRB. 
; Когда в некоторые биты регистра будет записан 1, соответствующие пины порта B  будут сконфигурированы на выход. 
; По умолчанию состояние всех битов 0, т.е. на всех пинах порта B стоит 0.
; Визуальный эффект операции  отсутствует.
; !!! В порт напрямую можно записывать только состояние регистра! 
; Поэтому то, что нужно записать в порт, записывай в регистр, а потом этот регистр записывай в порт!


out PORTB,r16
; выводим на PORTB то, что было записано в регистр r16. 
; Визуальный эффект: на соответствующих выходах появится логический уровень 1.

out DDRB,r17
; выводим на DDRB то, что было записано в регистр r17.
; Визуальный эффект: Вступает в силу установленная ранее конфигурация пинов порта B на вход и выход.

nop
; пустая команда, используемая в качестве задержки длительностью 1 цикл, чтобы все изменения успели вступить в силу, 
; так как на это одного цикла не достаточно, требуется полтора цикла.

clr r16
; Очищаем состояние 16 регистра.

ser r16; 
out PINB,r16 ; 
nop; 
step:
; метка с именем "step" По правилам синтаксиса после имени метки ставится двоеточие.

sbis PINB,PORTB4 
; Команда проверяет состояние бита в четвёртом регистре порта B и, если этот бит установлен, пропускает следующую команду.
; То есть, если состояние всех регистров PINB совпадает с состоянием всех регистров PORTB4, то следующая команда "rcall step1" не будет выполнена,
; и процессор перейдёт сразу к следующей за ней команде, в противном случае команда "rcall step1" будет выполнена.

rcall step1 
; переход к подпрограмме "step1"

rjmp step 
; переход к метке "step"

step1: 
; начало подпрограммы "step1"

    ldi r24,3
	; запись в регистр r24 числа 3. 
	; На деле это будет означать, что нулевой и первый биты этого регистра примут значение 1. 
	; Если число 3 перевести в двоичную форму, то будет 00000011, поэтому первый и нулевой биты примут значение 1.
	; Каждому биту регистра соответствует своё число:
	; 0 - 1
	; 1 - 2
	; 2 - 4
	; 3 - 8
	; 4 - 16
	; 5 - 32
	; 6 - 64
	; 7 - 128
	; Вывод: чтобы установить биты 0 и 1 в лог. уровень 1 , надо сложить числа, которые им соответствуют: 1+2=3.

green:
	ldi r16,$10
	; в регистр r16 загружается число 10 в шестнадцатеричной форме, т.е 16 в десятичной форме, 
	; т.е четвёртый бит регистра переходит в лог. 1.

	out PORTB,r16; было

    rcall d500ms 
	; переход к подпрограмме "d500ms" (подпрограмма задержки на 500 миллисекунд)

    ldi r16,$11; было
	out PORTB,r16; было
	
	rcall d500ms; было

	sbiw r24,1
	; Вычитание единицы из регистра r24 и запись результата в этот же регистр.

	brne green
	; Если результат предыдущей операции не равен нулю, то есть если значение регистра r24 не равно нулю, тогда перейти к метке "green".
	; Таким образом организуется цикл, причём до тех пор, пока содержимое регистра r24 не станет равным нулю.



rjmp main

d05ms:
wdr
ldi YL,low(497)
ldi YH,high(497)
d05_1: sbiw YL,1
brne d05_1
ret


d500ms:
ldi XL,low(1000)
ldi XH,high(1000)

d500_1: rcall d05ms
sbiw XL,1
brne d500_1

ret

; Программа контроля работы светофора
;===========================================================


.include "C:\\Program Files\\Atmel\\AVR Tools\\AvrAssembler\\Appnotes\\m128def.inc"

.cseg
.org 0
 jmp RESET



RESET:ldi r16,high(RAMEND) 
   out SPH,r16     
   ldi r16,low(RAMEND)
   out SPL,r16
  
;=====================================================================
;  Установка начального состояния
;=====================================================================
; В начальном состоянии горит зелёный сигнал светофора
; соответсвенно необходимо установить необходимые  значения в регистры
; порта В 

main: 
ldi r16,(1<<PB4)|(1<<PB0)
ldi r17,(1<<DDB2)|(1<<DDB1)|(1<<DDB0)

out PORTB,r16
out DDRB,r17

nop
clr r16
ser r16
out PINB,r16
nop
step:
sbis PINB,PORTB4
rcall step1
rjmp step

step1: 
    ldi r24,3

green:
	ldi r16,$10
	out PORTB,r16

    rcall d500ms

    ldi r16,$11
	out PORTB,r16
	
	rcall d500ms

	sbiw r24,1
	brne green



rjmp main
;=====================================================================
; подпрограмма задержки на 0.5ms
;=====================================================================

d05ms:
wdr
ldi YL,low(497)
ldi YH,high(497)
d05_1: sbiw YL,1
brne d05_1
ret


;=====================================================================
; подпрограмма задержки на 500ms
;=====================================================================
d500ms:
ldi XL,low(1000)
ldi XH,high(1000)

d500_1: rcall d05ms
sbiw XL,1
brne d500_1

ret
.include "C:\\Program Files\\Atmel\\AVR Tools\\AvrAssembler\\Appnotes\\m128def.inc"

.cseg
.org 0
 jmp RESET



RESET:ldi r16,high(RAMEND) 
   out SPH,r16     
   ldi r16,low(RAMEND)
   out SPL,r16

;*************************************************************************************************************************


main: 		; начало основной программы.
ldi r16,7	; взводит 0, 1 и 2 биты в регистре r17.
out DDRB,r16

ldi r20,1	; взводит нулевой бит в регистре r20.
out PORTB,r20	; подаёт на выход содержимое регистра r20(включает первый светодиод).
call wait500ms	; вызывает программу ожидания.

ldi r20,2	; взводит первый бит в регистре r20.
out PORTB,r20	; подаёт на выход содержимое регистра r20(включает второй светодиод).
call wait500ms	; вызывает программу ожидания.

ldi r20,4	; взводит второй бит в регистре r20.
out PORTB,r20	; подаёт на выход содержимое регистра r20(включает третий светодиод).
call wait500ms	; вызывает программу ожидания.

jmp main	; переход к началу основной программы.



wait500ms:	; начало подпрограммы ожидания.
ldi XL,low(30)  ; загружаем в регистр количество тактов, определяющее время ожидания.
ldi XH,high(30)	; загружаем в регистр количество тактов, определяющее время ожидания.

d500:		; метка d500
sbiw XL,1 	; Отнимает из содержимого XL единицу и если результат операции равен нулю, устанавливает Z флаг.
brne d500 	; Если результат предыдущей команды не равен нулу, переходит на метку d500.

ret       	; Выход из подпрограммы.


;*************************************************************************************************************************

(Просмотрено 1148 раз)

0
0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Top