Добрый вечер. Вот понадобилось мне реализовать простейшую одностороннюю передачу данных на этих тиньках (в будущем по радиоэфиру). Всё бы хорошо, да вот приёмная часть не работает. Метод передачи простейший, и не думаю что самый лучший. Код в архиве, критикуйте
//глобальные переменные unsigned long TransmitData;
//####################################################################################################################### //Главная функция int main (void) { //инициализация портов DDRB = (LED_CTRL)|(LED_STBY)|(PIN_TRANSMIT);//линии на вывод PORTB = PIN_KEY; //подтяжка
// главный цикл while(1) { if (!(PORT_KEY & PIN_KEY)) { PORT_LED |= LED_STBY; Transmit (); _delay_ms(500); PORT_LED &= ~LED_STBY; } } }
//передача серии 25 бит void Transmit (void) { TransmitData=(0b11111111UL<<17)|(0b00000000UL<<9)|(0b01010101UL<<1); //разбил по бпйтам для наглядности
Потому что я декодировал сигнал не с помощю внешнего прерывания с линии сигнала, а с помощю анализа линии в прерывании от таймера\счетчика с частотой вызова в 10 раз больше чем частота сигнала (частота декодируемого сигнала ок 2 КHz, соотв-но анализируем линию с частотой 20 KHz).
Кстати благодаря этому, сигнал можно подавать на любую ножку контроллера, а не только на вход внешнего прерывания.....
На самом деле, когда я соображал такой вариант, я просто не знал как это можно сделать с помощю внеш прерываний, это теперь я уже знаю, что обычно в таких случаях задействуют внешние прерывания. Но мне от этого не хуже и не лучше, все работает, чего собственно и надо было достич.
Частота приемника 9 600 000 Гц, т.е. делитель выключен. Если включить делитель, боюсь на Си не будет успевать обрабатывать прерывание 20 КГц.....
А в передатчике без разницы, там просто в проекте надо указать действительную частоту 9 600 000 или 1 200 000
Кстати для вас могу упростить программу. Т.к. я ориентировался на конкретные пульты, то под них и написал, а вообще, если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного.
Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.
Делал что-то подобное, прием на тиньке с частотой 48К работает на 4.8Мгц. формат передачи старт-стоп импульсы и 4 информационных бита обеспечивает терпимость к разности частот до 10% дополнительный алгоритм подстройки частоты по первому импульсу дает еще 10%. При этом держит 4 канала 8-битного программного ШИМ с частотой заполнения те же 48К.
Если мастер был бы стабилизирован кварцем, можно было бы еще реализовать долговременную подстройку коррекции частоты RC-генератора.
Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.
Если говорить о USART то да, там стабильность важна, малейшее расхождение - и последние биты в байте, съезжают на соседние тайм слоты. Но в радиопередаче никогда не применяют USART, там всегда используется кодирование с синхронизацией каждого бита. (Единственное, вроде есть радиомодули с передачей в эфир USART-а, но я с ними дела не имел). А так - возьмите например любой радиобрелок, там используется либо частотное либо фазовое кодирование (манчестер). Да взять те же ИК пульты - тоже применяется либо частотное либо фазовое кодирование.....
Итак, раз мы синхронизируем каждый бит, то совершенно четко можно определить в радиосигнале, где бит начался, а где он закончился. Если кодирование подобно такому как на картинке, то значение бита определяем по соотношению длительностей положительной полуволны и отрицательной. Остается только обозначить программе допустимые пределы длительности бита.
Например: бит передается в течение 1ms. Тогда можно на приемной стороне, разрешить обрабатывать биты с длительностью от 0,5 до 1,5 ms. Что соответствует разбросу частот +/- 50%. Все что выходит за эти рамки будет считаться ошибкой. Т.е. даже если передатчик уводит сигнал на 10%, и еще приемник тоже добавляет свои 10%, то это в итоге - всего 20% ухода частоты..... а у нас допустимо до 50%..... Вот вам и решение проблемы нестабильности частоты. )))))
Это хорошо когда нет помех... И надо еще успевать обрабатывать данные(измерять длительность, сравнивать с эталоном) в промежутках между приемом отдельных бит. Иногда на это нет времени.
Цитата:
Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?
Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.
Ну.... если есть помехи, то с ними справляется только двусторонняя радиосистема. Я много раз сталкивался, когда фирменные радиосистемы не работают, пока не подойдеш в упор к приемнику (из за помех)..... Так что тут никуда не дется. Какой бы принцип кодирования не был, помехи мешают приемнику. Тут надо либо расстояние сокращать, либо мощность передатчика увеличивать, либо частоту менять на более чистую. (У меня несколько раз были случаи, что на 433МГц не устойчиво работали радиосистемы, приходилось менять на комплекты, работающие на 800МГц)
Alexeyslav писал(а):
Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.
А если вместо этого импульса помеха похожая проскочит? Или например перед импульсом проскочила помеха, и добавила длины первому импульсу.... Как в таких случаях действует программа?
Очень мала вероятность такой помехи. Если она приплюсуется и изменит длительность на +-20% - импульс забракуется и дальнейшие данные будут приниматься на одной из крайних скоростей(если отклонение будет слишком большое - скорости не совпадут и данные будут искажены). При коротких вариациях длительности ничего плохого не будет. Синхронизация каждые 4 бита дает устойчивость к 10% изменения скорости(+-5%) Этот алгоритм призван подстроить скорость приема так что мы попадаем как можно ближе к центру в тот самый интервал +-5% скорости. Можно не реагировать на одиночные отклонения скорости а вести статистику по последним 8 измерениям(учитывая успешность приема) и брать среднюю скорость.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения