roboforum.ru

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

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

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

aliens » 26 окт 2004, 17:00

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

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

Спасибо :oops:

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 перейти к осн проге и чтобы это всегда отслеживалось (уровень)
Реально?? :roll:

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

:wink: как видим твоя интуитивная догадка почти верна, всё нудно умножить на 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 на си)
:D  :roll:

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

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


В GCC есть такая функция...
А в остальных не знаю, я сам писал...


Rambler\'s Top100 Mail.ru counter