Радиоуправляемая машинка на ATtiny2313

Posted: Ноябрь 3, 2015 in Микроконтроллеры

Давайте сделаем машинку на радиоуправлении. Начнем с простого — пусть будет один моторчик на передние или задние колеса, и ездить она пока сможет только вперед или назад. Поворачивать пока не будем, для этого понадобится поставить на каждое колесо по моторчику, и поворачивать она будет, если моторчики крутятся только с одной стороны. Пульт управления тоже сделаем попозже. Сердцем нашей машинки будет микроконтроллер ATtiny2313, в качестве Н-моста возьмем готовое решение под названием L293D. Скорость будем регулировать при помощи ШИМ, которая создается таймером 0. Вот простейшая схема в Proteus.
Безымянный
Слева находятся две кноки, собственно говоря они и управляют направление движения: верхняя — вперед, нижняя — назад. А дальше я приведу код программы на ассемблере.

.include "tn2313def.inc"

.def temp =R16
.def count =R17

.equ BT_FORWARD =PD2 ;кнопка вперед
.equ BT_BACKWARD =PD3 ;кнопка назад
.equ PWM =128

.cseg
.org 0x00
     rjmp init ;(0х00) переход на инициализацию (начальную настройку)
     rjmp go_forward ;(0х01) внешнее прерывание 0
     rjmp go_bakward ;(0х02) внешнее прерывание 1
     reti ;(0х03)
     reti ;(0х04)
     reti ;(0х05)
     reti ;(0х06)
     reti ;(0х07)
     reti ;(0х08)
     reti ;(0х09)
     reti ;(0х0A)
     reti ;(0х0B)
     reti ;(0х0C)
     reti ;(0х0D)
     reti ;(0х0E)
     reti ;(0х0F)
     reti ;(0х10)
     reti ;(0х11)
     reti ;(0х12)

.org INT_VECTORS_SIZE
init:
     ldi temp,RAMEND ;инициализация стека
     out SPL,temp

     ser temp ;порт В на выход
     out DDRB,temp
     ser temp
     out PORTB,temp

     ldi temp,(1<<PD5) ;все выводы порта D, за исключением PD5, на вход.
     out DDRD,temp ;PD5 на выход
     ser temp ;На всех выводах порта D включены подтягивающие резисторы.
     out PORTD,temp

     ;шим
     ldi temp,(1<<COM0B1|0<<COM0B0|1<<COM0A1|0<<COM0A0|1<<WGM00)
     out TCCR0A,temp
     ldi temp,(0<<CS02|0<<CS01|1<<CS00) ;деление 1
     out TCCR0B,temp ;запуск таймера

     ldi count,0
     out OCR0A,count
     out OCR0B,count

     ;1 настройка прерываний
     ldi temp,(0<<ISC01|1<<ISC00|0<<ISC11|1<<ISC10)
     out MCUCR,temp

     ;2 разрешение прерываний
     ldi temp,(1<<INT1|1<<INT0|0<<PCIE)
     out GIMSK,temp
     sei

main:
     rjmp main

;едем вперед
go_forward:
     sbic PIND,BT_FORWARD ;кнопка нажата
     rjmp stop
     ldi count,0
     out OCR0B,count
     ldi count,PWM
     out OCR0A,count
     reti

;едем назад
go_bakward:
     sbic PIND,BT_BACKWARD ;кнопка нажата
     rjmp stop
     ldi count,0
     out OCR0A,count
     ldi count,PWM
     out OCR0B,count
     reti

;ничего не нажато
stop:
     ldi count,0
     out OCR0A,count
     out OCR0B,count
     reti
Реклама

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s