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

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

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

Сообщение uwrtey »

ВитГо писал(а):и разве руки не чешутся засунуть код в подпрограмму и сделать его вызов через RCALL ?
вот что начесал
Спойлер

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

	





	ldi R21,0				; это будет счетчик единичек в передаче @@@ ДОБАВЛЕНО @@@

	ldi zl,low(transmit_buff)		; зададим адрес начала буфера передачи в ОЗУ
	ldi zh,high(transmit_buff)

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

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

keybuffer_loop: 

	ld temp,y+				; прочитаем байт для передачи

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



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


	rcall pulse_duration			; Вызов подпрограммы //////////////////////////////////////

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

	rcall duration_unit			; Вызов подпрограммы //////////////////////////////////////

	inc R21					; передаем единицу - увеличим счетчик  @@@ ДОБАВЛЕНО @@@

send_nullen:


	rcall write_data_to_the_RAM
   
	dec R18					; уменьшим счетчик бит на передачу
	brne byte_loop

	dec R17					; уменьшим счетчик байт для передачи
	brne keybuffer_loop


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


	rcall pulse_duration			; Вызов подпрограммы //////////////////////////////////////


; здесь в R21 число единичек

	ROR R21					; двигаем байт вправо
	brcs send_bitchetn			; если "С" установлен значит нечетное число единиц у нас

	rcall duration_unit			; Вызов подпрограммы //////////////////////////////////////

send_bitchetn:

	rcall write_data_to_the_RAM


;-----------------------------------------------------------------------------------------------------------
;
;
; а вот и подпрограммы (3 штуки)
;************************

pulse_duration:					; здесь задаем длительность для передачи импульса 
						; и для передачи нуля 
						; (хотя можно было сделать индивидуально для каждого)


	ldi r19,high(ImpLen)			; зададим фиксированную длительность импульса
	st z+,r19
	ldi r19,low(ImpLen)   
	st z+,r19

	ldi  xl, low(Nullen)			; длительность для передачи нуля
	ldi  xh, high(Nullen)

ret

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

duration_unit:					; здесь задаем длительность для передачи единицы


	ldi xl,low(onelen)			; длительность для передачи единицы
	ldi xh,high(onelen)

ret

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

write_data_to_the_RAM:				; здесь будем записывать длительности в ОЗУ

	st z+,xh				; сохраним в буфере на передачу
	st z+,xl
ret

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





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

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

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

это слишком сложно,

можно в 3 раза проще !

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

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

Сообщение uwrtey »

посмотри в описание команд AVR - какие из них меняют флаг С а какие нет ?
судя по всему ROR и ROL.
Или ты о тех командах которых нет в этом коде? тогда я их посмотрю тут
http://dfe.petrsu.ru/koi/posob/avrlab/a ... ssion//url
можно ли сделать с 1ой подпрограммой изменив порядок команд
сейчас подумаю....
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

что то ни чего связанного с флагом "С" на ум не идет... :dont_know:

вот такую ерунду смог придумать....
Спойлер

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


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

	ldi zl, low(transmit_buff)		; зададим адрес начала буфера передачи в ОЗУ
	ldi zh, high(transmit_buff)

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

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



keybuffer_loop: 
    
	ld  temp , y+				; прочитаем байт для передачи

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


byte_loop:					; здесь кодируем импульс для бита
			
	ldi xh,high(ImpLen)			; зададим фиксированную длительность импульса 
	ldi xl,low(ImpLen)

	rcall write_data_to_the_RAM            ;////////////////////////////////////////////////////////////////

	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:

	rcall write_data_to_the_RAM              ;////////////////////////////////////////////////////////////////
   
	dec R18					; уменьшим счетчик бит на передачу
	brne   byte_loop

	dec R17					; уменьшим счетчик байт для передачи
	brne   keybuffer_loop


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

	ldi xh,high(ImpLen)			; зададим фиксированную длительность импульса 
	ldi xl,low(ImpLen)
	
	rcall write_data_to_the_RAM         ;////////////////////////////////////////////////////////////////


	ldi  xl, low(Nullen) 			; длительность для передачи нуля
	ldi  xh, high(Nullen)

						; здесь в R21 число единичек

	ROR R21					; двигаем байт вправо
	brcs send_bitchetn 			; если флаг "С" установлен (=1) значит нечетное число единиц у нас

	ldi  xl, low(onelen)			; длительность для передачи единицы
	ldi  xh, high(onelen)

send_bitchetn:

	rcall write_data_to_the_RAM         ;////////////////////////////////////////////////////////////////

;---------------------------------------------------------------------------------------------------


write_data_to_the_RAM:

	st z+, xh				; сохраним в буфере на передачу
	st z+, xl

ret

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

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

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

Неа.. смотри:

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

     ldi R21, 0                        ; это будет счетчик единичек в передаче @@@ ДОБАВЛЕНО @@@

     ldi zl, low(transmit_buff)   ; зададим адрес начала буфера передачи в ОЗУ
     ldi zh, high(transmit_buff)

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

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

keybuffer_loop:     
     ld  temp , y+  ; прочитаем байт для передачи

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

byte_loop:
    ; здесь кодируем импульс для бита
     ROL temp                 ; команда сюрприз! прочитай как работает

     RCALL   send_bit      ; отправим наш бит данных !
   
      dec R18      ; уменьшим счетчик бит на передачу
      brne   byte_loop

      dec R17     ; уменьшим счетчик байт для передачи
      brne   keybuffer_loop
      
; ---------------------------------------------------------------------------------------------
; здесь формируем посылку для бита четности
; здесь фактически код для формирования одного бита

    ROR R21                 ; команда сюрприз! прочитай как работает

    RCALL send_bit       ; отправим наш бит четности

    ret ; конец подпрограммы подготовки данных на отправку

; --------------------------------------------------------------------------------------------------
;  А НИЖЕ ТА САМАЯ ПОДПРОГРАММА КОТОРАЯ ГОТОВИТ ОТПРАВКУ ОДНОГО БИТА 
;

; подпрограмма подготовки одного бита для отправки --------------------------------------
send_bit:
                                     ; команды LDI не меняют состояния флага С - который мы выставили 
                                     ; до входа в подпрограмму
     ldi r19,high(ImpLen)   ; зададим фиксированную длительность импульса
     st z+, r19
     ldi r19,low(ImpLen)   
     st z+, r19

     ldi  xl, low(Nullen)    ; длительность для передачи нуля
     ldi  xh, high(Nullen)

                                    ; вот здесь мы реагируем на флаг С который установили до входа в 
                                    ; подпрограмму, он не изменился после команд LDI которые были 
                                    ; исполнены до него !
     brcc send_nullen       ; если С=0 то записываем нулевую длительность

     ldi  xl, low(onelen)    ; длительность для передачи единицы
     ldi  xh, high(onelen)
     inc  R21                  ; передаем единицу - увеличим счетчик  @@@ ДОБАВЛЕНО @@@

send_nullen:
     st z+, xh      ; сохраним в буфере на передачу
     st z+, xl

      ret              ; возврат из подпрограммы
вот гдето так, в компиляторе не проверял, о уверен что алгоритм представлен правильно :-)

причем даже это не окончательный вариант, я бы подпрограмму поместил на место кода отправки бита четности и съэкономил еще 4 байта памяти программ (ушли бы по одной команде RCALL и RET) - но наверное тогда уже совсем непонятно будет...

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

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

Сообщение uwrtey »

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

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

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

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

теперь нужно посмотреть использовать предделитель таймера T1 для того чтобы уместить длительность сигналов в 1 байт либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...

выбирай способ который тебе кажется более простым в решении..

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

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

Сообщение uwrtey »

:sleep: утро НОЧЕРА мудренее
ВитГо писал(а):я пытался подсказать, но наверное у меня подсказка была тяжелая..
это я недотюкал..... :beer: подсказка замечательная...теперь понимаю о чем она..

есть замечание по твоему коду:
- у тебя бит четности установлен, если в ходе проверки будет выявлено НЕЧЕТНОЕ число!
(а по идее бит четности устанавливают если число четное! - как в прошлом твоем варианте)
я прекрасно понимаю, что в данном случае это некритично - и когда я пытался самостоятельно написать эту подпрограмму, то тоже этим манипулировал... :oops: :)))
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

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

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

Сообщение uwrtey »

что то с командой COM мне не понятно
тут http://dfe.petrsu.ru/koi/posob/avrlab/a ... ssion//url написано, что это побитная инверсия
тут http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/com.htm этой командой дополняют до единицы...
ни че не понятно ....

в общем видимо должно было быть так ?
Спойлер

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

    
;-------------------------------------------------------------------------------------------------

	ldi R21,0 			; это будет счетчик единичек в передаче 
	ldi zl,low(transmit_buff)	; зададим адрес начала буфера передачи в ОЗУ
	ldi zh,high(transmit_buff)

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

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

keybuffer_loop: 
   
	ld temp,y+			; прочитаем байт для передачи

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



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

	ROL temp			; двигаем байт влево (циклический сдвиг влево)

	RCALL send_bit			; подпрограмма отправки нашего бита данных!
   
	dec R18				; уменьшим счетчик бит на передачу
	brne byte_loop

	dec R17				; уменьшим счетчик байт для передачи
	brne keybuffer_loop
     
; ---------------------------------------------------------------------------------------------
; здесь формируем посылку для бита четности
; здесь фактически код для формирования одного бита

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

	ROR R21				; двигаем байт вправо (циклический сдвиг вправо)

	RCALL send_bit			; подпрограмма отправки нашего бита четности

	ret				; конец подпрограммы подготовки данных на отправку

; --------------------------------------------------------------------------------------------------
;  А НИЖЕ ТА САМАЯ ПОДПРОГРАММА КОТОРАЯ ГОТОВИТ ОТПРАВКУ ОДНОГО БИТА
;

; подпрограмма подготовки одного бита для отправки --------------------------------------


send_bit:
					; команды LDI не меняют состояния флага "С" - который мы выставили
					; до входа в подпрограмму


	ldi r19,high(ImpLen)		; зададим фиксированную длительность импульса
	st z+,r19
	ldi r19,low(ImpLen)   
	st z+,r19

	ldi xl,low(Nullen)		; длительность для передачи нуля
	ldi xh,high(Nullen)

					; вот здесь мы реагируем на флаг "С" который установили до входа в
					; подпрограмму, он не изменился после команд LDI которые были
					; исполнены до него !


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

	ldi xl,low(onelen)		; длительность для передачи единицы
	ldi xh,high(onelen)
	inc R21				; передаем единицу - увеличим счетчик  

send_nullen:

	st z+,xh			; сохраним в буфере на передачу
	st z+,xl

	ret				; возврат из подпрограммы

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

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

Сообщение uwrtey »

ВитГо писал(а):теперь нужно посмотреть использовать предделитель таймера T1 для того чтобы уместить длительность сигналов в 1 байт либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
вот тут я ни чего не понял... :dont_know:
...ах, ну да - длительность каждого передаваемого бита мы записываем в ОЗУ с помощью двух байтов (16 бит)
да нужно как то уменьшать ( а то получается (8*5*2+1)*16=1296 бит)
сейчас подумаю.....
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

если использовать предделитель
то подойдет ск/64
при этом период одного тика таймера увеличится в 64 раза 0,05мкс*64=3,2 мкс

длительность импульса 165 мкс не подойдет, так как 165/3,2=51,5325 (дробное число)
придется изменить длительность импульса, например 166,4 мкс___166,4/3,2=52 (0x34) и 332,8 мкс_____332,8/3,2=104 (0x68)
:) ну вот, теперь длительность занимает 1 байт, а не два...

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

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

ldi Temp,(1<<wgm12)|(1<<cs11)|(1<<cs10)		;подключили режим "CTC" (вместе с *1) и установили тактовый сигнал = CK (1:64)
out TCCR1B,Temp				                        ; таймер начал считать!!!
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

ВитГо писал(а):либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
Боюсь, что так не получится сделать, так как старшие части 0xCE4 и 0x19C8 одинаковы...110011100100 и 1100111001000
.... ну либо я не правильно Тебя понял...
:beer:
Последний раз редактировалось uwrtey Вт сен 18, 2012 21:12:46, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

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

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

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

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

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

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

uwrtey писал(а):
ВитГо писал(а):либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
Боюсь, что так не получится сделать, так как старшие части 0xCE4 и 0x19C8 одинаковы...110011100100 и 1100111001000
где ты видишь одинаковые старшие части ?
0xCE4 точно меньше 0x19C8
причем у первого старший байт 0x0C у второго 0x19
где же они равны ?
Последний раз редактировалось ВитГо Вт сен 18, 2012 18:16:44, всего редактировалось 1 раз.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

В принципе нам младший байт счетчика не нужен..

давай так:

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

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

Сообщение uwrtey »

ВитГо писал(а):где ты видишь одинаковые старшие части ?
0xCE4 точно меньше 0x19C8
причем у первого старший байт 0x0C у второго 0x19
где же они равны ?
точно, во тупанул я.... :oops: :oops: :oops: циферки одинаковые увидел (видимо я на них ж*пой смотрел :oops:
***********
тогда сразу вопрос
если мы будем записывать в буфер только старший байт, (младший байт =0) то и передавать мы будем
0x0C 3072*0,05мкс=153,6 мкс для единицы
0x19 6400*0,05мкс=320 мкс для нуля
и 153,6 мкс для импульса
я правильно понял ?
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

да, правильно

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

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

Сообщение uwrtey »

ясно, вечерком код постараюсь переделать.
не зная броду не лезь к вольтмоду
Ответить

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