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

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

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

Сообщение uwrtey »

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

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

Сообщение uwrtey »

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

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

Сообщение uwrtey »

сегодня буду тестировать прошивку передатчика
вот схему переделал
добавил разъем для внутрисхемной прошивки.
И еще поставил выключатель, который будет замкнут на момент прошивки
с разъемом.GIF
(56.36 КБ) 494 скачивания
Последний раз редактировалось uwrtey Вс сен 30, 2012 21:15:36, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

:oops: мда, не шьется мк по такой схеме! видимо сопротивление резисторов клавиатуры слишком мало ( 1 кило Ом). отпаял резисторы на момент прошивки, фьюзы не трогал - стоят заводские
........прошил
на выходе постоянно импульсы длительностью 5 милисек
пойду еще разок в код гляну......
вот кое что уже поправил
transmitt1.4.asm
(10.43 КБ) 419 скачиваний
не зная броду не лезь к вольтмоду
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

ну вот очередное исправление
transmit1.5.rar
(21.4 КБ) 197 скачиваний
теперь при нажатии одной из кнопок, появляются импульсы длительностью примерно 13 мили секунд и паузы длительностью 5 мили секунд :shock: :dont_know:
все исправления отмечены знаками вопроса
Спойлер

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


.def	Temp=R16
.def	Temp1=R17
.def	Temp2=R18
.def	Temp3=R19
.def	Temp4=R20
.def	Temp5=R21
.def	Temp6=R22
.def	Temp7=R23
.def	Temp8=R24
.def	Temp9=R25


.dseg			;оперативка

key_buff: .byte 5	; зарезервируем 5 байт в ОЗУ


;******************************************************************************

.EQU ImpLen=0xCE4 			; длина импульса
.EQU OneLen=0xCE4 			; длина паузы для единицы
.EQU NulLen=0x19C8			; длина паузы для нуля

;******************************************************************************

.cseg

.org 0


rjmp RESET				; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset

.org   OC1Aaddr				; (=0x0004) Timer/Counter1 Compare Match A

rjmp OCR1A_COMP

.org INT_VECTORS_SIZE


;******************************************************************************
;старт
;******************************************************************************

reset:					; включение микроконтроллера

	cli				; глобальный запрет на прерывания


	ldi Temp,low(RamEnd)		; инициализации стека	
	out SPL,Temp			;

	
	ldi Temp,0b00001111		; настроили порт "В" (0-ввод, 1-вывод)
	out DDRB,Temp			; 0000х000 - "вывод" на передатчик (PB3- 15 ножка)
					; хххх0000 - "ввод" для чтения строк клавиатуры
					; 00000ххх - "вывод" для того что бы при чтении клавиатуры получить "0" ??????????????????
												 
	ldi Temp,0b00001111		; настраиваем порт "D" (0-ввод, 1-вывод)
	out DDRD,Temp 			; 0000хххх - на вывод столбцов клавы


	ldi Temp,0b00000000		; выводим на передатчик лог_0 ????????????????????????????????????????????????
	out portB,Temp	
					
	ldi Temp,0b00000000		; установили тактовый сигнал = CK 0
	out TCCR1B,Temp			; таймер выключен!!!

	sei				; глобальное разрешение прерываний
        



;*******************************************************************************
; главный цикл
;*******************************************************************************


Main_cicle:

	rcall keyboardread		; вызов подпрограммы чтения клавиатуры

	rcall certain_buttons_keyboard	; вызов подпрограммы проверки нажатия
	
	rjmp Main_cicle			; циклимся



;*******************************************************************************
; цикл Чтения клавы и запись данных в ОЗУ
;*******************************************************************************

keyboardread:				; метка - опрос клавиатуры

          
	ldi Temp,5			; количество столбцов клавы = пять
         
	ldi Temp1,0b00000001		; первый столбец

          				; загружаем адрес метки массива (key_buff) находящейся в ОЗУ в регистровую пару X

	ldi XL,	low(key_buff)		; младший байт адреса
	ldi XH,	high(key_buff)		; старший байт адреса

keyboardread_loop:			; цикл опроса

	out PortD,Temp1			; выводим в порт "Д" значение "Temp1" для выбора столбца клавиатуры
	in Temp2,PinB			; прочитали состояние столбца
         
	st X+,Temp2			; сохраним в ОЗУ состояние столбца клавы, 
 					; адрес в регстровой паре "X" автоматом увеличится на 1


	lsl Temp1			; сдвинули единичку выбора столбца клавиатуры на 1
 					; позицию влево

	dec temp			; уменьшим счетчик
	brne keyboardread_loop		; если не все просканировали, то циклимся

	ret				; возврат в главный цикл

       
;******************************************************************************************
; цикл проверки нажатия клавиатуры
;******************************************************************************************

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", 
					; и после этого адресс в регистровой паре автоматически увеличится на еденицу


	cpi Temp,0b00000000		; проверяем, нажата ли какая ни будь кнопка?
	brne inform			; если нажата то переходим на метку "inform"


	dec temp1			; уменьшим счетчик
	brne Certain_button		; если не все столбцы, то циклимся

metka:

	ret				; возврат в главный цикл



;***********************************************************************************************
; вывод информации о состоянии клавиатуры в порт "Б" 
;***********************************************************************************************

inform:					; здесь мы включаем таймер


					

	ldi Temp,(1<<COM1A0)		; переключать ножку "OC1A" по совпадению (PB3- 15 ножка)
	out TCCR1A,Temp			; *1


	LDI R19, 2			; зададим фиксированную длительность импульса ( 0x200 видимо )
	OUT OCR1AH, R19			; и выведем ее в порт сравнения
	LDI R19, 0   
	OUT OCR1AL ,R19       

	ldi Temp,0			; обнуление таймера 
	out TCNT1H,Temp
	out TCNT1L,Temp

	ldi Temp,(1<<wgm12)|(1<<cs10)	; подключили режим "CTC" (вместе с *1) 
	out TCCR1B,Temp			; и установили тактовый сигнал = CK 1:1 
					; таймер начал считать!!!

	ldi Temp,(1<<OCIE1A)		; разрешить прерывание компаратора 
	out TIMSK,Temp
	

	ldi R22, 0			; фаза передачи

loop_wait_transmitt:			; цикл ожидания завершения передачи

	cpi R22 , 7
	brne loop_wait_transmitt

	ldi temp1,0			; обнулим "temp1", что бы точно выйти из цикла проверки нажатия клавиатуры ???????????????????

	ret				; возврат в цикл проверки нажатия клавиатуры


;*******************************************************************************
;обработка прерывания
;*******************************************************************************

OCR1A_COMP:
					; первоначальное значение R22 - 0
					; таким образом сначала будет выполнена инициализации передачи

					; проверяем фазу работы прерывания




	in temp,SREG			; сохраняем "SREG"/////////////////////////////////////////////////////
	push temp


	CPI R22, 1
	BREQ transmitt_byte		; фаза передачи байта

	CPI R22, 2
	BREQ transmitt_bite_imp		; фаза передачи импульса бита в байте

	CPI R22, 3
	BREQ transmitt_bite_pause	; фаза передачи паузы бита в байте

	CPI R22, 4
	BREQ transmitt_imp_chetn	; фаза передачи импульса бита четности

	CPI R22, 5
	BREQ transmitt_pausa_chetn	; фаза передачи паузы бита четности

	CPI R22, 6
	BREQ transmitt_complete		; передача завершена, выключение прерываний


;****************************************************************************************************************

					; инициализация передачи, (при R22=0)



	ldi R21,0			; это будет счетчик единичек в передаче (четность)

	ldi yl,low(key_buff)		; зададим адрес начала массива прочитанных кнопок в ргистровую пару "Y"
	ldi yh,high(key_buff)

	ldi R17,5			; количество байт для передачи


transmitt_byte:				; фаза начала передачи - передача байта

 	ld temp,y+			; прочитаем байт для передачи, увеличим на единицу адрес в "Y" 

	ldi r18,8			; количество бит в байте для передачи



	pop temp			; извлекаем "SREG" ???????????????????????????????????????????????????????????
	out SREG, temp



transmitt_bite_imp:			; фаза передачи импульса в передаваемом бите


	in temp,SREG			; сохраняем "SREG" ???????????????????????????????????????????????????????????
	push temp



	LDI R19 ,high(ImpLen)		; зададим фиксированную длительность импульса
	OUT OCR1AH, R19			; и выведем ее в порт сравнения
	LDI R19,low(ImpLen)   
	OUT OCR1AL ,R19       

	LDI  R22, 3			; в следующий раз передаем паузу




int_reti:				

	pop temp			; извлекаем "SREG" ////////////////////////////////////////////////////////////
	out SREG, temp

	RETI				; точка выхода из прерывания


;**********************************************************************************************************************

transmitt_bite_pause:			; фаза передачи паузы в передаваемом бите

					; здесь кодируем импульс для бита

	in temp,SREG			; сохраняем "SREG" ????????????????????????????????????????????????????????????
	push temp


	LDI XL,low(Nullen)		; длительность для передачи нуля
	LDI XH,high(Nullen)

	ROL temp			; двигаем байт влево (циклический сдвиг влево)
	BRCC send_nullen		; если "С"=0 то записываем нулевую длительность

	
	LDI XL,low(onelen)		; длительность для передачи единицы
	LDI XH,high(onelen)

	INC R21				; передаем единицу - увеличим счетчик единичек (четность) 

send_nullen:

	OUT OCR1AH,XH			; установим длительность
	OUT OCR1AH,XL         
               
	LDI R22,2			; в следующий раз передадим импульс бита

	dec R18				; уменьшим счетчик бит на передачу
	brne int_reti			; если это непоследний бит в байте - то выход из прерывания

	LDI R22,1			; в следующий раз передадим новый байт

	dec R17				; уменьшим счетчик Байт для передачи
	brne int_reti			; если это не последний байт в массиве - то выход из прерывания
                   
	LDI R22,4			; в следующий раз передадим импульс бита четности

	RJMP int_reti			; выход из прерывания

;*********************************************************************************************************************                   


transmitt_imp_chetn:			; передача импульса бита четности




	in temp,SREG			; сохраняем "SREG" ???????????????????????????????????????????????????????????
	push temp



	
	LDI R19 ,high(ImpLen)		; зададим фиксированную длительность импульса
	OUT OCR1AH, R19			; и выведем ее в порт сравнения
	LDI R19,low(ImpLen)   
	OUT OCR1AL,R19       


	LDI R22,5			; в следующий раз передаем паузу бита четности

	rjmp int_reti			; выход из прерывания

;**********************************************************************************************************************


transmitt_pausa_chetn:			; передача паузы бита четности

					; здесь кодируем длительность паузы для бита четности



	in temp,SREG			; сохраняем "SREG" ???????????????????????????????????????????????????????????
	push temp




	LDI XL,low(Nullen)		; длительность паузы для передачи нуля
	LDI XH,high(Nullen)

	COM R21				; Побитная инверсия

	ROR R21				; Циклический сдвиг вправо

	BRCC send_chetn 		; если "С"=0 то записываем нулевую длительность

	LDI XL,low(onelen)		; длительность паузы для передачи единицы
	LDI XH,high(onelen)

send_chetn:

	OUT OCR1AH,XH			; установим длительность
	OUT OCR1AH,XL         

	LDI R22,6			; R22=6  ОТКЛЮЧЕНИЕ ПРЕРЫВАНИЯ
	rjmp int_reti			; выход из прерывания

;*************************************************************************************************************************

transmitt_complete:			; КОД ДЛЯ ОТКЛЮЧЕНИЯ ПРЕРЫВАНИЙ 


	in temp,SREG			; сохраняем "SREG" ???????????????????????????????????????????????????????????
	push temp


	ldi Temp,0b00000000		; установили тактовый сигнал = CK 0  
	out TCCR1B,Temp			; таймер выключен!!!


	ldi Temp,0b00000000		; выводим на передатчик лог_0 ????????????????????????????????????????????????
	out portB,Temp	
	
	LDI R22, 7			; Признак окончания передачи
	rjmp int_reti			; выход из прерывания	

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

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

Сообщение uwrtey »

обсуждение переехало....
кому интересно результаты потом выложу сюда...
не зная броду не лезь к вольтмоду
Реклама
Atlant
Родился
Сообщения: 5
Зарегистрирован: Пт апр 20, 2007 12:22:27

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

Сообщение Atlant »

Sergi писал(а):Немного не в тему. Вот сейчас запустил цифровой канал передачи. 2 пропорциональных команды и 16 дискретных. Пульт управления ATMega16 + MRF49, приемник ATMega88 + MRF49. Есть исходники на С. Дешифрация - побайтный разбор пакета. TC вроде бы не указал какими RF модулями он пользуется. Мне кажется с цифровой передачей канал надежнее будет. Завтра испытания "в поле".
А можно посмотреть исходник, схему ?
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

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

Сообщение Sergi »

Исходник передачи здесь rfpult на mega16; приема на mega88 boat88
пока не могу организовать обратную передачу
внимание : это все черновики! Если необходимо, схему нарисую позже.
В поле связь не терялась на 150м при скорости 9600. Управлть объектом в 0,5м длиной с такого расстояния проблематично.
собственно схемы можно посмотреть на http://vg.ucoz.ru/forum/8-57-1
Вложения
boat88.c
(9.91 КБ) 365 скачиваний
RFpult3.c
(20.07 КБ) 400 скачиваний
yron
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

Пропорциональное управление на AVR.

Сообщение yron »

Помогите написать прошивку под atmega8,для создания 8-канального PPM кодера. В сети есть готовые PPM кодеры но сделанные на PIC контроллерах, а я учусь пока только на AVR ,и хочу понять как создавать PPM сигнал.
yron
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

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

Сообщение yron »

Ну помогите хоть кто-нибудь.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

учитесь создавать хотя бы какой-нибудь сигнал!
потом изучите PPM сигнал и реализуйте его на основе знаний полученных от создания любых сигналов.
Ставим плюсы: )
Аватара пользователя
Jurkin
Вымогатель припоя
Сообщения: 515
Зарегистрирован: Вт янв 01, 2013 15:51:19
Откуда: Vilnius

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

Сообщение Jurkin »

...может повторюсь ..поищите книгу "10 практических устройств на AVR-микроконтроллерах" КНИГА 3 А.В.Кравченко 2011, помоему там хорошо расписано пропорцианальное радиоуправление(234стр).
yron
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

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

Сообщение yron »

Jurkin писал(а):поищите книгу "10 практических устройств на AVR-микроконтроллерах" КНИГА 3 А.В.Кравченко 2011.
Спасибо почитаю!
yron
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

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

Сообщение yron »

Прочитал! Посмотрел на пример программы но ничего не понял,язык программирования какой то другой . Я в CodeVisionAvr научился программки писать.
Аватара пользователя
Jurkin
Вымогатель припоя
Сообщения: 515
Зарегистрирован: Вт янв 01, 2013 15:51:19
Откуда: Vilnius

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

Сообщение Jurkin »

...ну там родной avr-asm, а его желательно маломальски для начала изучить - лучше будете понимать работу мк. Ну даже не это главное, там расписан алгоритм по простому и на чём вы его реализуете это уже другое дело...
yron
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

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

Сообщение yron »

Не могли бы вы помочь мне с написанием программы? Я думаю многим людям понадобится.
Аватара пользователя
Jurkin
Вымогатель припоя
Сообщения: 515
Зарегистрирован: Вт янв 01, 2013 15:51:19
Откуда: Vilnius

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

Сообщение Jurkin »

...ой, нет ..задач своих выше крыши ...а в данном случае лучше купить, благо рынок под завязку на любой вкус. Собственная разработка в этом ракурсе интересна разве что на побаловаться, какие идеи реализовать, что ни у кого нету - типа передовать/принимать телеметрию какую хитрую к примеру или ещё чего этакого... а так, лучше в магазин, а потом глядишь и дороботать готовое под свои хотелки ;)
Ответить

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