для начала нужно все таки определиться что мы будем передавать (лог_1 или лог_0 )в то время, когда не нажата ни одна кнопка и после этого поправить код передатчика а уж потом определятся с алгоритмом декодирования ,,, я все же склоняюсь к тому, что во время отсутствия команд передавать лог_0 - это очень экономично ,,, теперь нужно определится как отличать команду от помехи...
_________________ не зная броду не лезь к вольтмоду
сегодня буду тестировать прошивку передатчика вот схему переделал добавил разъем для внутрисхемной прошивки. И еще поставил выключатель, который будет замкнут на момент прошивки
мда, не шьется мк по такой схеме! видимо сопротивление резисторов клавиатуры слишком мало ( 1 кило Ом). отпаял резисторы на момент прошивки, фьюзы не трогал - стоят заводские ........прошил на выходе постоянно импульсы длительностью 5 милисек пойду еще разок в код гляну...... вот кое что уже поправил
теперь при нажатии одной из кнопок, появляются импульсы длительностью примерно 13 мили секунд и паузы длительностью 5 мили секунд все исправления отмечены знаками вопроса Спойлер
ldi Temp,low(RamEnd) ; инициализации стека out SPL,Temp ;
ldi Temp,0b00001111 ; настроили порт "В" (0-ввод, 1-вывод) out DDRB,Temp ; 0000х000 - "вывод" на передатчик (PB3- 15 ножка) ; хххх0000 - "ввод" для чтения строк клавиатуры ; 00000ххх - "вывод" для того что бы при чтении клавиатуры получить "0" ??????????????????
ldi Temp,0b00001111 ; настраиваем порт "D" (0-ввод, 1-вывод) out DDRD,Temp ; 0000хххх - на вывод столбцов клавы
ldi Temp,0b00000000 ; выводим на передатчик лог_0 ???????????????????????????????????????????????? out portB,Temp
ldi Temp,0b00000000 ; установили тактовый сигнал = CK 0 out TCCR1B,Temp ; таймер выключен!!!
sei ; глобальное разрешение прерываний
;******************************************************************************* ; главный цикл ;*******************************************************************************
;******************************************************************************* ; цикл Чтения клавы и запись данных в ОЗУ ;*******************************************************************************
keyboardread: ; метка - опрос клавиатуры
ldi Temp,5 ; количество столбцов клавы = пять
ldi Temp1,0b00000001 ; первый столбец
; загружаем адрес метки массива (key_buff) находящейся в ОЗУ в регистровую пару X
ldi XL, low(key_buff) ; младший байт адреса ldi XH, high(key_buff) ; старший байт адреса
keyboardread_loop: ; цикл опроса
out PortD,Temp1 ; выводим в порт "Д" значение "Temp1" для выбора столбца клавиатуры in Temp2,PinB ; прочитали состояние столбца
st X+,Temp2 ; сохраним в ОЗУ состояние столбца клавы, ; адрес в регстровой паре "X" автоматом увеличится на 1
lsl Temp1 ; сдвинули единичку выбора столбца клавиатуры на 1 ; позицию влево
dec temp ; уменьшим счетчик brne keyboardread_loop ; если не все просканировали, то циклимся
ret ; возврат в главный цикл
;****************************************************************************************** ; цикл проверки нажатия клавиатуры ;******************************************************************************************
certain_buttons_keyboard:
ldi temp1,5 ; УСТАНОВИМ СЧЕТЧИК столбцов клавы
; загружаем адрес метки (key_buff) находящейся в ОЗУ в регистровую пару "Z" ldi ZL,low (key_buff) ; младший байт адреса ldi ZH,high(key_buff) ; старший байт адреса
Certain_button:
ld Temp,Z+ ; загрузим данные в регистр из ОЗУ по адресу из регистровой пары "Z", ; и после этого адресс в регистровой паре автоматически увеличится на еденицу
cpi Temp,0b00000000 ; проверяем, нажата ли какая ни будь кнопка? brne inform ; если нажата то переходим на метку "inform"
dec temp1 ; уменьшим счетчик brne Certain_button ; если не все столбцы, то циклимся
metka:
ret ; возврат в главный цикл
;*********************************************************************************************** ; вывод информации о состоянии клавиатуры в порт "Б" ;***********************************************************************************************
inform: ; здесь мы включаем таймер
ldi Temp,(1<<COM1A0) ; переключать ножку "OC1A" по совпадению (PB3- 15 ножка) out TCCR1A,Temp ; *1
LDI R19, 2 ; зададим фиксированную длительность импульса ( 0x200 видимо ) OUT OCR1AH, R19 ; и выведем ее в порт сравнения LDI R19, 0 OUT OCR1AL ,R19
ldi Temp,0 ; обнуление таймера out TCNT1H,Temp out TCNT1L,Temp
ldi Temp,(1<<wgm12)|(1<<cs10) ; подключили режим "CTC" (вместе с *1) out TCCR1B,Temp ; и установили тактовый сигнал = CK 1:1 ; таймер начал считать!!!
ldi Temp,(1<<OCIE1A) ; разрешить прерывание компаратора out TIMSK,Temp
ldi R22, 0 ; фаза передачи
loop_wait_transmitt: ; цикл ожидания завершения передачи
cpi R22 , 7 brne loop_wait_transmitt
ldi temp1,0 ; обнулим "temp1", что бы точно выйти из цикла проверки нажатия клавиатуры ???????????????????
ldi R21,0 ; это будет счетчик единичек в передаче (четность)
ldi yl,low(key_buff) ; зададим адрес начала массива прочитанных кнопок в ргистровую пару "Y" ldi yh,high(key_buff)
ldi R17,5 ; количество байт для передачи
transmitt_byte: ; фаза начала передачи - передача байта
ld temp,y+ ; прочитаем байт для передачи, увеличим на единицу адрес в "Y"
ldi r18,8 ; количество бит в байте для передачи
pop temp ; извлекаем "SREG" ??????????????????????????????????????????????????????????? out SREG, temp
transmitt_bite_imp: ; фаза передачи импульса в передаваемом бите
in temp,SREG ; сохраняем "SREG" ??????????????????????????????????????????????????????????? push temp
LDI R19 ,high(ImpLen) ; зададим фиксированную длительность импульса OUT OCR1AH, R19 ; и выведем ее в порт сравнения LDI R19,low(ImpLen) OUT OCR1AL ,R19
LDI R22, 3 ; в следующий раз передаем паузу
int_reti:
pop temp ; извлекаем "SREG" //////////////////////////////////////////////////////////// out SREG, temp
сейчас попробую разобраться почему паузы короче чем импульсы...... (я, правда, толком не умею пользоваться осциллографом.....может смотрю что не так, как надо)
_________________ не зная броду не лезь к вольтмоду
Немного не в тему. Вот сейчас запустил цифровой канал передачи. 2 пропорциональных команды и 16 дискретных. Пульт управления ATMega16 + MRF49, приемник ATMega88 + MRF49. Есть исходники на С. Дешифрация - побайтный разбор пакета. TC вроде бы не указал какими RF модулями он пользуется. Мне кажется с цифровой передачей канал надежнее будет. Завтра испытания "в поле".
Исходник передачи здесь rfpult на mega16; приема на mega88 boat88 пока не могу организовать обратную передачу внимание : это все черновики! Если необходимо, схему нарисую позже. В поле связь не терялась на 150м при скорости 9600. Управлть объектом в 0,5м длиной с такого расстояния проблематично. собственно схемы можно посмотреть на http://vg.ucoz.ru/forum/8-57-1
Помогите написать прошивку под atmega8,для создания 8-канального PPM кодера. В сети есть готовые PPM кодеры но сделанные на PIC контроллерах, а я учусь пока только на AVR ,и хочу понять как создавать PPM сигнал.
...может повторюсь ..поищите книгу "10 практических устройств на AVR-микроконтроллерах" КНИГА 3 А.В.Кравченко 2011, помоему там хорошо расписано пропорцианальное радиоуправление(234стр).
...ну там родной avr-asm, а его желательно маломальски для начала изучить - лучше будете понимать работу мк. Ну даже не это главное, там расписан алгоритм по простому и на чём вы его реализуете это уже другое дело...
...ой, нет ..задач своих выше крыши ...а в данном случае лучше купить, благо рынок под завязку на любой вкус. Собственная разработка в этом ракурсе интересна разве что на побаловаться, какие идеи реализовать, что ни у кого нету - типа передовать/принимать телеметрию какую хитрую к примеру или ещё чего этакого... а так, лучше в магазин, а потом глядишь и дороботать готовое под свои хотелки
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения