система дистанционного управления на ATtiny 2313 "c нуля"
| |
ВитГо | Дата: Пятница, 26.10.2012, 23:17 | Сообщение # 151 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (uwrtey) так можно записывать ? Code ;****************************************************************************** .EQU ImpLen=0xCE4 ; длина импульса (165 мкс) .EQU OneLen=0xCE4 ; длина паузы для единицы (165 мкс) .EQU NulLen=0x19C8 ; длина паузы для нуля (330 мкс) ;****************************************************************************** in YH,ImpLenH ; записываем в регистровую пару "Y" число из "ImpLen" in YH,ImpLenL ? Нее, ты что ! так не правильно, для выделения младшей\старшей части есть спец команды транслятора должно быть: Code LDI YH,high(ImpLen) ; старшая часть LDI YL, low(ImpLen) ; младшая часть почему у тебя вместо LDI (присваивание) применено IN (чтение из порта)?
Quote (uwrtey) вот тут Code sub XL, YL sbc XH, YH breq XeqY ; переход на обработку когда X=Y brcs XHY ; переход на обработку когда X<Y ; здесь обработка когда X>Y вычитается без переноса младшая часть а с переносом вычитается старшая часть все правильно ? не наоборот ли ? Сам посуди, нужно вычитать из одной младшей части другую, причем если возник перенос - значит нужно первую старшую часть (из младшей которой вычитали) вычесть дополнительно 1.. поэтому первое вычитание sub (вычитаем без флага переноса), а вторая (старшая часть) - вычитается уже с переносом
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 27.10.2012, 00:40 | Сообщение # 152 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| успел уже ответить ?! я сначала тут спросил, потом гуглить пошел, нагуглил ответ и удалил вопрос... но все равно спасибо....Добавлено (27.10.2012, 00:40) ---------------------------------------------
Quote почему у тебя вместо LDI (присваивание) применено IN (чтение из порта)? туплю...
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Суббота, 27.10.2012, 15:44 | Сообщение # 153 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| вот тут накидал немного кода который определит равно ли число из TCNT1 эталону импульса ImpLen=0xCE4 (+/- 10%) если да то мы попадаем на метку breq X_ravno_Y если число больше эталона то на метку metka_dlinnyi_TCNT1 если меньше то metka_korotkiy_TCNT1Добавлено (27.10.2012, 15:44) --------------------------------------------- сейчас еще добавлю проверку на равенство с 0x19C8....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 27.10.2012, 00:52 |
|
| |
uwrtey | Дата: Воскресенье, 28.10.2012, 00:12 | Сообщение # 154 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| сделал проверку равенства/неравенства с 3300 и 6600 (с десятипроцентным допуском)
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Воскресенье, 28.10.2012, 01:11 | Сообщение # 155 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| вот тут объединил но почему то мне кажется что я опять слишком много всего понаписа'л и все это можно сделать компактнее
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 28.10.2012, 09:12 | Сообщение # 156 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| маленькие замечания:
запись в регистры счетчиков TCNTx всегда производить со старшего байта (TCNTxH) и потом младший (TCNTxL), а чтение наоборот с младшего ! где то в документации даже есть про это...
может быть сделать обработку отдельными процедурами ? для проверки длительности импульса и для проверки импульса паузы ? (чтобы не делать селектор вначале процедуры)
по поводу сравнений: - а зачем ты сравниваешь длительность с эталонной ? сразу сравнивай со значением на 10% меньше эталона (должен получить результат больше) и потом с 10% больше эталона (должен получить результат меньше) - если проверку прошел - значит делаем какие то действия... а с серединой можно не сравнивать - не совпадет ! причем это сравнение (+-10%) я бы выделил в отдельную процедуру - чтобы на выходе получать результат в флагах - типа на флаге C например: С=0 проверку не прошел, С=1 проверка прошла успешно соответственно потом эту проверку вызываем по RCALL и по возвращению анализируем флаг С входные параметры: X - полученная длительность, Y на 10% меньше эталона Z на 10% больше эталона (эти параметры устанавливать перед RCALL) тогда и код будет проще..
результат как будешь хранить? побитово (гемора больше) или побайтово? может быть сделать просто 20 байт в ОЗУ под каждый принятый канал ? - тогда можно будет проще сохранять результат (и не париться со сдвигом :-)))
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 28.10.2012, 14:21 | Сообщение # 157 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| Quote результат как будешь хранить? побитово (гемора больше) или побайтово? может быть сделать просто 20 байт в ОЗУ под каждый принятый канал ? - тогда можно будет проще сохранять результат (и не париться со сдвигом :-))) чем проще тем лучше
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 28.10.2012, 16:01 | Сообщение # 158 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| тогда делай по байтно... чтобы не возиться с битами... соответственно заведи какой нить счетчик номера принимаемого канала, и по нему будешь делать вывод - все принял или нет
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Среда, 31.10.2012, 10:40 | Сообщение # 159 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| 1) Quote запись в регистры счетчиков TCNTx всегда производить со старшего байта (TCNTxH) и потом младший (TCNTxL), а чтение наоборот с младшего ! где то в документации даже есть про это... и 2) Quote по поводу сравнений: - а зачем ты сравниваешь длительность с эталонной ? сразу сравнивай со значением на 10% меньше эталона (должен получить результат больше) и потом с 10% больше эталона (должен получить результат меньше) - если проверку прошел - значит делаем какие то действия... а с серединой можно не сравнивать - не совпадет ! причем это сравнение (+-10%) я бы выделил в отдельную процедуру - чтобы на выходе получать результат в флагах - типа на флаге C например: С=0 проверку не прошел, С=1 проверка прошла успешно соответственно потом эту проверку вызываем по RCALL и по возвращению анализируем флаг С входные параметры: X - полученная длительность, Y на 10% меньше эталона Z на 10% больше эталона (эти параметры устанавливать перед RCALL) тогда и код будет проще.. исправил, смотри вложенный файл
Добавлено (28.10.2012, 22:10) --------------------------------------------- 3) Quote может быть сделать обработку отдельными процедурами ? для проверки длительности импульса и для проверки импульса паузы ? (чтобы не делать селектор вначале процедуры а как лучше ??? 4) Quote результат как будешь хранить? побитово (гемора больше) или побайтово? может быть сделать просто 20 байт в ОЗУ под каждый принятый канал ? - тогда можно будет проще сохранять результат (и не париться со сдвигом :-))) и Quote тогда делай по байтно... чтобы не возиться с битами... соответственно заведи какой нить счетчик номера принимаемого канала, и по нему будешь делать вывод - все принял или нет вот тут я в обще ни чего не понял! какой такой "результат" ?Добавлено (31.10.2012, 10:40) --------------------------------------------- Виталий, а надо ли делать программную часть проверки на помехи (импульсы/паузы) длиной менее 2 мкс ??? где то читал что INT_0 не реагирует на такие короткие колебания ( но я могу ошибаться)
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 28.10.2012, 23:11 |
|
| |
ВитГо | Дата: Среда, 31.10.2012, 18:41 | Сообщение # 160 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| отвечать буду с конца
Quote (uwrtey) Виталий, а надо ли делать программную часть проверки на помехи (импульсы/паузы) длиной менее 2 мкс ??? где то читал что INT_0 не реагирует на такие короткие колебания ( но я могу ошибаться)
это потом, сейчас делаем идеальные условия, потом подключим приемник\передатчик и будем смотреть реальные
Quote (uwrtey) Quote результат как будешь хранить? побитово (гемора больше) или побайтово? может быть сделать просто 20 байт в ОЗУ под каждый принятый канал ? - тогда можно будет проще сохранять результат (и не париться со сдвигом :-))) и Quote тогда делай по байтно... чтобы не возиться с битами... соответственно заведи какой нить счетчик номера принимаемого канала, и по нему будешь делать вывод - все принял или нет вот тут я в обще ни чего не понял! какой такой "результат" ?
как какой ? ты же принимаешь пакет, 20 импульсов, и пока не примешь бит четности не знаешь правильный прием или нет, поэтому состояния каналов (вкл\выкл) нужно как то хранить.. можно хранить в битах байта (так же как состояния кнопок в передатчике) - но поверь геморройно это... либо хранить в буфере размером в количество каналов байт (то есть 20 байт) после получения всех 20 каналов, проверки бита четности выводим на пины контроллера (ну или еще куда)
Quote (uwrtey) Quote может быть сделать обработку отдельными процедурами ? для проверки длительности импульса и для проверки импульса паузы ? (чтобы не делать селектор вначале процедуры а как лучше ?? лучше так как в голове укладывается.. по коду сейчас уже ты можешь сам прикинуть как писать - тебе же потом и отлаживать :-)) а то я тебя сейчас буду ломать и из-за этого ты грузиться будешь не там где нужно :-)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Четверг, 01.11.2012, 00:16 | Сообщение # 161 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
|
Quote ты же принимаешь пакет, 20 импульсов, и пока не примешь бит четности не знаешь правильный прием или нет, поэтому состояния каналов (вкл\выкл) нужно как то хранить.. можно хранить в битах байта (так же как состояния кнопок в передатчике) - но поверь геморройно это... либо хранить в буфере размером в количество каналов байт (то есть 20 байт) после получения всех 20 каналов, проверки бита четности выводим на пины контроллера (ну или еще куда) 1) Не 20, а 40+1 ( 5 байт по 8 бит каждый + бит четности ) 2) Ты предлагаешь каждый принятый бит записать в отдельный байт ОЗУ. При условии, что этот бит удовлетворяет равенству [3300+/-10%] или [6600+/- 10%]? я правильно понял ?
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Четверг, 01.11.2012, 07:19 | Сообщение # 162 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| да, именно это и предлагаю :-)
ну пока 41 байт, а потом будем править передатчик чтобы передавал только нужные биты и пропускал пустые
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Четверг, 01.11.2012, 15:42 | Сообщение # 163 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| я понять ни как не могу - надо ли проверять пауза это у нас или импульс ( перед тем как записать в ОЗУ )? и для чего это делать ? ведь запись в ОЗУ будет производиться только с импульса...
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Четверг, 01.11.2012, 17:01 | Сообщение # 164 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| вот накидал немного... Добавлено (01.11.2012, 17:01) --------------------------------------------- есть маленький вопрос: при сравнении "cpi" значение регистра теряется ? и вот такой код работать не будет ? Code __ldi Temp,0 Metka_1
__inc Temp __cpi Temp,10 __brec Metka_2 __rjmp Metka_1
Metka_2:
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Четверг, 01.11.2012, 16:37 |
|
| |
ВитГо | Дата: Четверг, 01.11.2012, 17:06 | Сообщение # 165 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| В смысле теряется? регистра temp что ли ? нет конечно ! на то это и сравнение ! все регистры до и после CPI остаются в своих значениях, меняются только флаги !
Виталий (аka ВитГо)
|
|
| |
|