roboforum.ru

Технический форум по робототехнике.


Помогите с написанием программы

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Помогите с написанием программы

Сообщение aliens » 26 окт 2004, 17:00

Помогите пожалуйста! Как в ассемблере включить ногу на прием и если на ней пояляется еджиница то перейти туда то.

И подскажите сайты или электронные книги по ассемблеру для авр.

Спасибо :oops:
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение setar » 26 окт 2004, 17:53

вот отправная точка, здесь руские описалова.


здесь примеры прог на английском, очень поучительно!

вот здесь некоторые статьи переведены

ну а по вашему вопросу примерно так :

Код: Выделить всёРазвернуть
;* Определения
def  t       = r16 ; переменная
.equ key0    = PB3 ; кнопка0  на PB3
.equ key1    = PB4 ; кнопка1  на PB4

cbi DDRB, key0  ; настройка на вход
cbi DDRB, key1  ; настройка на вход
sbi PORTB, key0 ; включить подтягивающий резистор (активный сигнал будет масса)
sbi PORTB, key1 ; включить подтягивающий резистор (активный сигнал будет масса)

;.......

sbis PINB,key0  ; так мы увеличиваем
inc t          ; или уменьшаем t при нажатии key0 и key1
sbis PINB,key1  ; если ничего не нажато - пропускаем
dec t

;.......



Delay:    
dec t                 ; задержка по счетчику от t до 0
brne Delay            ;  t*3 тактов

;.......


Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Спасибо

Сообщение aliens » 27 окт 2004, 09:17

А если у меня не кнопки, а другой мк??? при появлении 1 перейти к осн проге и чтобы это всегда отслеживалось (уровень)
Реально?? :roll:
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение setar » 27 окт 2004, 11:21

Да всё реально, если подумать то  :wink:
опять же обращаемся к первоисточнику примеров от atmel
и выбираем желаемый интерфейс связи, это может быть :
  • UART - AVR304  ; AVR305 ; AVR306
  • I2C - доки AVR310 ; AVR311 ; AVR312 ; AVR315
  • стандартный ISP (по которому пограммируете) - AVR320
  • если очень быстро нужно и ног много, то можно параллельный порт сварганить - AVR325
  • или даже извернуться и устроить канал по одному проводу , по стандарту Dallas 1-Wire® - AVR318
  • в простейшем варианте , если передаётся 1бит события (то что видимо у вас имеет место) можно использовать режим обработки внешнего прерывания от ноги, это можно посмотреть в документе AVR182.
    Там используется внешнее прерывание для запуска подпрограмммы.
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

А как сделать

Сообщение aliens » 27 окт 2004, 14:14

Помогите тогда рассчитать другое. У меня с робоклуба есть ик датчик переделаный на 2313 а время импульса как настроить под 4мгц??

Или если ставит 1 мгц RC цепь какие значения??
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение setar » 27 окт 2004, 17:22

вообще очень просто : 1 такт выполняется за определённое время
для 1MHz это 1/1000000 = 0.000001с = 0.001мс
для 4MHz это 1/4000000 = 0.00025мс

соответственно считаете необходимое количество циклов.

вот примекры циклов задержки:
Код: Выделить всёРазвернуть
Delay:    
NOP
NOP
NOP
NOP
NOP
NOP
NOP
dec t ;задержка по счетчику от t до 0
brne Delay ;т.е. t*10 тактов


Код: Выделить всёРазвернуть
Delay:    
dec t ;задержка по счетчику от t до 0
brne Delay ;т.е. t*3 тактов


Про RC цепь не понял, в каком именно проекте вы её пересчитываете.

вот софтинка которая помогает не прибегать к помощи калькулятора,
позволяет посчитать значения которыми нужно предзарузить счётчик таймера для реакции по его переполнению.
Вложения
AvrCalc.rar
AVR калькулятор
(20.4 КиБ) Скачиваний: 323
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение aliens » 27 окт 2004, 17:29

Имею ввиду номиналы резистора и конденсатора чтобы получить 1 мгц
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение aliens » 29 окт 2004, 02:09

Я нашел кусок программы про задержки (что я спрашивал)

;* Задание значений


.equ  TIME1   =  4 ;длительность импульса

.equ  TIME2   =  5 ;задержка между импульсами

.equ  TIME3   =  20 ;задержка между пачками импульсов

.equ  COUNT   =  10 ;число импульсов в пачке


Вот это значения для 1 мгц, а надо для 4 мгц (по твоим выше подсчетам мне приходит на ум все умножить на 25)
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение setar » 29 окт 2004, 12:16

Анализируем задержки :
Код: Выделить всёРазвернуть
ldi temp, TIME1 ;загружаем в temp длительность импульса           
Delay1:
dec   temp        ;уменьшаем на единицу temp, пока
brne Delay1      ;  не станет равным 0

Здесь задержка = 4(цикла)*0.001мс(такт)*3(тактов в цикле) = 0.012мс
для  4MHz потребуется X=0.012/(3*0.00025)= 16 циклов

Код: Выделить всёРазвернуть
ldi temp, TIME2 ;загружаем в temp длительность паузы между импульсами

Delay2:
dec  temp         ;уменьшаем на единицу temp, пока
brne Delay2      ;  не станет равным 0


Аналогично задержки по TIME1 просто умножаем на 4

Код: Выделить всёРазвернуть
Delay3:
dec t1               ;задержка по счетчику t1 от 256 до 0
brne Delay3      ;   т.е. 256*3 тактов
dec temp          ;повторяем TIME3 раз задержку по t1
brne Delay3  ;   т.е. всего  (TIME3*256*3 + TIME3*3) тактов

здесь имеем 20*256*3+20*3=15420 циклов,
нам нужно 15420*4 циклов
следовательно TIME3=(15420*4)/(256*3+3) = 80

:wink: как видим твоя интуитивная догадка почти верна, всё нудно умножить на 4. Однако если бы число превысило 255 тогда сам код задержек пришлось бы переделывать.
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение setar » 29 окт 2004, 12:22

aliens писал(а):Имею ввиду номиналы резистора и конденсатора чтобы получить 1 мгц

нифига не понял... в схеме всего один конденсатор, и тот сглаживающий.
А если вы хотите заменить кварц RC цепочкой, то лучше этого не делать.
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение aliens » 29 окт 2004, 14:03

А почему RC лучше не использовать?? :?:
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение setar » 29 окт 2004, 15:59

aliens писал(а):А почему RC лучше не использовать?? :?:

зависимость от напряжения появляется, а оно в процессе работы имеет свойство уменьшаться
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение aliens » 29 окт 2004, 23:38

А как сделать вход, чтобы активный сигнал был + от другого мк??
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение aliens » 30 окт 2004, 01:58

Вот тут вспомнил еще 2 вопроса

Как сделать задержку допустим 5 секунд??
и как сделать чтобы переменной случайно присваивалось значение (типа как random на си)
:D  :roll:
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение Виталий » 01 ноя 2004, 21:00

А вот это открытый вопрос, я пока не знаю.


В GCC есть такая функция...
А в остальных не знаю, я сам писал...
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15