Re: Пропорциональное управление на МК (Знание=Сила)
Добавлено: Вт сен 11, 2012 22:08:22
как придумаешь, пиши...теперь бы придумать как его тебе попроще объяснить
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
как придумаешь, пиши...теперь бы придумать как его тебе попроще объяснить
Код: Выделить всё
ImpLen ; 0
Nullen
ImpLen ; 1
Onelen
ImpLen ; 0
Nullen
ImpLen ; 0
Nullen
ImpLen ; 1
Onelen
ImpLen ; 0
Nullen
ImpLen ; 0
Nullen
ImpLen ; 1
Onelen
Код: Выделить всё
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 r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+, r19
ldi r19,low(ImpLen)
st z+, r19
ldi xl, low(Nullen) ; длительность для передачи нуля
ldi xh, high(Nullen)
ROL temp ; команда сюрприз! прочитай как работает
brnc send_nullen
ldi xl, low(onelen) ; длительность для передачи единицы
ldi xh, high(onelen)
send_nullen:
st z+, xh ; сохраним в буфере на передачу
st z+, xl
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
угу, думать полезно... может что интереснее придумаешьuwrtey писал(а):пища для ума, вечером будет над чем помыслить![]()
нет, объединять не стоит, мы же не знаем к чему приведут наши эксперименты, вдруг у нас ImpLen потом будет отличаться от Onelen? - придется по коду лазить и менять... хорошо если код в одном файле.. а если нет?uwrtey писал(а):а не проще будет объединить ImpLen и Onelen - ведь они равны ??? (или тут задумка другая...)
ой.. ну тогда .equuwrtey писал(а):я не згаю что такое .define
яндекс говорит что это СИ
регистр состояния (SREG) http://controllersystems.com/books/prak ... -sreg.htmlСдвиг всех битов Rd на одно место влево. Флаг переноса (С) регистра состояния (SREG) смещается на место бита "0" регистра Rd. Бит "7" смещается во флаг переноса (C).
*** тут есть небольшое замечание к первой цитате ...Флаг переноса (C) устанавливается в "1" , если в результате выполнения операции произошел выход за границы байта
наверно ты хотел сказатьКод: Выделить всё
ROL temp ; команда сюрприз! прочитай как работает brnc send_nullen
Код: Выделить всё
В ОЗУ появился новый массив - "transmit_buff"
в этом массиве будут хранится длительности
массив будет иметь размер 8*5*2*2=160 байт (хватит - ли объема ОЗУ у этого МК ?)
бит четности это фактически признак четности, нужно посчитать сколько было закодировано бит равных единице, и потом если это число четное - то установить бит четности, если число закодированных единиц не четное - то сбросить бит четностиuwrtey писал(а): про бит четности можно поподробней?
ты об этом пока не думай, делай подсчет бита четности и его добавление в последовательность для передачи (соответственно она у тебя должна увеличиться на 4 байта (2 байта на задание времени импульса+2 байта на задание времени паузы)uwrtey писал(а):и как связать этот код с режимом CTC - я не догоняю..........
оперативки то не хватит что бы записать всю информацию...В ОЗУ появился новый массив - "transmit_buff"
в этом массиве будут хранится длительности
массив будет иметь размер 8*5*2*2=160 байт (хватит - ли объема ОЗУ у этого МК ?)
угу, не хватит..uwrtey писал(а):оперативки то не хватит что бы записать всю информацию...В ОЗУ появился новый массив - "transmit_buff"
в этом массиве будут хранится длительности
массив будет иметь размер 8*5*2*2=160 байт (хватит - ли объема ОЗУ у этого МК ?)
я сначала тупанул и сделал один бит четности на каждый прочитанный байтнам нужен один бит четности на всю посылку)
Код: Выделить всё
.EQU ImpLen=0xCE4 ; длина импульса
.EQU OneLen=0xCE4 ; длина паузы для единицы
.EQU NulLen=0x19C8 ; длина паузы для нуля
;******************************************************************************************************
Ldi Temp1,0 ; счетчик четности///////////////////////////////////////////
ldi zl,low(transmit_buff) ; зададим в "Z" адрес начала буфера передачи в ОЗУ
ldi zh,high(transmit_buff)
ldi yl, low(key_buff) ; зададим в "Y" адрес начала буфера прочитанных кнопок
ldi yh, high(key_buff)
ldi R17,5 ; количество байт для передачи
keybuffer_loop:
ld temp,y+ ; прочитаем байт для передачи, увеличим адрес "y" на единицу.
ldi r18,8 ; количество бит в байте для передачи
byte_loop: ; здесь кодируем импульс для бита
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+,r19 ; запишем данные в ОЗУ по адресу из "Z"
ldi r19,low(ImpLen)
st z+,r19
ldi xl,low(Nullen) ; длительность для передачи нуля
ldi xh,high(Nullen)
ROL temp ; сдвигаем байт влево
BRCC send_nullen ; если старши бит = "0" то переходим на метку
ldi xl,low(onelen) ; длительность для передачи единицы
ldi xh,high(onelen)
cpi Temp1,1 ; если в прошлый раз была единица, то идем на метку///////////
breq chetnost
inc Temp1 ; увеличение на 1 (нечетное)//////////////////////////////////
rjmp send_nullen
chetnost:
dec Temp1 ; уменьшение на 1 (четное)////////////////////////////////////
send_nullen:
st z+,xh ; запишем данные в ОЗУ по адресу из "Z"
st z+,xl
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
;*******************************
Код: Выделить всё
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 r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+, r19
ldi r19,low(ImpLen)
st z+, r19
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:
st z+, xh ; сохраним в буфере на передачу
st z+, xl
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
; ---------------------------------------------------------------------------------------------
;
; здесь формируем посылку для бита четности
;
; здесь фактически код для формирования одного бита
;
; здесь кодируем импульс для бита
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+, r19
ldi r19,low(ImpLen)
st z+, r19
; здесь в R21 число единичек
ldi xl, low(Nullen) ; длительность для передачи нуля
ldi xh, high(Nullen)
ROR R21 ; команда сюрприз! прочитай как работает
brcs send_bitchetn ; если С установлен значит нечетное число единиц у нас
ldi xl, low(onelen) ; длительность для передачи единицы
ldi xh, high(onelen)
send_bitchetn:
st z+, xh ; сохраним в буфере на передачу
st z+, xl
Код: Выделить всё
.EQU ImpLen=0xCE4 ; длина импульса
.EQU OneLen=0xCE4 ; длина паузы для единицы
.EQU NulLen=0x19C8 ; длина паузы для нуля
;******************************************************************************************************
Ldi Temp1,0 ; счетчик четности///////////////////////////////////////////
ldi zl,low(transmit_buff) ; зададим в "Z" адрес начала буфера передачи в ОЗУ
ldi zh,high(transmit_buff)
ldi yl, low(key_buff) ; зададим в "Y" адрес начала буфера прочитанных кнопок
ldi yh, high(key_buff)
ldi R17,5 ; количество байт для передачи
keybuffer_loop:
ld temp,y+ ; прочитаем байт для передачи, увеличим адрес "y" на единицу.
ldi r18,8 ; количество бит в байте для передачи
byte_loop: ; здесь кодируем импульс для бита
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+,r19 ; запишем данные в ОЗУ по адресу из "Z"
ldi r19,low(ImpLen)
st z+,r19
ldi xl,low(Nullen) ; длительность для передачи нуля
ldi xh,high(Nullen)
ROL temp ; сдвигаем байт влево
BRCC send_nullen ; если старши бит = "0" то переходим на метку
ldi xl,low(onelen) ; длительность для передачи единицы
ldi xh,high(onelen)
cpi Temp1,1 ; если в прошлый раз была единица, то идем на метку///////////
breq chetnost
inc Temp1 ; увеличение на 1 (нечетное)//////////////////////////////////
rjmp send_nullen
chetnost:
dec Temp1 ; уменьшение на 1 (четное)////////////////////////////////////
send_nullen:
st z+,xh ; запишем данные в ОЗУ по адресу из "Z"
st z+,xl
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
;*******************************
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+, r19
ldi r19,low(ImpLen)
st z+, r19
ldi xl, low(Nullen) ; длительность для передачи нуля (нечетное)
ldi xh, high(Nullen)
cpi Temp1,1 ; проверка на нечетность
breq send_bitchetn ; "0"=четное, "1"=нечетное
ldi xl, low(onelen) ; длительность для передачи единицы (четное)
ldi xh, high(onelen)
send_bitchetn:
st z+, xh ; сохраним в буфере на передачу
st z+, xl
ROR это тот же ROL, только в другую сторону...Код: Выделить всё
ROR R21 ; команда сюрприз! прочитай как работает brcs send_bitchetn ; если С установлен значит нечетное число единиц у нас
что то я Тебя не понял... каких двух кусков ?ВитГо писал(а):кстати сможешь из двух кусков передачи бита сделать подпрограмму
Посмотри внимательно программу которую я привел во второй раз..uwrtey писал(а):что то я Тебя не понял... каких двух кусков ?ВитГо писал(а):кстати сможешь из двух кусков передачи бита сделать подпрограмму