Пропорциональное управление на МК (Знание=Сила)

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

rcall вызов подпрограммы
ret выход из подпрограммы
для того что бы эта команда смогла работать ей нужно выделить место в ОЗУ для сохранения данных об адресах пзу

Стек это область в ОЗУ, как раз для этого предназначнная

Код: Выделить всё

ldi Temp,RamEnd  ;загрузить в Темп адрес последней ячейки ОЗУ
out SPL,Temp     ;вывести в SPL значение из Temp
***
про флаги и регистр SREG ни чего не знаю ( в обучалке вроде нету) сейчас погуглю...

нагуглил - http://controllersystems.com/books/prak ... -sreg.html
....вкуриваю
не зная броду не лезь к вольтмоду
Реклама
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

теперь и про регистр SREG и его флаги прочитал тоже.
Последний раз редактировалось uwrtey Вт авг 21, 2012 18:18:44, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
Реклама
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

опрос клавиатуры сделали, записали полученные данные в массив (в ОЗУ)
а как теперь определить, какая кнопка нажата ?
опять придется сравнивать значения из массива записанного в ОЗУ с данными из массива который находится в ПЗУ.
как то так ?

Код: Выделить всё


certain_buttons_keyboard:

	ldi temp1,5			; УСТАНОВИМ СЧЕТЧИК	

	
                  			; загружаем адрес метки (key_buff) находящейся в ОЗУ в регистровую пару "Z"
	ldi ZL,low (key_buff)		; младший байт адреса
	ldi ZH,high(key_buff)		; старший байт адреса 

Certain_button:

	ld Temp,Z+			; загрузим данные в регистр из ОЗУ по адресу из регистровой пары "Z", 
					; при этом адресс в регистровой паре автоматически увеличится на едениуц

	.....				; тут должен быть код (или вызов подпрограаммы) который определит какая кнопка нажата
                                       
	
	dec temp1			; уменьшим счетчик
	brne Certain_buttons		; если не все, то циклимся
	
	ret	                   ; выход из подпрограмы certain_buttons_keyboard
	
или есть способ который покороче ?
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

uwrtey писал(а):опрос клавиатуры сделали, записали полученные данные в массив (в ОЗУ)
а как теперь определить, какая кнопка нажата ?
а что тебе не понятно ?
первый байт буфера - первая линия кнопок
второй байт - вторая
и так далее..

например чтобы определить в программе нажата ли вторая кнопка третьего ряда (если у тебя эта кнопка подразумевает какое то действие) нужно будет написать примерно следующее:

Код: Выделить всё

LDS temp , (key_buffer+2)
; нажатая кнопка у нас 0 или 1 ? по идее 0 должен быть :-)
sbrc temp , 1   ; проверяем второй бит справа
rjmp  exit   ; кнопка не нажата
; здесь обрабатываем нажатую кнопку
идем дальше,
у нас все кнопки идентифицируются однозначно, причем мы обработали все нажатые\отжатые кнопки

для передачи нам даже не нужно ничего изобретать - просто передадим состояние каждой кнопки !
у нас 4 бита из каждого из 5 байт=20 бит информации для передачи

теперь нужно придумать как их передать :-)

что ты знаешь о прерываниях ?
теперь нам нужны будут таймеры (16ти разрядный Т1) и работа с ним в прерываниях


p.s. весь асм код который я пишу обязательно разбирай по командно: сейчас вот новая команда sbrc

p.p.s задание на дом: как модифицировать код проверки нажатия конкретной кнопки если у нас нажатая кнопка генерит не "0", а "1" в считанном коде ?
Реклама
Эиком - электронные компоненты и радиодетали
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

теперь по формату передачи:

первое ограничение: по радиотракту - ограничим передаваемую частоту например 3 кгц..

передавать можно разными способами,

например: передаем импульс, далее если нужно передать "1" то делаем паузу T, если нужно передать"0" делаем паузу 2Т, потом снова передаем импульс, и снова паузу в зависимости от передаваемого бита.. и так будем передавать все биты

в конце, для того чтобы приемник мог проверить правильность принятых данных передадим один бит четности....

длинна импульса тоже Т

вот для этого нам и нужен будет таймер....

кстати какой частоты в твоем проекте кварц ? (частота тактирования тиньки)
Реклама
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

ВитГо писал(а):p.s. весь асм код который я пишу обязательно разбирай по командно
конечно разбираю все по пунктам! если что не понятно то гуглю или тут спрашиваю
ВитГо писал(а):задание на дом: как модифицировать код проверки нажатия конкретной кнопки если у нас нажатая кнопка генерит не "0", а "1" в считанном коде ?
= sbrs :)

Код: Выделить всё

LDS temp,(key_buffer+2)   ; допустим теперь нажатая кнопка "0" 
sbrs temp,1                       ; проверяем второй бит справа
rjmp  exit                          ; кнопка не нажата
                                        ; здесь обрабатываем нажатую кнопку
ВитГо писал(а):а что тебе не понятно
ВитГо писал(а):идем дальше,
у нас все кнопки идентифицируются однозначно, причем мы обработали все нажатые\отжатые кнопки
для передачи нам даже не нужно ничего изобретать - просто передадим состояние каждой кнопки !
у нас 4 бита из каждого из 5 байт=20 бит информации для передачи
вот тут и не понятно - как должен выглядеть код на выходе из МК ( я в прошлом посте видимо вопрос задал не корректно )
(какую информацию он должен передавать?)
....все дошло, Ты же на прошлой странице все объяснил. :oops:
ВитГо писал(а):кстати какой частоты в твоем проекте кварц ? (частота тактирования тиньки)
без разницы. в наличии есть кварцы на 20мгц
ВитГо писал(а):первое ограничение: по радиотракту - ограничим передаваемую частоту например 3 кгц..
максимальная частота прямоугольных импульсов на входе передатчика 6 кГц из датащита
не зная броду не лезь к вольтмоду
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

по радиотракту: ну максимум он и есть максимум, возьмем золотую середину, потом, когда заработает - увеличим частоту

по тактированию тиньки с кварцем 20 мгц:

нам нужно формировать импульсы и паузы минимальной длительностью
1\3000*2 = 1\6000 = 0.00016 сек = 0.16 мс = 160 мкс

счетчик кварца может считать с предделителями (ты уже начал читать про Т1?)
для простоты попробуем посчитать с предделителем = 1

1\20 000 000 мгц=0.05 мкс - длительность одного "тика" счетчика

160 мкс \ 0.05 мкс\1тик = 3200 тиков счетчика на передачу одного импульса или паузы

то есть время T которое мы выводили в прошлом посте про длительности импульсов будет длиться 3200 тиков таймера Т1
соответственно 2T будет длиться 6400 тиков

теперь нужно подумать в какой режим нужно получить от таймера T1.

первый режим таймера это просто счет.. от 0 до 65535, потом опять 0 и опять до 65535 - режим простой, но нам не интересный: придется в программе сидеть и ждать нужного момента, потом дергать ножкой, и опять сидеть и ждать

гораздо интереснее режим СТС с заданием вершины счета в регистре OCR1A
в этом случае таймер считает от 0 до значения установленного нами в OCR1A, и когда это происходит - генерирует прерывание чтобы мы могли в этот момент сделать что-то нам нужное, причем одновременно, таймер начинает снова считать с 0.. (сбрасывает текущий счетчик) - этот метод гораздо точнее будет измерять временные промежутки чем первый режим (для нашей задачи такая точность конечно мало важна)
нам придется в прерывании лишь дернуть ножкой и задать новое значение длительности в OCR1A для передачи

дополнительно, к вышеуказанному режиму можно включить опцию чтобы таймер САМ ПЕРЕКЛЮЧАЛ НОГУ ТИНЬКИ из одного состояние в другое ! нам самим не придется дрыгать ножкой вручную, и так же при автоматическом переключении мы получим просто кварцованную точность на выводе тиньки по частоте.. (еще раз повторюсь: для твоего проекта это не особо нужно, а вот например для моего где я генерирую программно вывод на телевизор видеосигнала это очень важно, так как ошибка даже в 1 мкс в длительности импульса приводит к искажению изображения или даже срыву синхронизации)

теперь открывай datasheet на свой контроллер и смотри как настроить T1 чтобы он работал так как я описал (подсказка: это раздел 16 bit Timer/Counter, далее подраздел 16 bit Timer/Counter Register Description (он последний в списке подразделов таймера)

нужно установить следующие регистры
TCCR1A
TCCR1B
TCNT1
OCR1A
TIMSK

потом посмотри а на какой же все таки ноге будут генерироваться импульсы?
и потом посмотри на свою схему - не задействован ли этот архинужный нам для передачи вывод какой нить другой фигней (которую нужно будет перебросить на другой вывод и соответственно переписать код этой другой фигни чтобы все работало правильно :shock: )

справишься ?

p.s. заодно для себя на будущее делаем вывод что начинать продумывать схему нужно одновременно с продумыванием как именно функционал мы будем реализовывать программно.
как пример подобной ошибки в проектирования (чтобы ты не думал что только ты так ошибс :))) я ) могу привести такую промышленно изготавливаемую аппаратуру, там генерировать импульсы приходиться вручную, так как нужный для этого вывод разведен на какую то фигню типа кнопки - кто допустил такой ляп трудно сказать, то ли схемотехники рулили и сделали как им удобно, то ли программисты не подсказали первым как сделать более правильно..
ошибка конечно не смертельная, но делать вручную то что контроллер сделает сам в автоматическом режиме я считаю не умным :evil:
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

ВитГо писал(а):например: передаем импульс, далее если нужно передать "1" то делаем паузу T, если нужно передать"0" делаем паузу 2Т, потом снова передаем импульс, и снова паузу в зависимости от передаваемого бита.. и так будем передавать все биты
в конце, для того чтобы приемник мог проверить правильность принятых данных передадим один бит четности....
длинна импульса тоже Т
так? Изображение
график.gif
(2.3 КБ) 749 скачиваний
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

угу

это как один из вариантов (тебе же нужно параллельно несколько команд передавать)...
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

таймер т1 это timer 1 comp1 ?
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

таймер 1 это timer 1

comp - это от сокращение compare, сравнение
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

Изображение
шепотом - какой из них ? (правда это at90s2313
а у меня attiny2313
страница 43 http://www.promelec.ru/pdf/ATTINY2313.pdf
Последний раз редактировалось uwrtey Ср авг 22, 2012 21:14:36, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

это таблица прерываний

по таймеру
4, timer 1 capt1, capture event - прерывание по захвату - это кстати наверно будем использовать в приемнике :-)
5, timer1 comp1, compare match - это прерывание по сравнению (наше!)
6, timer 1 ovf, overflow - переполнение таймера (переход с 65535 в 0)
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

почитай со стр.82 даташит

там на английском конечно, но в принципе многое понятно...
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

да attiny 2313 имеется в наличии пара (может четыре ) штук
купил их давно так как обучалка http://radiokot.ru/start/mcu_fpga/avr/ сделана для предшественника (at90s2313)
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

стр. 82 даташита

там диаграмма счетчика 1

входы \ выходы смотреть по стрелкам

какие выходы видишь ?
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

ВитГо писал(а):нам нужно формировать импульсы и паузы минимальной длительностью
1\3000*2 = 1\6000 = 0.00016 сек = 0.16 мс = 160 мкс
У тебя опечатка 1/(3000*2)=1/6000 :)
прокомментируй пожалуйста что зачат эти цифры ?
какие выходы видишь ?
выходы OCnA и OCnB? (15 и 16 ножки микросхемы ?)
Последний раз редактировалось uwrtey Чт авг 23, 2012 20:21:09, всего редактировалось 2 раза.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

uwrtey писал(а):
ВитГо писал(а):нам нужно формировать импульсы и паузы минимальной длительностью
1\3000*2 = 1\6000 = 0.00016 сек = 0.16 мс = 160 мкс
У тебя опечатка 1/(3000*2)=1/600 :)
прокомментируй пожалуйста что зачат эти цифры ?
гм.. где опечатка ?
вроде нет...

3000 гц это частота следования импульсов на передатчик
1\3000 - это перевод гц в с - то есть мы от значения частоты переходим к значению длительности

между импульсами есть паузы.. следовательно 3000 раз в секунду мы на передатчик отправляем импульс и паузу после него..

нам нужно отправить импульс и паузу,
поэтому 1\(3000+3000)=0.00016 сек=160 мкс - длится по времени импульс или пауза при передаче их с частотой 3000 гц.. (там будет небольшая ошибка округления при делении, но для наших целей она не важна)

как еще понятнее написать не знаю.. рисовать нужно :-)
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

uwrtey писал(а): выходы OCnA и OCnB? (15 и 16 ножки микросхемы ?)
угу.. давай на 15ой остановимся OC1A..

а у тебя что на ней висит ?
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

все понятно! все очень подробно!
опечатка в том что нет скобочек 1/3000*2=0,0006666666 а 1/(3000*2) = 0,0001666
Что у тебя на ней висит?
http://radiokot.ru/forum/download/file.php?id=90498
- клавиатура :oops: (надо переделать...)
Последний раз редактировалось uwrtey Ср авг 22, 2012 21:33:33, всего редактировалось 2 раза.
не зная броду не лезь к вольтмоду
Ответить

Вернуться в «Периферия»