Страница 1 из 1

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

Добавлено: Ср мар 13, 2013 21:28:15
AndreaZzZ
Добрый вечер. Вот понадобилось мне реализовать простейшую одностороннюю передачу данных на этих тиньках (в будущем по радиоэфиру). Всё бы хорошо, да вот приёмная часть не работает. Метод передачи простейший, и не думаю что самый лучший. Код в архиве, критикуйте :)

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

Добавлено: Чт мар 14, 2013 00:02:45
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);
        }
    }
}
 

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

Добавлено: Чт мар 14, 2013 19:46:24
AndreaZzZ
Почему частота вызова была выбрана 20кГц?

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

Добавлено: Чт мар 14, 2013 21:32:55
oleg110592

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

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

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

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

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

Добавлено: Пт мар 15, 2013 10:48:56
AndreaZzZ
У вас случаем не стоит CLKDIV8? А то я уже горю повторить конструкцию =)

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

Добавлено: Пт мар 15, 2013 13:07:19
shads
Частота приемника 9 600 000 Гц, т.е. делитель выключен.
Если включить делитель, боюсь на Си не будет успевать обрабатывать прерывание 20 КГц.....

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

Кстати для вас могу упростить программу.
Т.к. я ориентировался на конкретные пульты, то под них и написал, а вообще, если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного.

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

Добавлено: Пт мар 15, 2013 14:47:08
Alexeyslav
Как решена проблема нестабильности частоты? Ведь встроенные RC-генераторы могут давать +-10% при стабильном питании... это в ATTINY45 встроенный генератор калиброван, а у 13-й нет.

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

Если мастер был бы стабилизирован кварцем, можно было бы еще реализовать долговременную подстройку коррекции частоты RC-генератора.

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

Добавлено: Пт мар 15, 2013 15:44:02
AndreaZzZ
shads писал(а):если подразумевается передатчик на тиньке (т.е. со своим форматом команд), то можно упростить намного
Намного на сколько, а точнее как? Да, передатчик самодельный.
Alexeyslav писал(а):это в ATTINY45 встроенный генератор калиброван, а у 13-й нет
Посмотрите тех. документацию: http://www.atmel.com/Images/doc8126.pdf
Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?

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

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

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

Например: бит передается в течение 1ms. Тогда можно на приемной стороне, разрешить обрабатывать биты с длительностью от 0,5 до 1,5 ms. Что соответствует разбросу частот +/- 50%. Все что выходит за эти рамки будет считаться ошибкой.
Т.е. даже если передатчик уводит сигнал на 10%, и еще приемник тоже добавляет свои 10%, то это в итоге - всего 20% ухода частоты..... а у нас допустимо до 50%..... Вот вам и решение проблемы нестабильности частоты. )))))

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

Добавлено: Сб мар 16, 2013 00:04:51
Alexeyslav
Это хорошо когда нет помех...
И надо еще успевать обрабатывать данные(измерять длительность, сравнивать с эталоном) в промежутках между приемом отдельных бит. Иногда на это нет времени.
Алгоритм подстройки частоты по первому импульсу? Можно поподробнее?
Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.

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

Добавлено: Сб мар 16, 2013 07:57:10
shads
Alexeyslav писал(а):Это хорошо когда нет помех...
Ну.... если есть помехи, то с ними справляется только двусторонняя радиосистема.
Я много раз сталкивался, когда фирменные радиосистемы не работают, пока не подойдеш в упор к приемнику (из за помех)..... Так что тут никуда не дется. Какой бы принцип кодирования не был, помехи мешают приемнику. Тут надо либо расстояние сокращать, либо мощность передатчика увеличивать, либо частоту менять на более чистую.
(У меня несколько раз были случаи, что на 433МГц не устойчиво работали радиосистемы, приходилось менять на комплекты, работающие на 800МГц)
Alexeyslav писал(а):Перед передачей пакета данных передается импульс с известной длительностью, приемник измеряет её и в зависимости от результатов табличным методом корректирует частоту с которой принимаются данные. Одновременно этот импульс является сигналом к началу приема данных.
А если вместо этого импульса помеха похожая проскочит? Или например перед импульсом проскочила помеха, и добавила длины первому импульсу.... Как в таких случаях действует программа?

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

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