система дистанционного управления на ATtiny 2313 "c нуля"
| |
ВитГо | Дата: Пятница, 05.10.2012, 22:12 | Сообщение # 16 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| принтскрин, желательно по длиннее... чтобы понять что же все таки передает наша программа
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 06.10.2012, 21:15 | Сообщение # 17 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| ну вот архив с "осциллограммами" сигнал записывается в виде двух графиков (график№1 и график№2) график №2 это осциллограмма с "закрытого" входа звуковой карты график №1 это (видимо) то что потом выйдет на динамики (это Не наш вариант - но я, тоже его прилагаю.....)
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Суббота, 06.10.2012, 21:19 | Сообщение # 18 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| чтото нифига не понятно по этим графикам...
сделай отправку одного фиксированного байта - и сними с него осциллограмму
и сделай значения счетчиков для 1 и 0 по максимуму (насколько можно, но чтобы они отличались друг от друга в 2 раза ) - чтобы звуковухой можно было разницу увидеть, возможно что просто звуковуха не успевает регистрировать сигнал
можно даже последнее только сделать, и потом опять снять осциллограммы
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 06.10.2012, 21:44 | Сообщение # 19 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Quote возможно что просто звуковуха не успевает регистрировать сигнал да это вряд ли! я же фьюзы не менял! заводские стоят! частота намного ниже чем задумывалось! ...к стати о фьюзах - может в них дело ? (шью понипрогом)
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Суббота, 06.10.2012, 21:46 | Сообщение # 20 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| да нет, на фюзы не похоже..
странная просто осциллограмма.. импульсов совсем нет.. пики одни.. :-(
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 06.10.2012, 22:07 | Сообщение # 21 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| как нет ? смотри файл фигня3,0 (опечатался) ЗЫ файл фигня4,0 не смотри (там график 1)
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 06.10.2012, 22:10 |
|
| |
ВитГо | Дата: Суббота, 06.10.2012, 22:12 | Сообщение # 22 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| просто на этом графике очень странная длительность пауз..
паузы у нас либо равны импульсам либо в 2 раза больше..
а на графике не понятно откуда такие взялись.. вот и нужно проверить - может измеряем криво ?
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 06.10.2012, 22:21 | Сообщение # 23 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| мне кажется что это не паузы! а время которое микроконтроллер опрашивает клаву и проверяет нажата ли кнопка а импульс это время отправки пакетаДобавлено (06.10.2012, 22:21) --------------------------------------------- если импульс это время отправки пакета, то почему я нормальным осциллографом не вижу колебания в этом импульсе...
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Суббота, 06.10.2012, 22:23 | Сообщение # 24 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| нее, это точно не так..
знаешь что нужно еще: добавь как сигнал на какой нить пин - чтобы 1 - это ожидание нажатия кнопки, и 0 - это передача пакета, причем после передачи чтобы опять был лог. 1
тогда можно будет по наличию лог. 0 делать вывод и том передается ли пакет или нет (примерно оченить время пакета)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 06.10.2012, 23:13 | Сообщение # 25 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| понял!
результаты скорее всего завтра (точнее утром)
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 06.10.2012, 23:30 |
|
| |
ВитГо | Дата: Суббота, 06.10.2012, 23:27 | Сообщение # 26 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| нет, все правильно, почитай про RCALL и RJMP одна команда другой не мешает..
работают они так: RCALL переходит на "метку" и запоминает на стеке адрес возврата..
далее, в программе (после "метки") ты можешь пользоваться неограниченный количеством RJMP переходов, но когда тебе нужно будет вернуться в вызывающую программу - то ты используешь команду RET которая возьмем со стека адрес для возврата и вернется на нее...
так что все правильно было !
а вот если ты вернешься по RJMP - то у тебя на стеке останется адрес.. потом еще один адрес, потом еще один адрес - и в итоге у тебя вся память будет перезаписана адресом возврата, который ни разу считан не будет - это достаточно тяжело обнаруживаемый баг.. вообще все что касается стека требует особого внимания, так как иногда вылазиет это такими чудными и непонятными глюками - что найти их крайне тяжело, зачастую переписываешь куски кода целиком...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 15:05 | Сообщение # 27 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| тупанул я у тебя просто в двух местах стоит RET на одну и ту же rcall certain_buttons_keyboard потом дошло что их можно и в трех местах записать.............
я почему то подумал что переход по BRNE то же сохраняет адрес на стеке........
Добавлено (07.10.2012, 14:39) --------------------------------------------- я тут одну строчку добавлял Code loop_wait_transmitt: ; цикл ожидания завершения передачи
cpi R22 , 7 brne loop_wait_transmitt
ldi temp1,0 ; ВОТ ЭТУ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ret ; возврат в главный цикл [2<] (либо RCALL METKA)
не буду объяснять зачем я это делал - ну в общем по своей глупости
сейчас я эту строчку конечно же убрал!!! и генерация пропала вовсе ...... так что те осциллограммы (которые я здесь выкладывал) не нужно принимать во внимание !
попробую разобраться почему не генерится сигнал.........Добавлено (07.10.2012, 15:05) --------------------------------------------- блииииин ни че не понимаю...
заменил здесь Code loop_wait_transmitt: ; цикл ожидания завершения передачи
cpi R22 , 7 brne loop_wait_transmitt
ret ; возврат в главный цикл [2<] (либо RCALL METKA) ret на RCALL METKA и генерация возобновилась ответь пожалуйста на два вопроса
1) можно ли в нескольких местах ставить RET если RCALL только в одном месте ????
2) при переходе по BRNE (breq и т.д.) адрес команды сохраняется на стеке как при переходе по RCALL или не сохраняется как при RJMP ???
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 14:48 |
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 15:24 | Сообщение # 28 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (uwrtey) 1) можно ли в нескольких местах ставить RET если RCALL только в одном месте ?
это ассемблер, поэтому можно все
нет тут правильного ответа, вообще по началу нужно стремиться чтобы из процедуры вызываемой по rcall был только один выход по ret (это как раз я и делал когда из разных частей программы доскакивал до ret при помощи rjmp)
Quote (uwrtey) 2) при переходе по BRNE (breq и т.д.) адрес команды сохраняется на стеке как при переходе по RCALL или не сохраняется как при RJMP ? с чего бы это? всякие brXX - это фактически rjmp который выполняется по условию. поэтому ничего на стеке не сохраняется !
на стеке адрес возврата сохраняется только при CALL или RCALL и при вызове обработчика прерывания
при этом из подпрограмм вызванных CALL или RCALL нужно возвращаться командой RET
а из обработчика прерываний командой RETI - это очень важно, так как при входе в прерывание микроконтроллер автоматом запрещает обработку всех других прерываний (то есть в самом прерывании CLI делать не нужно), и при выходе командой RETI - все запрещенные прерывания автоматом разрешаются (то есть перед выходом SEI делать не нужно)
проверяй программу я обычно прикидываюсь процессором и выписываю на бумагу результат выполнения каждой команды и установленные\сброшенные флаги... - сперва это занимает много времени, но потом многие вещи делаются буквально в уме
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 15:38 | Сообщение # 29 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| спасибо, твой ответ оправдал мои ожидания..
поправил код, сейчас генерации нету... пошел ее искать
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 15:52 | Сообщение # 30 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| разбей программу на блоки
блок 1 проверяем вызывается ли процедура старта генерации для этого в месте где ты определил что кнопка нажата и нужно генерить сигнал - вставляй отладочный вывод на какой нить пин порта - чтобы зажечь светодиод
если блок 1 будет работать правильно - то при нажатии на кнопку ты должен увидеть сигнал на пине порта... после этого делаем проверку блока 2
блок 2
проверяем генерацию:
первое - правильность установки вывода OC1A в нужное нам состояние для этого после команд задания состояния пина OC1A ставим заглушку Code debug_code: rjmp debug_code то есть программа дойдет до заглушки и повиснет, а ты спокойно проверишь состояние OC1A потом сделаешь установку OC1A в другое состояние, и снова проверишь потом поставишь установку правильного состояния OC1A, проверишь, и уберешь заглушку
второе - правильность инициализации таймера для этого первой командой при входе в прерывание ставишь опять таки вывод отладочного бита в какой нить порт и ставишь после этого заглушку запускаешь и убеждаешься что прерывание запустилось - значит проинитили его правильно, и бог с ним что контроллер повис, нам не это важно..
третье - правильность генерации таймером
просто ставишь там RETI на входе в прерывание и на выводе OC1A ты должен увидеть прямоугольные импульсы (время импульса равно времени паузы)
четвертое - правильность генерации бита
пятое - правильность генерации байта
шестое - правильность генерации все посылки из буфера
седьмое - правильность отключения таймера
вот тебе и весь алгоритм проверки в идеале вообще все лишнее выкинуть из кода (чтобы не путаться) и постепенно добавлять проверяя каждый шаг (я обычно так и пишу, потому как большие куски редко работают с первого раза, и разбираться в них очень сложно потом)
Виталий (аka ВитГо)
|
|
| |
|