система дистанционного управления на ATtiny 2313 "c нуля"
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 16:09 | Сообщение # 31 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| ясно, сейчас займусь.....
только вот у меня еще один вопрос назрел
как связана OC1 и PB3 ?
если я изменю состояние OC1 командой
ldi R16,(1<<COM1A1)|(0<<COM1A0) ; (то есть мы в "0" устанавливаем не вывод параллельного порта B, а вывод таймера OC1A) out TCCR1A,R16
ldi R16,(1<<FOC1A) ; принудительно изменить состояние выходов OC1A и OC1B!!! out TCCR1C,R16
то PB3 то же станет лог_0 ?
а если после этого я попробую изменить состояние PB3 командой ldi Temp,0b00001000 ; выводим на передатчик лог_1 out portB,Temp то что произойдет с OC1 ??? ничего ??? и в обще смогу ли я этой командой изменить PB3 ???
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 16:14 |
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 17:26 | Сообщение # 32 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (uwrtey) если я изменю состояние OC1 командой
ldi R16,(1<<COM1A1)|(0<<COM1A0) ; (то есть мы в "0" устанавливаем не вывод параллельного порта B, а вывод таймера OC1A) out TCCR1A,R16
ldi R16,(1<<FOC1A) ; принудительно изменить состояние выходов OC1A и OC1B!!! out TCCR1C,R16
то PB3 то же станет лог_0 ?
да, выход OC1A это альтернативная функция PB3 поскольку мы генерируем сигнал при помощи OC1A - то мы должны использовать только OC1A поэтому устанавливаем только OC1A
установив PB3 - ты не изменишь состояние OC1A - и в последствии генерация будет не правильной - так как может банально не совпасть фаза генерации
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 17:28 | Сообщение # 33 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (uwrtey) а если после этого я попробую изменить состояние PB3 командой ldi Temp,0b00001000 ; выводим на передатчик лог_1 out portB,Temp то что произойдет с OC1 ??? ничего ??? и в обще смогу ли я этой командой изменить PB3 ???
то состояние вывода PB3 измениться, а вот состояние OC1A нет. и когда ты начнешь выдавать сигнал при помощи OC1A в режиме toggle - то начальным значение будет состояние OC1A (которое ты не изменил), а не установленное тобою значение PB3
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 18:20 | Сообщение # 34 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| ясно, спасибо... я удалил пару строчек в начале и в конце программы Ldi Temp,0b00000000 out PortB,Temp ....но теперь при выходе из обработчика прерывания у нас висит лог_1
может стоит этот - Code ;+++++++++++++++++++++++++++++++++++ установка вывода OC1A=0
ldi R16,(1<<COM1A1)|(0<<COM1A0) ; (то есть мы в "0" устанавливаем не вывод параллельного порта B, а вывод таймера OC1A) out TCCR1A,R16
ldi R16,(1<<FOC1A) ; принудительно изменить состояние выходов OC1A и OC1B!!! out TCCR1C,R16 ;+++++++++++++++++++++++++++++++++++ участок кода поместить в конец программы (перед выходом из прерывания) что бы по завершению передачи получить лог_0 а так же поместить его в самое начало программы, для того что бы OC1A имел начальное состояние вывода лог_0
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 18:35 |
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 19:56 | Сообщение # 35 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| согласен, давай так !
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 21:06 | Сообщение # 36 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| сделал программу проверки нажатия клавиатуры (если нажата кнопка то включается светодиод если кнопка не нажата то светодиод гаснет) на практике выяснилось, что при включении мк светодиод погашен, при нажатии на кнопку светодиод загорается!! а если кнопку отпустить то светодиод почему то продолжает гореть...(не гаснет)
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 21:16 | Сообщение # 37 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну конечно будет гореть, ты же в порт не выводишь потом "0".. а то что записал там осталось
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 21:23 | Сообщение # 38 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| как это не вывожу? а это что ?Code
Certain_button:
ld Temp,Z+ ; загрузим данные в регистр из ОЗУ по адресу из регистровой пары "Z", ; и после этого адресс в регистровой паре автоматически увеличится на еденицу
cpi Temp,0b00000000 ; проверяем, нажата ли какая ни будь кнопка? brne inform ; если нажата, то переходим на метку "inform"
dec temp1 ; уменьшим счетчик столбцов клавы brne Certain_button ; если не все столбцы, то циклимся
Ldi Temp,0b00000000 ; если не нажата, то гасим светодиод!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! out PortB,Temp
metka:
ret ; возврат в главный цикл [2<]
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 21:27 |
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 21:36 | Сообщение # 39 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| гм.. по коду все должно быть нормально !
проверяй еще раз..
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 21:41 | Сообщение # 40 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| что проверять ? ЗЫ может данные в ОЗУ как то криво записываются? или может правда с фузами что то не так ?
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 21:43 |
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 21:43 | Сообщение # 41 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| гм.. ты точно тот бит смотришь ?
кнопки при нажатии генерят лог "1" ?
аа, !! еще маску сделай при чтении
Code Certain_button:
ld Temp,Z+ ; загрузим данные в регистр из ОЗУ по адресу из регистровой пары "Z", ; и после этого адресс в регистровой паре автоматически увеличится на единицу
and Temp, 0b00011111 ; где "1" там кнопка, где "0" там кнопок нет - потому сбросим !
cpi Temp,0b00000000 ; проверяем, нажата ли какая ни будь кнопка? brne inform ; если нажата, то переходим на метку "inform"
вот так !
только я не помню где у нас кнопки, может быть правильно такую маску 0b11111000 накладывать..
если это не сделать то ты сам себе сделал нажатие: читаешь с порта B состояние кнопок и свой зажженный светодиод :-) - и поскольку он зажженный - то опять его зажигаешь :-)))
p.s. как то так и перешел на ТЫ :-)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 21:47 | Сообщение # 42 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (uwrtey) что проверять ? Все проверяй.. ответ выше уже прочитал ?
Quote (uwrtey) ЗЫ может данные в ОЗУ как то криво записываются? или может правда с фузами что то не так ? все может быть, но в основном все наши глюки от нас же самих :-)
поэтому: выписываем конфигурацию портов, смотрим что читаем и что записываем (особенно для портов которые и на чтение и на запись работают)...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 22:11 | Сообщение # 43 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| ты хотел сказать and Temp, 0b11110000
ну в обще то я сделал то же самое только иначе ( в самом начале программы)
ldi Temp,0b00001111 ; настроили порт "В" (0-ввод, 1-вывод) out DDRB,Temp ; 0000х000 - "вывод" на передатчик (PB3- 15 ножка) ; 00000ххх - "вывод" для того что бы при чтении клавиатуры получить "0" ?????????????????? ; хххх0000 - "ввод" для чтения строк клавиатуры
ведь все выводы настроенные на вывод должны читаться как лог_0 ????????? (вот тут когда то об этом прочитал http://radiokot.ru/start/mcu_fpga/avr/06/ )
Добавлено (07.10.2012, 22:11) --------------------------------------------- Quote если это не сделать то ты сам себе сделал нажатие: читаешь с порта B состояние кнопок и свой зажженный светодиод :-) - и поскольку он зажженный - то опять его зажигаешь :-)))
ну я все таки попробую сделать маску...............
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 22:13 |
|
| |
ВитГо | Дата: Воскресенье, 07.10.2012, 22:16 | Сообщение # 44 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Quote (uwrtey) ты хотел сказать and Temp, 0b11110000
ну в обще то я сделал то же самое только иначе ( в самом начале программы)
ldi Temp,0b00001111 ; настроили порт "В" (0-ввод, 1-вывод) out DDRB,Temp ; 0000х000 - "вывод" на передатчик (PB3- 15 ножка) ; 00000ххх - "вывод" для того что бы при чтении клавиатуры получить "0" ?????????????????? ; хххх0000 - "ввод" для чтения строк клавиатуры
вначале программы ты определил направление работы порта
но вся фишка в том что когда ты читаешь из порта то читаются все биты! и те что на чтение и те что на запись
но те что на запись нам для анализа не нужны
да, нужна маска
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.10.2012, 22:19 | Сообщение # 45 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Quote Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX, поскольку оно не будет выведено. И наоборот, если например, PX5 настроен на вывод, то прочитав 5-й бит PinD, мы всегда обнаружим 0. Порты - дело тонкое… это цитата с обучалки радиокота похоже что "мужик" меня дезинформировал....... **************** окей, завтра с утра переделаю с маской..........
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 22:21 |
|
| |
|