Технический форум по робототехнике.
aliens » 26 окт 2004, 17:00
Помогите пожалуйста! Как в ассемблере включить ногу на прием и если на ней пояляется еджиница то перейти туда то.
И подскажите сайты или электронные книги по ассемблеру для авр.
Спасибо
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 тактов
;.......
aliens » 27 окт 2004, 09:17
А если у меня не кнопки, а другой мк??? при появлении 1 перейти к осн проге и чтобы это всегда отслеживалось (уровень)
Реально??
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.
Там используется внешнее прерывание для запуска подпрограмммы.
aliens » 27 окт 2004, 14:14
Помогите тогда рассчитать другое. У меня с робоклуба есть ик датчик переделаный на 2313 а время импульса как настроить под 4мгц??
Или если ставит 1 мгц RC цепь какие значения??
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
aliens » 27 окт 2004, 17:29
Имею ввиду номиналы резистора и конденсатора чтобы получить 1 мгц
aliens » 29 окт 2004, 02:09
Я нашел кусок программы про задержки (что я спрашивал)
;* Задание значений
.equ TIME1 = 4 ;длительность импульса
.equ TIME2 = 5 ;задержка между импульсами
.equ TIME3 = 20 ;задержка между пачками импульсов
.equ COUNT = 10 ;число импульсов в пачке
Вот это значения для 1 мгц, а надо для 4 мгц (по твоим выше подсчетам мне приходит на ум все умножить на 25)
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
как видим твоя интуитивная догадка почти верна, всё нудно умножить на 4. Однако если бы число превысило 255 тогда сам код задержек пришлось бы переделывать.
setar » 29 окт 2004, 12:22
aliens писал(а):Имею ввиду номиналы резистора и конденсатора чтобы получить 1 мгц
нифига не понял... в схеме всего один конденсатор, и тот сглаживающий.
А если вы хотите заменить кварц RC цепочкой, то лучше этого не делать.
aliens » 29 окт 2004, 14:03
А почему RC лучше не использовать??
setar » 29 окт 2004, 15:59
aliens писал(а):А почему RC лучше не использовать??
зависимость от напряжения появляется, а оно в процессе работы имеет свойство уменьшаться
aliens » 29 окт 2004, 23:38
А как сделать вход, чтобы активный сигнал был + от другого мк??
aliens » 30 окт 2004, 01:58
Вот тут вспомнил еще 2 вопроса
Как сделать задержку допустим 5 секунд??
и как сделать чтобы переменной случайно присваивалось значение (типа как random на си)
:roll:
Виталий » 01 ноя 2004, 21:00
А вот это открытый вопрос, я пока не знаю.
В GCC есть такая функция...
А в остальных не знаю, я сам писал...