- Вложения
-
- radiocmd.rar
- (43.51 КБ) 360 скачиваний
Простейшая передача данных на ATtiny13
- Сообщения: 34
- Зарегистрирован: Чт дек 13, 2012 21:42:49
Добрый вечер. Вот понадобилось мне реализовать простейшую одностороннюю передачу данных на этих тиньках (в будущем по радиоэфиру). Всё бы хорошо, да вот приёмная часть не работает. Метод передачи простейший, и не думаю что самый лучший. Код в архиве, критикуйте 
- Реклама
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Ха..... точно также 2-мя тиньками, моделировал в протеусе, как-то раньше.....
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=122
Глянь, мож какие мысли пригодятся.....

Если что, вот код передатчика
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=122
Глянь, мож какие мысли пригодятся.....
Если что, вот код передатчика
Спойлер
Код: Выделить всё
//#######################################################################################################################
// включаемые файлы
#define F_CPU 9600000
#include <util/delay.h>
#include <avr/io.h>
//дефайны
#define PORT_TRANSMIT PORTB
#define PIN_TRANSMIT (1<<0)
#define PORT_LED PORTB
#define LED_STBY (1<<2)
#define LED_CTRL (1<<4)
#define PORT_KEY PINB
#define PIN_KEY (1<<1)
//прототипы функций
void Transmit (void);
//глобальные переменные
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); //разбил по бпйтам для наглядности
for (unsigned char i=0; i<25; i++)
{
if (TransmitData & (1UL<<(24-i)))
{
//передача бита 1
PORT_TRANSMIT |= PIN_TRANSMIT;
_delay_us(450);
PORT_TRANSMIT &= ~PIN_TRANSMIT;
_delay_us(130);
}
else
{
//передача бита 0
PORT_TRANSMIT |= PIN_TRANSMIT;
_delay_us(160);
PORT_TRANSMIT &= ~PIN_TRANSMIT;
_delay_us(420);
}
}
}
- Вложения
-
- pg1.jpg
- (59.24 КБ) 2154 скачивания
- Сообщения: 34
- Зарегистрирован: Чт дек 13, 2012 21:42:49
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Потому что я декодировал сигнал не с помощю внешнего прерывания с линии сигнала, а с помощю анализа линии в прерывании от таймера\счетчика с частотой вызова в 10 раз больше чем частота сигнала (частота декодируемого сигнала ок 2 КHz, соотв-но анализируем линию с частотой 20 KHz).AndreaZzZ писал(а):Почему частота вызова была выбрана 20кГц?
Кстати благодаря этому, сигнал можно подавать на любую ножку контроллера, а не только на вход внешнего прерывания.....
На самом деле, когда я соображал такой вариант, я просто не знал как это можно сделать с помощю внеш прерываний, это теперь я уже знаю, что обычно в таких случаях задействуют внешние прерывания. Но мне от этого не хуже и не лучше, все работает, чего собственно и надо было достич.
- Реклама
- Сообщения: 34
- Зарегистрирован: Чт дек 13, 2012 21:42:49
У вас случаем не стоит CLKDIV8? А то я уже горю повторить конструкцию =)
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Частота приемника 9 600 000 Гц, т.е. делитель выключен.
Если включить делитель, боюсь на Си не будет успевать обрабатывать прерывание 20 КГц.....
А в передатчике без разницы, там просто в проекте надо указать действительную частоту 9 600 000 или 1 200 000
Кстати для вас могу упростить программу.
Т.к. я ориентировался на конкретные пульты, то под них и написал, а вообще, если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного.
Если включить делитель, боюсь на Си не будет успевать обрабатывать прерывание 20 КГц.....
А в передатчике без разницы, там просто в проекте надо указать действительную частоту 9 600 000 или 1 200 000
Кстати для вас могу упростить программу.
Т.к. я ориентировался на конкретные пульты, то под них и написал, а вообще, если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного.
Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.
Делал что-то подобное, прием на тиньке с частотой 48К работает на 4.8Мгц. формат передачи старт-стоп импульсы и 4 информационных бита обеспечивает терпимость к разности частот до 10% дополнительный алгоритм подстройки частоты по первому импульсу дает еще 10%. При этом держит 4 канала 8-битного программного ШИМ с частотой заполнения те же 48К.
Если мастер был бы стабилизирован кварцем, можно было бы еще реализовать долговременную подстройку коррекции частоты RC-генератора.
Делал что-то подобное, прием на тиньке с частотой 48К работает на 4.8Мгц. формат передачи старт-стоп импульсы и 4 информационных бита обеспечивает терпимость к разности частот до 10% дополнительный алгоритм подстройки частоты по первому импульсу дает еще 10%. При этом держит 4 канала 8-битного программного ШИМ с частотой заполнения те же 48К.
Если мастер был бы стабилизирован кварцем, можно было бы еще реализовать долговременную подстройку коррекции частоты RC-генератора.
- Сообщения: 34
- Зарегистрирован: Чт дек 13, 2012 21:42:49
Намного на сколько, а точнее как? Да, передатчик самодельный.shads писал(а):если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного
Посмотрите тех. документацию: http://www.atmel.com/Images/doc8126.pdfAlexeyslav писал(а):это в ATTINY45 встроенный генератор калиброван, а у 13-й нет
Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Если говорить о USART то да, там стабильность важна, малейшее расхождение - и последние биты в байте, съезжают на соседние тайм слоты.Alexeyslav писал(а):Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.
Но в радиопередаче никогда не применяют USART, там всегда используется кодирование с синхронизацией каждого бита. (Единственное, вроде есть радиомодули с передачей в эфир USART-а, но я с ними дела не имел). А так - возьмите например любой радиобрелок, там используется либо частотное либо фазовое кодирование (манчестер). Да взять те же ИК пульты - тоже применяется либо частотное либо фазовое кодирование.....
Итак, раз мы синхронизируем каждый бит, то совершенно четко можно определить в радиосигнале, где бит начался, а где он закончился. Если кодирование подобно такому как на картинке, то значение бита определяем по соотношению длительностей положительной полуволны и отрицательной. Остается только обозначить программе допустимые пределы длительности бита.
Например: бит передается в течение 1ms. Тогда можно на приемной стороне, разрешить обрабатывать биты с длительностью от 0,5 до 1,5 ms. Что соответствует разбросу частот +/- 50%. Все что выходит за эти рамки будет считаться ошибкой.
Т.е. даже если передатчик уводит сигнал на 10%, и еще приемник тоже добавляет свои 10%, то это в итоге - всего 20% ухода частоты..... а у нас допустимо до 50%..... Вот вам и решение проблемы нестабильности частоты. )))))
- Вложения
-
- sh1.jpg
- (7.3 КБ) 2163 скачивания
Это хорошо когда нет помех...
И надо еще успевать обрабатывать данные(измерять длительность, сравнивать с эталоном) в промежутках между приемом отдельных бит. Иногда на это нет времени.
И надо еще успевать обрабатывать данные(измерять длительность, сравнивать с эталоном) в промежутках между приемом отдельных бит. Иногда на это нет времени.
Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Ну.... если есть помехи, то с ними справляется только двусторонняя радиосистема.Alexeyslav писал(а):Это хорошо когда нет помех...
Я много раз сталкивался, когда фирменные радиосистемы не работают, пока не подойдеш в упор к приемнику (из за помех)..... Так что тут никуда не дется. Какой бы принцип кодирования не был, помехи мешают приемнику. Тут надо либо расстояние сокращать, либо мощность передатчика увеличивать, либо частоту менять на более чистую.
(У меня несколько раз были случаи, что на 433МГц не устойчиво работали радиосистемы, приходилось менять на комплекты, работающие на 800МГц)
А если вместо этого импульса помеха похожая проскочит? Или например перед импульсом проскочила помеха, и добавила длины первому импульсу.... Как в таких случаях действует программа?Alexeyslav писал(а):Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.
Очень мала вероятность такой помехи. Если она приплюсуется и изменит длительность на +-20% - импульс забракуется и дальнейшие данные будут приниматься на одной из крайних скоростей(если отклонение будет слишком большое - скорости не совпадут и данные будут искажены). При коротких вариациях длительности ничего плохого не будет. Синхронизация каждые 4 бита дает устойчивость к 10% изменения скорости(+-5%)
Этот алгоритм призван подстроить скорость приема так что мы попадаем как можно ближе к центру в тот самый интервал +-5% скорости. Можно не реагировать на одиночные отклонения скорости а вести статистику по последним 8 измерениям(учитывая успешность приема) и брать среднюю скорость.
Этот алгоритм призван подстроить скорость приема так что мы попадаем как можно ближе к центру в тот самый интервал +-5% скорости. Можно не реагировать на одиночные отклонения скорости а вести статистику по последним 8 измерениям(учитывая успешность приема) и брать среднюю скорость.


