Пропорциональное управление на МК (Знание=Сила)
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
себе в помощь
http://radiokot.ru/circuit/digital/automat/23/
http://radiokot.ru/circuit/digital/game/18/
и не очень
http://radiokot.ru/lab/controller/07/
http://radiokot.ru/lab/controller/24/
http://radiokot.ru/circuit/digital/automat/35/
http://radiokot.ru/lab/controller/39/
на других мк
http://radiokot.ru/lab/controller/53/
http://radiokot.ru/circuit/digital/game/20/
для коллекции
http://radiokot.ru/circuit/digital/automat/07/
http://radiokot.ru/circuit/digital/automat/39/
http://radiokot.ru/circuit/digital/automat/23/
http://radiokot.ru/circuit/digital/game/18/
и не очень
http://radiokot.ru/lab/controller/07/
http://radiokot.ru/lab/controller/24/
http://radiokot.ru/circuit/digital/automat/35/
http://radiokot.ru/lab/controller/39/
на других мк
http://radiokot.ru/lab/controller/53/
http://radiokot.ru/circuit/digital/game/20/
для коллекции
http://radiokot.ru/circuit/digital/automat/07/
http://radiokot.ru/circuit/digital/automat/39/
не зная броду не лезь к вольтмоду
- Реклама
Re: Пропорциональное управление на МК (Знание=Сила)
если у вас речь про uart то вы точно идете своим собственным путем.
в существующих системах управления цифру передают только передатчики на 2.4 ггц
и то кодер\декодер общаются с передатчиком и приемником как правило в формате ppm - а это аналоговый сигнал
все остальные системы (27, 40, 72 и тд) работают с ppm и на уровне передатчика и приемника
применение форматов передачи uart обычно ведет к сильному сокращению дальности и ситуации к потери управления так как проверки длительности\четности и прочие страховки при передаче по uart запросто могут привести к ситуации что модель вообще не будет получать никаких команд и будет потеряна.
применение же формата ppm хоть и допускает "помехоуправление" из за изменения помехой части пачки ppm - но тем не менее позволяют при появлении помех это увидеть (органы управления начинает подергивать) и попытаться приблизить модель до окончательной потери сигнала
тем более что частота пачки ppm (до 8 импульсов) с частотой 50 гц (каждые 20 мс) - намного меньше чем передача 8 байт с той же частотой в 50 гц - то есть требования к приемнику и передатчику тоже снижаются почти на порядок
далее, про кодирование и декодирование:
как выглядит сигнал ppm я картинку дал на прошлой странице, там 5 каналов, как передавать код дал - думаю его перевести в асм трудностей не составит
как дешифровать
в свое время я писал следующий код чтобы определять длительность захваченного импульса, код что называется "влоб" сейчас бы написал по другому
инициализация таймера Т1 на счет со скоростью 2 мгц (у меня кварц на 16 был) и инициализация прерывания по захвату фронта\спада импульса
контроллер atmega16
ниже код самого прерывания, получаем длительности импульсов и делаем вывод что с ними делать дальше, я свой оригинальный код сильно покоцал, так что сохранять на стеке столько регистров конечно не нужно....
мои усы дали вам ту информацию что вы искали или опять чтото не то ?
в существующих системах управления цифру передают только передатчики на 2.4 ггц
и то кодер\декодер общаются с передатчиком и приемником как правило в формате ppm - а это аналоговый сигнал
все остальные системы (27, 40, 72 и тд) работают с ppm и на уровне передатчика и приемника
применение форматов передачи uart обычно ведет к сильному сокращению дальности и ситуации к потери управления так как проверки длительности\четности и прочие страховки при передаче по uart запросто могут привести к ситуации что модель вообще не будет получать никаких команд и будет потеряна.
применение же формата ppm хоть и допускает "помехоуправление" из за изменения помехой части пачки ppm - но тем не менее позволяют при появлении помех это увидеть (органы управления начинает подергивать) и попытаться приблизить модель до окончательной потери сигнала
далее, про кодирование и декодирование:
как выглядит сигнал ppm я картинку дал на прошлой странице, там 5 каналов, как передавать код дал - думаю его перевести в асм трудностей не составит
как дешифровать
в свое время я писал следующий код чтобы определять длительность захваченного импульса, код что называется "влоб" сейчас бы написал по другому
инициализация таймера Т1 на счет со скоростью 2 мгц (у меня кварц на 16 был) и инициализация прерывания по захвату фронта\спада импульса
контроллер atmega16
Код: Выделить всё
; вход дешифратора
LDI R16 , 0b11100000 ; конфигурируем порт D на вход по int1 остальное на выход
OUT DDRD , R16 ; для работы с прерываниями int_1
LDI R16 , 0b00011111 ; включим резисторы подтяжки к шине +5В
OUT PORTD , R16 ;
LDI R16 , 1<<ISC11 ; режим генерации прерывания по int_1
OUT MCUCR , R16 ;
LDI R16 , 1<<INT1 ; разрешение прерываний по int_1
OUT GICR , R16 ;
; 16-ти битный таймер Т1
LDI R16 , CS12 ; предделитель таймера 8
OUT TCCR1B , R16 ; частота счета 16МГц/8=2 МГц
LDI R16 , 0 ; сбросим счетчик таймера
OUT TCNT1H , R16 ;
OUT TCNT1L , R16 ;
Код: Выделить всё
; int1.asm - обработчик внешнего прерывания по PD3/INT1
EXT_INT1: ; Обработчик внешнего прерывания
PUSH R16
IN R16 , SREG
PUSH R16
PUSH R17
PUSH R10
PUSH R11
PUSH R12
PUSH R13
PUSH ZL
PUSH ZH
PUSH YL
PUSH YH
; прочитаем значение счетчика таймера
IN R16 , TCNT1L
STS T1VAL , R16
IN R16 , TCNT1H
STS T1VAL+1 , R16
; сбросим счетчик для счета с нуля
LDI R16 , 0
OUT TCNT1H , R16
OUT TCNT1L , R16
; определим фазу сигнала
LDS R16 , EXT_PH ;
SBRC R16 , 0 ; ожидали спад ?
JMP EXT_INT1_WAIT_FRONT ; переходим на регистрацию фронта импульса
; cюда попадаем когда зарегистрирован спад импульса
; значит в T1VAL у нас длительность импульса
LDS R10 , T1VAL
LDS R11 , T1VAL+1 ; берем старший байт
; здесь работаем с полученной длинной импульса - проверяем его длительность и делаем
;вывод о том что это длительность канала (при длительности от 1000 до 2000 vrc) либо если
;длительность более 4000 мкс - то это конец пачки и нам нужно сбросить счетчики для
;приема новой пачки импульсов начиная с первого канала
; ставим режим ожидания фронта импульса на входе
LDI R16 , 1
STS EXT_PH , R16
LDI R16 , (1<<ISC11)|(1<<ISC10) ; ждем фронт импульса
EXT_INT1_RETI: ; выход
POP YH
POP YL
POP ZH
POP ZL
POP R13
POP R12
POP R11
POP R10
POP R17
POP R16
OUT SREG , R16
POP R16
RETI
EXT_INT1_WAIT_FRONT: ; мы дождались фронта импульса --------------------------------------
LDI R16 , 0 ; ставим ожидание спада импульса
STS EXT_PH , R16
LDI R16 , 1<<ISC11 ; теперь ждем спада импульса
OUT MCUCR , R16
JMP EXT_INT1_RETI ; идем на выход
мои усы дали вам ту информацию что вы искали или опять чтото не то ?
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
радиомодули на частоту 433 или 868 МГц
максимальная частота прямоугольных импульсов на входе передатчика 6 кГц (из датащита на передатчик 433)
***
ты хочешь сказать, что UART не годится для р/у моделей ?
на нем ведь проще реализовать..
ты реализовал PPM полностью самостоятельно- я правильно понимаю ?
максимальная частота прямоугольных импульсов на входе передатчика 6 кГц (из датащита на передатчик 433)
***
ты хочешь сказать, что UART не годится для р/у моделей ?
на нем ведь проще реализовать..
ты реализовал PPM полностью самостоятельно- я правильно понимаю ?
Последний раз редактировалось uwrtey Вс авг 19, 2012 11:23:56, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
я не говорю что не годиться, просто применение uart повышает требования к передатчику..uwrtey писал(а):радиомодули на частоту 433 или 868 МГц
максимальная частота прямоугольных импульсов на входе передатчика 6 кГц (из датащита на передатчик 433)
***
ты хочешь сказать, что UART не годится для р/у моделей ?
в любом случае нужно пробовать
кстати может быть стоит ориентироваться на специальные модельные передатчики и приемники ? есть даже с обратным каналом... цена около 40 долларов (с телеметрией) дальность до километра точно
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
в данный момент мои познания в мк очень малы
все что я знаю взял тут http://radiokot.ru/start/mcu_fpga/avr/
по этому мне очень сложно понять то о чем Вы все мне толкуете
хотелось бы немного теории о том как это (uart и PPM - что проще естественно) можно реализовать в коде - своими словами (без ссылок на умные книжки)
тоесть - мне бы для начала понять что должен делать код ( какие функции нужно использовать )?
на форуме не всегда подсказывают - по этому получить какую то инфу проблематично..
специальные - не хочется! хочется на авр...
все что я знаю взял тут http://radiokot.ru/start/mcu_fpga/avr/
по этому мне очень сложно понять то о чем Вы все мне толкуете
хотелось бы немного теории о том как это (uart и PPM - что проще естественно) можно реализовать в коде - своими словами (без ссылок на умные книжки)
тоесть - мне бы для начала понять что должен делать код ( какие функции нужно использовать )?
на форуме не всегда подсказывают - по этому получить какую то инфу проблематично..
специальные - не хочется! хочется на авр...
Последний раз редактировалось uwrtey Вс авг 19, 2012 11:33:38, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
- Реклама
Re: Пропорциональное управление на МК (Знание=Сила)
я могу попробовать рассказать про ppm....
про uart я не стану говорить потому как сам не пробовал
опять таки если вам нужны готовые исходники - то "простых" у меня нет
про uart я не стану говорить потому как сам не пробовал
опять таки если вам нужны готовые исходники - то "простых" у меня нет
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
конечно давай, это в миллион раз лучше чем ничего...
давай на ты?
с исходниками по ходу разберемся...
давай на ты?
с исходниками по ходу разберемся...
не зная броду не лезь к вольтмоду
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
давай, для начала, разберем передачу одной дискретной комманды
что должен делать мк передатчика и что должен делать мк приемника ?
то, что сдедал я для передатчика смотрел? http://radiokot.ru/forum/download/file.php?id=90672
это глупо столько писать / у меня каждый бит обрабатывается последовательно (не собирается в байт) - все реализовано на функции "если"
я так понимаю, что все должно быть реализовано иначе
информация с передатчика должна приниматься в виде байта, а уже потом этот байт должен обрабатываться декодером. ( ну или что то вроде того )
что должен делать мк передатчика и что должен делать мк приемника ?
то, что сдедал я для передатчика смотрел? http://radiokot.ru/forum/download/file.php?id=90672
это глупо столько писать / у меня каждый бит обрабатывается последовательно (не собирается в байт) - все реализовано на функции "если"
я так понимаю, что все должно быть реализовано иначе
информация с передатчика должна приниматься в виде байта, а уже потом этот байт должен обрабатываться декодером. ( ну или что то вроде того )
не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
Ну да.. тупишь немного
не обижайся, просто опыта мало...
для начала я бы не заморачивался на передачу и прием а оптимизировал то что у тебя есть.. заодно и лучше себя чувствовать в асме начнешь, в нем очень много полезных команд
например почитай про команды битового сдвига !
ИТАК,
для начала нужно придумать алгоритм опроса клавиатуры и генерации кода нажатой кнопки..
например, если клавиатура не подразумевает одновременного нажатия нескольких кнопок, то нет большого смысла в передачи 20-битного состояния клавиатуры, и можно запросто ограничиться отправкой просто кода нажатой кнопки.. (это вопрос к задаче !!)
Далее, конечно нужно менять процедуру отправки, отправлять вашим кодом это издевательство над контроллером, да и потеря ценного процессорного ресурса:
налицо в вашем коде передача по битам, бог с ними со стартовыми битами, но остальное ?!
почему бы не сделать передачу байта через сдвиг?
например, по вашему могло бы получиться:
теперь чтобы передать байт вам не нужно вручную дергать ногой.. достаточно засунуть байт в регистр OutByte (сами выбирайте какой использовать) и вызвать sendByteProc
причем не переживайте что мы выводим байт в порт B целиком, там все равно кроме линий клавиатуры (так я понял устройство вашего передатчика) ничего нет, и мы их в момент передачи не используем..
насколько сократиться ваш код предлагаю вам убедиться самостоятельно (попробуйте модифицировать код сами)
p.s. сразу предупреждаю что все что мы сейчас пишем в реальном кодере использовано не будет
но для тренировки ваших мозгов этот код-тренировка необходимы
кстати, задание на дом:
как модифицировать код чтения клавиатуры чтобы было и коротко и просто ?
подсказка
выбирать линию для чтения клавиатуры можно примерно так:
в идеале, после работы процедуры опроса клавиатуры вы должны получить 5 байт, каждый это состояние одной линии клавиатуры, засуньте их в массив в ОЗУ
для начала я бы не заморачивался на передачу и прием а оптимизировал то что у тебя есть.. заодно и лучше себя чувствовать в асме начнешь, в нем очень много полезных команд
ИТАК,
для начала нужно придумать алгоритм опроса клавиатуры и генерации кода нажатой кнопки..
например, если клавиатура не подразумевает одновременного нажатия нескольких кнопок, то нет большого смысла в передачи 20-битного состояния клавиатуры, и можно запросто ограничиться отправкой просто кода нажатой кнопки.. (это вопрос к задаче !!)
Далее, конечно нужно менять процедуру отправки, отправлять вашим кодом это издевательство над контроллером, да и потеря ценного процессорного ресурса:
Код: Выделить всё
ldi Temp,0b00000000 ;Temp=0
ldi Temp1,0b10000000 ;Temp1=1
ldi Temp2,2 ;Temp2=2
rcall startbit ;стартовые биты
METKA2key20: ;ВТОРАЯ МЕТКА
out PortB,Temp ;9/17
rcall Delay ;задержка
out PortB,Temp1 ;10/18
rcall Delay ;задержка
out PortB,Temp ;11/19
rcall Delay ;задержка
out PortB,Temp1 ;12/20
rcall Delay ;задержка
out PortB,Temp ;13/21
rcall Delay ;задержка
out PortB,Temp ;14/22
rcall Delay ;задержка
out PortB,Temp ;15/23
rcall Delay ;задержка
out PortB,Temp ;16/24
rcall Delay ;задержка
почему бы не сделать передачу байта через сдвиг?
например, по вашему могло бы получиться:
Код: Выделить всё
sendByteProc: // процедура отправки байта
LDI loopVar=8 // количество битов на передачу
OutLoopProc:
OUT PortB, OutByte // ОutByte - это регистр содержащий байт для отправки
LSL OutByte // сдвинем байт на отправку на 1у позицию влево
RCALL Delay // сделаем задержку
DEC loopVar // проверим все ли биты передали:
BRNE OutLoopProc // не все? - циклимся
RET // выход
причем не переживайте что мы выводим байт в порт B целиком, там все равно кроме линий клавиатуры (так я понял устройство вашего передатчика) ничего нет, и мы их в момент передачи не используем..
насколько сократиться ваш код предлагаю вам убедиться самостоятельно (попробуйте модифицировать код сами)
p.s. сразу предупреждаю что все что мы сейчас пишем в реальном кодере использовано не будет
кстати, задание на дом:
как модифицировать код чтения клавиатуры чтобы было и коротко и просто ?
подсказка
выбирать линию для чтения клавиатуры можно примерно так:
Код: Выделить всё
LDI loopVar, <количество линий клавиатуры>
LDI temp, 0b00000001 // первая линия клавиатуры для чтения
...
Loop:
....
LSL temp - сдвиг...
...
DEC loopVar
BRNE Loop
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
ВитГо, спасибо, что занимаешься мной!
я не обижаюсь !
сейчас, попробую разобраться и переделать код по указанному тобой способу.
вот схема передатчика
http://radiokot.ru/forum/download/file.php?id=90498
я не обижаюсь !
сейчас, попробую разобраться и переделать код по указанному тобой способу.
вот схема передатчика
http://radiokot.ru/forum/download/file.php?id=90498
Последний раз редактировалось uwrtey Вс авг 19, 2012 17:19:57, всего редактировалось 2 раза.
не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
давай,
потом будем курить таймеры и прерывания
кстати подумай: нужно тебе одновременно отправлять несколько команд или все таки достаточно одной?
потом будем курить таймеры и прерывания
кстати подумай: нужно тебе одновременно отправлять несколько команд или все таки достаточно одной?
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
на примере старт-битов должно получится следующее ???
Код: Выделить всё
startbit:
LDI KolichestvoBit,8 ;количество битов на передачу
LDI OutByte,0b11111111
OutLoopProc:
Out PortB, OutByte ;выводим в порт Б 11111111
rcall Delay ;задержка
LSL OutByte ; сдвигаем на 1 влево
DEC KolichestvoBit ; KolichestvoBit -1
BRNE OutLoopProc ; если не равно нулю
ret
Последний раз редактировалось uwrtey Вс авг 19, 2012 20:49:40, всего редактировалось 4 раза.
не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
а зачем байт для отправки определять внутри цикла? (кстати LDI там забыл)
тогда его значение с каждым шагом изменяться не будет...и будет отправляться постоянно только один левый бит
делай опрос клавиатуры..
выбор линии нужно осуществлять сдвигая единицу с крайнего правого разряда байта влево, постепенно на 5 шагов...
после этого выводим байт выбора линии в порт клавиатуры, а из порта состояния - читаем состояние кнопок..
потом сохраняем в RAM (кстати с Z.Y.X ты знаком ?)
и потом циклимся для того чтобы прочитать все 5 линий клавиатуры
тебе осталось только по алгоритму написать код
тогда его значение с каждым шагом изменяться не будет...и будет отправляться постоянно только один левый бит
делай опрос клавиатуры..
выбор линии нужно осуществлять сдвигая единицу с крайнего правого разряда байта влево, постепенно на 5 шагов...
после этого выводим байт выбора линии в порт клавиатуры, а из порта состояния - читаем состояние кнопок..
потом сохраняем в RAM (кстати с Z.Y.X ты знаком ?)
и потом циклимся для того чтобы прочитать все 5 линий клавиатуры
тебе осталось только по алгоритму написать код
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
ой, все исправил
(еще и задержку забыл
)
(на работе был, не дают сосредоточится...)
(на работе был, не дают сосредоточится...)
очень мало знаком... сейчас погуглю http://radiokot.ru/start/mcu_fpga/avr/12/потом сохраняем в RAM (кстати с Z.Y.X ты знаком ?)
не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
ок, коль не знаком то расскажу вкратце
регистры X, Y, Z тесно связаны с коммандами чтения записи данных в память
на самом деле это регистровые пары
X R27:R26
Y R29:R28
Z R31:R30
коль пары - значит регистры эти 16ти разрядные
доступ к ним только через половинки
для X => XH старший байт, XL младший байт
и так же для других (YH YL; ZH ZL)
если хочется вынести мозг читающему программу после вас используйте вместо X, Y, Z их регистровые номера R26-R31
)
теперь про доступ к памяти - таких команд в асме несколько
LD rd, X - загрузка регистра из ячейки ОЗУ с адресом в X
LD rd, X+ - загрузка регистра из ячейки ОЗУ с адресом X с последующим увеличением X на единицу (переход к следующей ячейке)
ST X, rd - запись значения регистра в ОЗУ по адресу указанному в X
ST X+, rd - запись значения регистра в ОЗУ по адресу X с последующим увеличением X на единицу (переход к следующей ячейке)
есть еще LPM - но пока не до нее, можете прочитать сами
конечно вместо X в командах могут быть Y или Z
теперь вырисовывается как создать массив в ОЗУ и записать в него байты состояния клавиатуры ?
регистры X, Y, Z тесно связаны с коммандами чтения записи данных в память
на самом деле это регистровые пары
X R27:R26
Y R29:R28
Z R31:R30
коль пары - значит регистры эти 16ти разрядные
доступ к ним только через половинки
для X => XH старший байт, XL младший байт
и так же для других (YH YL; ZH ZL)
если хочется вынести мозг читающему программу после вас используйте вместо X, Y, Z их регистровые номера R26-R31
теперь про доступ к памяти - таких команд в асме несколько
LD rd, X - загрузка регистра из ячейки ОЗУ с адресом в X
LD rd, X+ - загрузка регистра из ячейки ОЗУ с адресом X с последующим увеличением X на единицу (переход к следующей ячейке)
ST X, rd - запись значения регистра в ОЗУ по адресу указанному в X
ST X+, rd - запись значения регистра в ОЗУ по адресу X с последующим увеличением X на единицу (переход к следующей ячейке)
есть еще LPM - но пока не до нее, можете прочитать сами
конечно вместо X в командах могут быть Y или Z
теперь вырисовывается как создать массив в ОЗУ и записать в него байты состояния клавиатуры ?
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
с записью массива в ОЗУ не понял ровным счетом ничего
с тем как записывать массив в ПЗУ вроде разобрался http://radiokot.ru/start/mcu_fpga/avr/12/
очень усердно пытался разобраться вот с этим
где то тут (смотри код ниже) тупанул и несмог ни чего лучше придумать
я так понимаю, нужно было каким то образом организовать массив в озу и с ним дальше работать
сейчас еще покумекаю....
ЗЫ на данный момент не принципиально нажатие нескольких клавиш! но в дальнейшем это однозначно понадобится...
с тем как записывать массив в ПЗУ вроде разобрался http://radiokot.ru/start/mcu_fpga/avr/12/
очень усердно пытался разобраться вот с этим
и вот что получилось (еще хуже чем было)ВитГо писал(а):Код:
LDI loopVar, <количество линий клавиатуры>
LDI temp, 0b00000001 // первая линия клавиатуры для чтения
...
Loop:
....
LSL temp - сдвиг...
...
DEC loopVar
BRNE Loop
Код: Выделить всё
;*******************************************************************************
;настройка портов
;*******************************************************************************
ldi Temp,0b11111111
out DDRB,Temp ;настроили порт "В" на вывод информации
;к порту "В" будет прицеплен вывод на передатчик 0b10000000
; и адресные ноги (пять штук 0b00011111) клавы будут
; прицнплены к нему же
ldi Temp,0b01110000
out DDRD,Temp ;настраиваем порт "D" на ввод(чтение)(0-ввод, 1-вывод)
;но не весь, а только четыре млажших бита (PD0-PD3)
;к которым прицеплены четыре строки клавиатуры (шина данных)
; а остальные настроил на вывод для того что бы
;при их чтении получит не черте че а четкий ноль
;*только самый старши бит настроен на ВВОД (потому что в порте "D" отсутсвует эта нога)
;*******************************************************************************
; проверка кнопок
;*******************************************************************************
keyboardreed: ;метка - опрос клавиатуры
ldi KolichestvoStolbcov,5 ;количество столбцов клавы = пять штук
ldi Stolbec,0b00000001 ;первый стлобец
loop:
out PortB,Stolbec
in Temp,PinD
cpi Temp,0b00000001 ;первая строка в этом столбце?
breq ObrabotkaNajatiya1 ;если да, то на метку ObrabotkaNajatiya1, иначе снова сравнивать
cpi Temp,0b00000010 ;вторая строка?
breq ObrabotkaNajatiya2
cpi Temp,0b00000100 ;третья строка?
breq ObrabotkaNajatiya3
cpi Temp,0b00001000 ;четвертая строка?
breq ObrabotkaNajatiya4
lsl Stolbec ;логический сдвиг влево (на следующую строку)
dec KolichestvoStolbcov ;количество столбцов -1
brne loop ;если не равно нулю то на метку loop
rjamp keyboardreed ;иначе в начало опроса клавы
;*********************************************************
ObrabotkaNajatiya1: ;выбрана первая строка теперь узнаем какой столбец клавиатуры
cpi KolichestvoStolbcov,5 ;первы столбец?
breq Stolbec1
cpi KolichestvoStolbcov,4 ;второй?
breq Stolbec2
cpi KolichestvoStolbcov,3 ;третий?
breq Stolbec3
cpi KolichestvoStolbcov,2 ;четвертый?
breq Stolbec4
cpi KolichestvoStolbcov,1 ;пятый?
breq Stolbec5
Stolbec1:
ldi Temp1,0
rjamp ReadMassiv
Stolbec2:
ldi Temp1,1
rjamp ReadMassiv
Stolbec3:
ldi Temp1,2
rjamp ReadMassiv
Stolbec4:
ldi Temp1,3
rjamp ReadMassiv
Stolbec5:
ldi Temp1,4
rjamp ReadMassiv
;*********************
ObrabotkaNajatiya2: ;выбрана вторая строка теперь узнаем какой столбец клавиатуры
cpi KolichestvoStolbcov,5 ;первы столбец?
breq Stolbec1a
cpi KolichestvoStolbcov,4 ;второй?
breq Stolbec2a
cpi KolichestvoStolbcov,3 ;третий?
breq Stolbec3a
cpi KolichestvoStolbcov,2 ;четвертый?
breq Stolbec4a
cpi KolichestvoStolbcov,1 ;пятый?
breq Stolbec5a
Stolbec1a:
ldi Temp1,5
rjamp ReadMassiv
Stolbec2a:
ldi Temp1,6
rjamp ReadMassiv
Stolbec3a:
ldi Temp1,7
rjamp ReadMassiv
Stolbec4a:
ldi Temp1,8
rjamp ReadMassiv
Stolbec5a:
ldi Temp1,9
rjamp ReadMassiv
;****************************
ObrabotkaNajatiya3: ;выбрана третья строка теперь узнаем какой столбец клавиатуры
cpi KolichestvoStolbcov,5 ;первы столбец?
breq Stolbec1s
cpi KolichestvoStolbcov,4 ;второй?
breq Stolbec2s
cpi KolichestvoStolbcov,3 ;третий?
breq Stolbec3s
cpi KolichestvoStolbcov,2 ;четвертый?
breq Stolbec4s
cpi KolichestvoStolbcov,1 ;пятый?
breq Stolbec5s
Stolbec1s:
ldi Temp1,10
rjamp ReadMassiv
Stolbec2s:
ldi Temp1,11
rjamp ReadMassiv
Stolbec3s:
ldi Temp1,12
rjamp ReadMassiv
Stolbec4s:
ldi Temp1,13
rjamp ReadMassiv
Stolbec5s:
ldi Temp1,14
rjamp ReadMassiv
;*******************************
ObrabotkaNajatiya4: ;выбрана четвертая строка теперь узнаем какой столбец клавиатуры
cpi KolichestvoStolbcov,5 ;первы столбец?
breq Stolbec1d
cpi KolichestvoStolbcov,4 ;второй?
breq Stolbec2d
cpi KolichestvoStolbcov,3 ;третий?
breq Stolbec3d
cpi KolichestvoStolbcov,2 ;четвертый?
breq Stolbec4d
cpi KolichestvoStolbcov,1 ;пятый?
breq Stolbec5d
Stolbec1d:
ldi Temp1,15
rjamp ReadMassiv
Stolbec2d:
ldi Temp1,16
rjamp ReadMassiv
Stolbec3d:
ldi Temp1,17
rjamp ReadMassiv
Stolbec4d:
ldi Temp1,18
rjamp ReadMassiv
Stolbec5d:
ldi Temp1,19
rjamp ReadMassiv
;*********************************************************
ReadMassiv:
ldi ZH,High(Massiv*2) ;загрузка начального адреса массива
ldi ZL,Low(Massiv*2)
ldi Temp,0 ;обнуляем Temp
add ZL,Temp1 ;прибавляем
adc ZH,Temp
lpm ;загрузка из ПЗУ по адресу из регистровой пары
mov Temp,R0 ;копирование в РОН из R0
out PortB,Temp ;вывод данных на передатчик
;.... дальше писать не стал
;*********************************************************
Massiv: ;массив с кодами кнопок
.db 2,4,6,8,10 ;первая строка клавиатуры
.db 12,14,16,18,20 ;
.db 11,24,26,28,30 ;...
.db 32,34,36,38,40 ;....
я так понимаю, нужно было каким то образом организовать массив в озу и с ним дальше работать
сейчас еще покумекаю....
Код: Выделить всё
cpi Temp,0b00000001 ;первая строка в этом столбце?
breq ObrabotkaNajatiya1 ;если да, то на метку ObrabotkaNajatiya1, иначе снова сравнивать
cpi Temp,0b00000010 ;вторая строка?
breq ObrabotkaNajatiya2
cpi Temp,0b00000100 ;третья строка?
breq ObrabotkaNajatiya3
cpi Temp,0b00001000 ;четвертая строка?
breq ObrabotkaNajatiya4не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
настройку портов оставляем пока так, и больше для краткости наших сообщений на форум ее не пишем.uwrtey писал(а):Код: Выделить всё
;******************************************************************************* ;настройка портов ;******************************************************************************* ldi Temp,0b11111111 out DDRB,Temp ;настроили порт "В" на вывод информации ;к порту "В" будет прицеплен вывод на передатчик 0b10000000 ; и адресные ноги (пять штук 0b00011111) клавы будут ; прицнплены к нему же ldi Temp,0b01110000 out DDRD,Temp ;настраиваем порт "D" на ввод(чтение)(0-ввод, 1-вывод) ;но не весь, а только четыре млажших бита (PD0-PD3) ;к которым прицеплены четыре строки клавиатуры (шина данных) ; а остальные настроил на вывод для того что бы ;при их чтении получит не черте че а четкий ноль ;*только самый старши бит настроен на ВВОД (потому что в порте "D" отсутсвует эта нога)
по кнопкам ты не поймал мысль, смотри как можно было сделать:
Код: Выделить всё
;*******************************************************************************
; подпрограмма проверки кнопок
;*******************************************************************************
keyboardread:
ldi temp , 5 ; количество столбцов клавы = пять
ldi R17 ,0b00000001 ; первый столбец
; задаем в X адрес в ОЗУ для сохранения состояния клавиатуры
ldi XL , low (key_buff) ; младший байт адреса
ldi XH , high(key_buff) ; старший байт адреса
keyboardread_loop: ; цикл опроса
out PortB , R17 ; тут ты правильно понял: выбрали столбец
in R18 , PinD ; прочитали состояние
st X+ , R18 ; сохраним в ОЗУ состояние столбца клавы, адрес в X
; автоматом увеличится на 1
lsl R17 ; сдвинули единичку выбора линии клавиатуры на 1
; позицию влево
dec temp ; уменьшим счетчик
brne keyboardread_loop ; если не все просканировали, то циклимся
ret ; возврат из подпрограммы
Код: Выделить всё
.DSEG
key_buff .byte 5 ; зарезервируем 5 байт в ОЗУ
вот и все чтение клавиатуры
в результате у нас 5 байт в каждом из которых, в младших 4х битах состояние каждой из нажатых кнопок.
вызывать подпрограмму можно командой rcall keyboardread
посмотри внимательно код, ты должен четко понимать как и что он делает, подобные алгоритмы часто применяются - и в них себя нужно чувствовать очень уверенно - иначе не сможешь отлаживать когда не заработает сразу
тааак, вопрос на засыпку: что такое подпрограммы представляешь ?
- uwrtey
- Поставщик валерьянки для Кота
- Сообщения: 2309
- Зарегистрирован: Пт июл 17, 2009 07:34:07
- Откуда: Свердловская обл.
Re: Пропорциональное управление на МК (Знание=Сила)
подпрограмма - это программа внутри другой программы
подпрограмму можно вызвать по событию ( нажатие кнопки или таймер например)
а так же ее можно вызвать просто так..
код в твоем варианте здорово уменьшился...
пытаюсь вкурить смысл
подпрограмму можно вызвать по событию ( нажатие кнопки или таймер например)
а так же ее можно вызвать просто так..
код в твоем варианте здорово уменьшился...
пытаюсь вкурить смысл
не зная броду не лезь к вольтмоду
Re: Пропорциональное управление на МК (Знание=Сила)
примерно так:-)uwrtey писал(а):подпрограмма - это программа внутри другой программы
подпрограмму можно вызвать по событию ( нажатие кнопки или таймер например)
а так же ее можно вызвать просто так..
еще нужная теория:
1. какими командами происходит вызов подпрограмм, что происходит при вызове и возврате подпрограммы (стек,pc, регистры), какой командой обычно выходят из подпрограммы (извращения при выходе не рассматриваем)
2. сохранение данных на стеке
3. флаги и регистр SREG
в принципе в самоучителе здесь на радиокоте (который ты приводил) думаю все это есть...
напиши как прочитаешь что нить по этим 3м темам
Re: Пропорциональное управление на МК (Знание=Сила)
угу, он еще и работает раз в 10 наверное быстрееuwrtey писал(а):код в твоем варианте здорово уменьшился...
пытаюсь вкурить смысл


