Четверг, 25.04.2024, 20:42
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | система дистанционного управления на ATtiny 2313 "c нуля" - Страница 3 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Разрабатываю ! » система дистанционного управления на ATtiny 2313 "c нуля" (пошаговое изучение строительства систем радиоуправления)
система дистанционного управления на ATtiny 2313 "c нуля"
uwrteyДата: Воскресенье, 07.10.2012, 16:09 | Сообщение # 31
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: 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
Репутация: 20
Статус: 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
Репутация: 20
Статус: 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
Репутация: 11
Статус: 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
Репутация: 20
Статус: Offline
согласен, давай так !

Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.10.2012, 21:06 | Сообщение # 36
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
сделал программу проверки нажатия клавиатуры
(если нажата кнопка то включается светодиод если кнопка не нажата то светодиод гаснет)
на практике выяснилось, что
при включении мк светодиод погашен, при нажатии на кнопку светодиод загорается!!
а если кнопку отпустить то светодиод почему то продолжает гореть...(не гаснет)
Прикрепления: proverka_najati.asm (4.7 Kb)


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 07.10.2012, 21:16 | Сообщение # 37
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну конечно будет гореть, ты же в порт не выводишь потом "0".. а то что записал там осталось

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

проверяй еще раз..


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.10.2012, 21:41 | Сообщение # 40
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
что проверять ?
ЗЫ
может данные в ОЗУ как то криво записываются?
или
может правда с фузами что то не так ?


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

Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 21:43
 
ВитГоДата: Воскресенье, 07.10.2012, 21:43 | Сообщение # 41
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: 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
Репутация: 20
Статус: Offline
Quote (uwrtey)
что проверять ?

Все проверяй..
ответ выше уже прочитал ?

Quote (uwrtey)
ЗЫ
может данные в ОЗУ как то криво записываются?
или
может правда с фузами что то не так ?

все может быть, но в основном все наши глюки от нас же самих :-)

поэтому: выписываем конфигурацию портов, смотрим что читаем и что записываем (особенно для портов которые и на чтение и на запись работают)...


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.10.2012, 22:11 | Сообщение # 43
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: 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 состояние кнопок и свой зажженный светодиод :-) - и поскольку он зажженный - то опять его зажигаешь :-)))

Quote
ведь все выводы настроенные на вывод должны читаться как лог_0 ????????? (вот тут когда то об этом прочитал http://radiokot.ru/start/mcu_fpga/avr/06/ )


ну я все таки попробую сделать маску...............


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

Сообщение отредактировал uwrtey - Воскресенье, 07.10.2012, 22:13
 
ВитГоДата: Воскресенье, 07.10.2012, 22:16 | Сообщение # 44
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Quote (uwrtey)
ты хотел сказать
and Temp, 0b11110000

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

ldi Temp,0b00001111 ; настроили порт "В" (0-ввод, 1-вывод)
out DDRB,Temp ; 0000х000 - "вывод" на передатчик (PB3- 15 ножка)
; 00000ххх - "вывод" для того что бы при чтении клавиатуры получить "0" ??????????????????
; хххх0000 - "ввод" для чтения строк клавиатуры


вначале программы ты определил направление работы порта

но вся фишка в том что когда ты читаешь из порта то читаются все биты! и те что на чтение и те что на запись

но те что на запись нам для анализа не нужны

да, нужна маска
Code
and Temp, 0b11110000


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.10.2012, 22:19 | Сообщение # 45
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Quote
Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX, поскольку оно не будет выведено.
И наоборот, если например, PX5 настроен на вывод, то прочитав 5-й бит PinD, мы всегда обнаружим 0.
Порты - дело тонкое…

это цитата с обучалки радиокота
похоже что "мужик" меня дезинформировал.......
****************
окей, завтра с утра переделаю с маской..........


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

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


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