Четверг, 02.05.2024, 09:56
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | система дистанционного управления на ATtiny 2313 "c нуля" - Страница 2 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Разрабатываю ! » система дистанционного управления на ATtiny 2313 "c нуля" (пошаговое изучение строительства систем радиоуправления)
система дистанционного управления на ATtiny 2313 "c нуля"
ВитГоДата: Пятница, 05.10.2012, 22:12 | Сообщение # 16
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
принтскрин, желательно по длиннее...
чтобы понять что же все таки передает наша программа


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 06.10.2012, 21:15 | Сообщение # 17
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
ну вот архив с "осциллограммами"
сигнал записывается в виде двух графиков (график№1 и график№2)
график №2 это осциллограмма с "закрытого" входа звуковой карты
график №1 это (видимо) то что потом выйдет на динамики (это Не наш вариант - но я, тоже его прилагаю.....)
Прикрепления: 8261157.rar (314.7 Kb)


не успеваю за своими мыслями......
 
ВитГоДата: Суббота, 06.10.2012, 21:19 | Сообщение # 18
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
чтото нифига не понятно по этим графикам...

сделай отправку одного фиксированного байта - и сними с него осциллограмму

и сделай значения счетчиков для 1 и 0 по максимуму (насколько можно, но чтобы они отличались друг от друга в 2 раза ) - чтобы звуковухой можно было разницу увидеть, возможно что просто звуковуха не успевает регистрировать сигнал

можно даже последнее только сделать, и потом опять снять осциллограммы


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 06.10.2012, 21:44 | Сообщение # 19
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Quote
возможно что просто звуковуха не успевает регистрировать сигнал

да это вряд ли!
я же фьюзы не менял! заводские стоят! частота намного ниже чем задумывалось!
...к стати о фьюзах - может в них дело ? (шью понипрогом)


не успеваю за своими мыслями......
 
ВитГоДата: Суббота, 06.10.2012, 21:46 | Сообщение # 20
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
да нет, на фюзы не похоже..

странная просто осциллограмма.. импульсов совсем нет.. пики одни.. :-(


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 06.10.2012, 22:07 | Сообщение # 21
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
как нет ?
смотри файл фигня3,0
(опечатался)
ЗЫ файл фигня4,0 не смотри (там график 1)
Прикрепления: 9012870.rar (58.3 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Суббота, 06.10.2012, 22:10
 
ВитГоДата: Суббота, 06.10.2012, 22:12 | Сообщение # 22
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
просто на этом графике очень странная длительность пауз..

паузы у нас либо равны импульсам либо в 2 раза больше..

а на графике не понятно откуда такие взялись..
вот и нужно проверить - может измеряем криво ?


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 06.10.2012, 22:21 | Сообщение # 23
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
мне кажется что это не паузы! а время которое микроконтроллер опрашивает клаву и проверяет нажата ли кнопка
а импульс это время отправки пакета

Добавлено (06.10.2012, 22:21)
---------------------------------------------
если импульс это время отправки пакета, то почему я нормальным осциллографом не вижу колебания в этом импульсе...


не успеваю за своими мыслями......
 
ВитГоДата: Суббота, 06.10.2012, 22:23 | Сообщение # 24
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
нее, это точно не так..

знаешь что нужно еще: добавь как сигнал на какой нить пин - чтобы 1 - это ожидание нажатия кнопки, и 0 - это передача пакета,
причем после передачи чтобы опять был лог. 1

тогда можно будет по наличию лог. 0 делать вывод и том передается ли пакет или нет (примерно оченить время пакета)


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 06.10.2012, 23:13 | Сообщение # 25
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
понял!

результаты скорее всего завтра (точнее утром)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Суббота, 06.10.2012, 23:30
 
ВитГоДата: Суббота, 06.10.2012, 23:27 | Сообщение # 26
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
нет, все правильно, почитай про RCALL и RJMP
одна команда другой не мешает..

работают они так:
RCALL переходит на "метку" и запоминает на стеке адрес возврата..

далее, в программе (после "метки") ты можешь пользоваться неограниченный количеством RJMP переходов, но когда тебе нужно будет вернуться в вызывающую программу - то ты используешь команду RET которая возьмем со стека адрес для возврата и вернется на нее...

так что все правильно было !

а вот если ты вернешься по RJMP - то у тебя на стеке останется адрес.. потом еще один адрес, потом еще один адрес - и в итоге у тебя вся память будет перезаписана адресом возврата, который ни разу считан не будет - это достаточно тяжело обнаруживаемый баг.. вообще все что касается стека требует особого внимания, так как иногда вылазиет это такими чудными и непонятными глюками - что найти их крайне тяжело, зачастую переписываешь куски кода целиком...


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.10.2012, 15:05 | Сообщение # 27
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: 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
Репутация: 20
Статус: 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
Репутация: 11
Статус: Offline
спасибо, твой ответ оправдал мои ожидания.. biggrin

поправил код, сейчас генерации нету... пошел ее искать


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 07.10.2012, 15:52 | Сообщение # 30
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
разбей программу на блоки

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

если блок 1 будет работать правильно - то при нажатии на кнопку ты должен увидеть сигнал на пине порта...
после этого делаем проверку блока 2

блок 2

проверяем генерацию:

первое - правильность установки вывода OC1A в нужное нам состояние
для этого после команд задания состояния пина OC1A ставим заглушку
Code

debug_code: rjmp debug_code

то есть программа дойдет до заглушки и повиснет, а ты спокойно проверишь состояние OC1A
потом сделаешь установку OC1A в другое состояние, и снова проверишь
потом поставишь установку правильного состояния OC1A, проверишь, и уберешь заглушку

второе - правильность инициализации таймера
для этого первой командой при входе в прерывание ставишь опять таки вывод отладочного бита в какой нить порт и ставишь после этого заглушку
запускаешь и убеждаешься что прерывание запустилось - значит проинитили его правильно, и бог с ним что контроллер повис, нам не это важно..

третье - правильность генерации таймером

просто ставишь там RETI на входе в прерывание и на выводе OC1A ты должен увидеть прямоугольные импульсы (время импульса равно времени паузы)

четвертое - правильность генерации бита

пятое - правильность генерации байта

шестое - правильность генерации все посылки из буфера

седьмое - правильность отключения таймера

вот тебе и весь алгоритм проверки
в идеале вообще все лишнее выкинуть из кода (чтобы не путаться) и постепенно добавлять проверяя каждый шаг (я обычно так и пишу, потому как большие куски редко работают с первого раза, и разбираться в них очень сложно потом)


Виталий (аka ВитГо)
 
Форум » Разработка электронных устройств » Разрабатываю ! » система дистанционного управления на ATtiny 2313 "c нуля" (пошаговое изучение строительства систем радиоуправления)
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz