Простейшая передача данных на ATtiny13

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 13, 2012 21:42:49

Сообщение AndreaZzZ »

Добрый вечер. Вот понадобилось мне реализовать простейшую одностороннюю передачу данных на этих тиньках (в будущем по радиоэфиру). Всё бы хорошо, да вот приёмная часть не работает. Метод передачи простейший, и не думаю что самый лучший. Код в архиве, критикуйте :)
Вложения
radiocmd.rar
(43.51 КБ) 360 скачиваний
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Ха..... точно также 2-мя тиньками, моделировал в протеусе, как-то раньше.....
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

Сообщение AndreaZzZ »

Почему частота вызова была выбрана 20кГц?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

AndreaZzZ писал(а):Почему частота вызова была выбрана 20кГц?
Потому что я декодировал сигнал не с помощю внешнего прерывания с линии сигнала, а с помощю анализа линии в прерывании от таймера\счетчика с частотой вызова в 10 раз больше чем частота сигнала (частота декодируемого сигнала ок 2 КHz, соотв-но анализируем линию с частотой 20 KHz).

Кстати благодаря этому, сигнал можно подавать на любую ножку контроллера, а не только на вход внешнего прерывания.....

На самом деле, когда я соображал такой вариант, я просто не знал как это можно сделать с помощю внеш прерываний, это теперь я уже знаю, что обычно в таких случаях задействуют внешние прерывания. Но мне от этого не хуже и не лучше, все работает, чего собственно и надо было достич.
Реклама
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 13, 2012 21:42:49

Сообщение AndreaZzZ »

У вас случаем не стоит CLKDIV8? А то я уже горю повторить конструкцию =)
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Частота приемника 9 600 000 Гц, т.е. делитель выключен.
Если включить делитель, боюсь на Си не будет успевать обрабатывать прерывание 20 КГц.....

А в передатчике без разницы, там просто в проекте надо указать действительную частоту 9 600 000 или 1 200 000

Кстати для вас могу упростить программу.
Т.к. я ориентировался на конкретные пульты, то под них и написал, а вообще, если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.

Делал что-то подобное, прием на тиньке с частотой 48К работает на 4.8Мгц. формат передачи старт-стоп импульсы и 4 информационных бита обеспечивает терпимость к разности частот до 10% дополнительный алгоритм подстройки частоты по первому импульсу дает еще 10%. При этом держит 4 канала 8-битного программного ШИМ с частотой заполнения те же 48К.

Если мастер был бы стабилизирован кварцем, можно было бы еще реализовать долговременную подстройку коррекции частоты RC-генератора.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 13, 2012 21:42:49

Сообщение AndreaZzZ »

shads писал(а):если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного
Намного на сколько, а точнее как? Да, передатчик самодельный.
Alexeyslav писал(а):это в ATTINY45 встроенный генератор калиброван, а у 13-й нет
Посмотрите тех. документацию: http://www.atmel.com/Images/doc8126.pdf
Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Alexeyslav писал(а):Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.
Если говорить о USART то да, там стабильность важна, малейшее расхождение - и последние биты в байте, съезжают на соседние тайм слоты.
Но в радиопередаче никогда не применяют USART, там всегда используется кодирование с синхронизацией каждого бита. (Единственное, вроде есть радиомодули с передачей в эфир USART-а, но я с ними дела не имел). А так - возьмите например любой радиобрелок, там используется либо частотное либо фазовое кодирование (манчестер). Да взять те же ИК пульты - тоже применяется либо частотное либо фазовое кодирование.....

Итак, раз мы синхронизируем каждый бит, то совершенно четко можно определить в радиосигнале, где бит начался, а где он закончился. Если кодирование подобно такому как на картинке, то значение бита определяем по соотношению длительностей положительной полуволны и отрицательной. Остается только обозначить программе допустимые пределы длительности бита.
Изображение

Например: бит передается в течение 1ms. Тогда можно на приемной стороне, разрешить обрабатывать биты с длительностью от 0,5 до 1,5 ms. Что соответствует разбросу частот +/- 50%. Все что выходит за эти рамки будет считаться ошибкой.
Т.е. даже если передатчик уводит сигнал на 10%, и еще приемник тоже добавляет свои 10%, то это в итоге - всего 20% ухода частоты..... а у нас допустимо до 50%..... Вот вам и решение проблемы нестабильности частоты. )))))
Вложения
sh1.jpg
(7.3 КБ) 2163 скачивания
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это хорошо когда нет помех...
И надо еще успевать обрабатывать данные(измерять длительность, сравнивать с эталоном) в промежутках между приемом отдельных бит. Иногда на это нет времени.
Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?
Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Alexeyslav писал(а):Это хорошо когда нет помех...
Ну.... если есть помехи, то с ними справляется только двусторонняя радиосистема.
Я много раз сталкивался, когда фирменные радиосистемы не работают, пока не подойдеш в упор к приемнику (из за помех)..... Так что тут никуда не дется. Какой бы принцип кодирования не был, помехи мешают приемнику. Тут надо либо расстояние сокращать, либо мощность передатчика увеличивать, либо частоту менять на более чистую.
(У меня несколько раз были случаи, что на 433МГц не устойчиво работали радиосистемы, приходилось менять на комплекты, работающие на 800МГц)
Alexeyslav писал(а):Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.
А если вместо этого импульса помеха похожая проскочит? Или например перед импульсом проскочила помеха, и добавила длины первому импульсу.... Как в таких случаях действует программа?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Очень мала вероятность такой помехи. Если она приплюсуется и изменит длительность на +-20% - импульс забракуется и дальнейшие данные будут приниматься на одной из крайних скоростей(если отклонение будет слишком большое - скорости не совпадут и данные будут искажены). При коротких вариациях длительности ничего плохого не будет. Синхронизация каждые 4 бита дает устойчивость к 10% изменения скорости(+-5%)
Этот алгоритм призван подстроить скорость приема так что мы попадаем как можно ближе к центру в тот самый интервал +-5% скорости. Можно не реагировать на одиночные отклонения скорости а вести статистику по последним 8 измерениям(учитывая успешность приема) и брать среднюю скорость.
Контактная информация:
Ответить

Вернуться в «Периферия»