Страница 13 из 15
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 07:30:11
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
;*************************
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 07:58:25
ВитГо
это слишком сложно,
можно в 3 раза проще !
подсказка:
посмотри в описание команд AVR - какие из них меняют флаг С а какие нет ?
можно ли сделать с 1ой подпрограммой изменив порядок команд ?
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 09:12:42
uwrtey
посмотри в описание команд AVR - какие из них меняют флаг С а какие нет ?
судя по всему ROR и ROL.
Или ты о тех командах которых нет в этом коде? тогда я их посмотрю тут
http://dfe.petrsu.ru/koi/posob/avrlab/a ... ssion//url
можно ли сделать с 1ой подпрограммой изменив порядок команд
сейчас подумаю....
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 21:04:26
uwrtey
что то ни чего связанного с флагом "С" на ум не идет...
вот такую ерунду смог придумать....
Спойлер
Код: Выделить всё
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
;----------------------------------------------------------------------------------------------------
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 22:53:47
ВитГо
Неа.. смотри:
Код: Выделить всё
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) - но наверное тогда уже совсем непонятно будет...
кстати будет наглядно если ты распечатаешь на бумаге первый вариант программы с расчетом бита четности (с прошлой страницы форума) и этот вариант - сравнивать будет намного проще и понятнее....
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 23:05:50
uwrtey
я пытался сделать подобное - но последовательность команд не додумался поменять - по этому, у меня и не получилось..........
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 23:13:31
ВитГо
я пытался подсказать, но наверное у меня подсказка была тяжелая..
теперь нужно посмотреть использовать предделитель таймера T1 для того чтобы уместить длительность сигналов в 1 байт либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
выбирай способ который тебе кажется более простым в решении..
и модифицируй программу подготовки данных для отправки на работу с одним байтом длительности.
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вс сен 16, 2012 23:33:27
uwrtey

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

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

Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Пн сен 17, 2012 05:23:14
ВитГо
ой, точно.. перед сдвигом бита четности COM R21 забыл поставить...
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Пн сен 17, 2012 15:38:04
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 отметил многочисленными знаками вопроса...
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Пн сен 17, 2012 18:18:23
uwrtey
ВитГо писал(а):теперь нужно посмотреть использовать предделитель таймера T1 для того чтобы уместить длительность сигналов в 1 байт либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
вот тут я ни чего не понял...

...ах, ну да - длительность каждого передаваемого бита мы записываем в ОЗУ с помощью двух байтов (16 бит)
да нужно как то уменьшать ( а то получается (8*5*2+1)*16=1296 бит)
сейчас подумаю.....
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Пн сен 17, 2012 20:54:51
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 ; таймер начал считать!!!
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Пн сен 17, 2012 22:07:39
uwrtey
ВитГо писал(а):либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
Боюсь, что так не получится сделать, так как старшие части 0xCE4 и 0x19C8 одинаковы...110011100100 и 1100111001000
.... ну либо я не правильно Тебя понял...

Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вт сен 18, 2012 16:08:47
uwrtey
чего дальше делать?
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вт сен 18, 2012 18:10:06
ВитГо
uwrtey писал(а):что то с командой COM мне не понятно - написано, что это побитная инверсия.
так оно и есть
uwrtey писал(а):в общем видимо должно было быть так ?
да, правильно, туда и нужно вставить
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вт сен 18, 2012 18:13:42
ВитГо
uwrtey писал(а):ВитГо писал(а):либо задавать для длительности таймера только OCR1AH а вместо OCR1L - всегда передавать ноль...
Боюсь, что так не получится сделать, так как старшие части 0xCE4 и 0x19C8 одинаковы...110011100100 и 1100111001000
где ты видишь одинаковые старшие части ?
0xCE4 точно меньше 0x19C8
причем у первого старший байт 0x0C у второго 0x19
где же они равны ?
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вт сен 18, 2012 18:16:06
ВитГо
В принципе нам младший байт счетчика не нужен..
давай так:
перепиши код кодирующий нашу передаваемую последовательность таким образом чтобы в буфер записывался только старший байт - по идее после этого наша последовательность байт уменьшиться в размерах в двое
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вт сен 18, 2012 20:46:26
uwrtey
ВитГо писал(а):где ты видишь одинаковые старшие части ?
0xCE4 точно меньше 0x19C8
причем у первого старший байт 0x0C у второго 0x19
где же они равны ?
точно, во тупанул я....

циферки одинаковые увидел (видимо я на них ж*пой смотрел

***********
тогда сразу вопрос
если мы будем записывать в буфер только старший байт, (младший байт =0) то и передавать мы будем
0x0C 3072*0,05мкс=153,6 мкс для единицы
0x19 6400*0,05мкс=320 мкс для нуля
и 153,6 мкс для импульса
я правильно понял ?
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Ср сен 19, 2012 04:37:47
ВитГо
да, правильно
нам же в этой задаче пофигу какая длительность, главное чтобы импульсы заметно отличались.. - поэтому хватит старшего байта
Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Ср сен 19, 2012 06:15:03
uwrtey
ясно, вечерком код постараюсь переделать.