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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

						; вход дешифратора
						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			; идем на выход


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

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

Сообщение uwrtey »

радиомодули на частоту 433 или 868 МГц
максимальная частота прямоугольных импульсов на входе передатчика 6 кГц (из датащита на передатчик 433)
***
ты хочешь сказать, что UART не годится для р/у моделей ?
на нем ведь проще реализовать..

ты реализовал PPM полностью самостоятельно- я правильно понимаю ?
Последний раз редактировалось uwrtey Вс авг 19, 2012 11:23:56, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

uwrtey писал(а):радиомодули на частоту 433 или 868 МГц
максимальная частота прямоугольных импульсов на входе передатчика 6 кГц (из датащита на передатчик 433)
***
ты хочешь сказать, что UART не годится для р/у моделей ?
я не говорю что не годиться, просто применение uart повышает требования к передатчику..

в любом случае нужно пробовать

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

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

Сообщение uwrtey »

в данный момент мои познания в мк очень малы
все что я знаю взял тут http://radiokot.ru/start/mcu_fpga/avr/
по этому мне очень сложно понять то о чем Вы все мне толкуете
хотелось бы немного теории о том как это (uart и PPM - что проще естественно) можно реализовать в коде - своими словами (без ссылок на умные книжки)
тоесть - мне бы для начала понять что должен делать код ( какие функции нужно использовать )?
на форуме не всегда подсказывают - по этому получить какую то инфу проблематично..

специальные - не хочется! хочется на авр...
Последний раз редактировалось uwrtey Вс авг 19, 2012 11:33:38, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

я могу попробовать рассказать про ppm....

про uart я не стану говорить потому как сам не пробовал

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

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

Сообщение uwrtey »

конечно давай, это в миллион раз лучше чем ничего...

давай на ты?

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

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

Сообщение uwrtey »

давай, для начала, разберем передачу одной дискретной комманды
что должен делать мк передатчика и что должен делать мк приемника ?

то, что сдедал я для передатчика смотрел? http://radiokot.ru/forum/download/file.php?id=90672
это глупо столько писать / у меня каждый бит обрабатывается последовательно (не собирается в байт) - все реализовано на функции "если"

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

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

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

Ну да.. тупишь немного :-) не обижайся, просто опыта мало...
для начала я бы не заморачивался на передачу и прием а оптимизировал то что у тебя есть.. заодно и лучше себя чувствовать в асме начнешь, в нем очень много полезных команд :-) например почитай про команды битового сдвига !

ИТАК,
для начала нужно придумать алгоритм опроса клавиатуры и генерации кода нажатой кнопки..

например, если клавиатура не подразумевает одновременного нажатия нескольких кнопок, то нет большого смысла в передачи 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                           // выход
теперь чтобы передать байт вам не нужно вручную дергать ногой.. достаточно засунуть байт в регистр OutByte (сами выбирайте какой использовать) и вызвать sendByteProc
причем не переживайте что мы выводим байт в порт B целиком, там все равно кроме линий клавиатуры (так я понял устройство вашего передатчика) ничего нет, и мы их в момент передачи не используем..

насколько сократиться ваш код предлагаю вам убедиться самостоятельно (попробуйте модифицировать код сами)

p.s. сразу предупреждаю что все что мы сейчас пишем в реальном кодере использовано не будет :-) но для тренировки ваших мозгов этот код-тренировка необходимы

кстати, задание на дом:
как модифицировать код чтения клавиатуры чтобы было и коротко и просто ?
подсказка
выбирать линию для чтения клавиатуры можно примерно так:

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

       LDI loopVar, <количество линий клавиатуры> 
       LDI temp, 0b00000001   // первая линия клавиатуры для чтения
       ...
Loop:
        ....
        LSL temp - сдвиг...
        ...
        DEC loopVar
        BRNE Loop
в идеале, после работы процедуры опроса клавиатуры вы должны получить 5 байт, каждый это состояние одной линии клавиатуры, засуньте их в массив в ОЗУ
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

ВитГо, спасибо, что занимаешься мной!
я не обижаюсь ! :)) :beer:
сейчас, попробую разобраться и переделать код по указанному тобой способу.
вот схема передатчика
http://radiokot.ru/forum/download/file.php?id=90498
Последний раз редактировалось uwrtey Вс авг 19, 2012 17:19:57, всего редактировалось 2 раза.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

давай,

потом будем курить таймеры и прерывания

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

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

Сообщение uwrtey »

на примере старт-битов должно получится следующее ???

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

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 раза.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

а зачем байт для отправки определять внутри цикла? (кстати LDI там забыл)
тогда его значение с каждым шагом изменяться не будет...и будет отправляться постоянно только один левый бит

делай опрос клавиатуры..

выбор линии нужно осуществлять сдвигая единицу с крайнего правого разряда байта влево, постепенно на 5 шагов...
после этого выводим байт выбора линии в порт клавиатуры, а из порта состояния - читаем состояние кнопок..
потом сохраняем в RAM (кстати с Z.Y.X ты знаком ?)
и потом циклимся для того чтобы прочитать все 5 линий клавиатуры

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

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

Сообщение uwrtey »

ой, все исправил :oops: (еще и задержку забыл :oops: )
(на работе был, не дают сосредоточится...)
потом сохраняем в RAM (кстати с Z.Y.X ты знаком ?)
очень мало знаком... сейчас погуглю http://radiokot.ru/start/mcu_fpga/avr/12/
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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


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

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

Сообщение uwrtey »

с записью массива в ОЗУ не понял ровным счетом ничего
с тем как записывать массив в ПЗУ вроде разобрался 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
ЗЫ на данный момент не принципиально нажатие нескольких клавиш! но в дальнейшем это однозначно понадобится...
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

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

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

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

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

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

еще нужная теория:

1. какими командами происходит вызов подпрограмм, что происходит при вызове и возврате подпрограммы (стек,pc, регистры), какой командой обычно выходят из подпрограммы (извращения при выходе не рассматриваем)

2. сохранение данных на стеке

3. флаги и регистр SREG

в принципе в самоучителе здесь на радиокоте (который ты приводил) думаю все это есть...

напиши как прочитаешь что нить по этим 3м темам
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

uwrtey писал(а):код в твоем варианте здорово уменьшился... :beer:
пытаюсь вкурить смысл
угу, он еще и работает раз в 10 наверное быстрее 8)
Ответить

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