Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Moonlight00
1 / 1 / 0
Регистрация: 25.02.2014
Сообщений: 13
1

Обеспечить помехоустойчивость при приеме-передаче данных

05.11.2014, 20:34. Просмотров 548. Ответов 8
Метки нет (Все метки)

Делаю приемник сигнала. Сообщение (8 разрядов) подаваемое последовательно на вход (один из пинов) микроконтроллера ATTiny2313, должно записываться в переменную, и дальше передаваться по USB на компьютер.
Написал часть кода для чтения сообщения:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#define F_CPU 12000000UL // 12MHz
#include <avr/io.h>
#include <avr/interrupt.h>
 
#pragma vector = TIMER1_COMPA_vect
 
 
char flag;
char Read;
 
/////  ОБРАБОТЧИК ПРЕРЫВАНИЯ ТАЙМЕРА  ////////////////////////////////////
ISR(TIMER1_COMPA_vect)
{
    flag = 1;
}
//////////////////////////////////////////////////////////////////////////
 
 
int main(void)
{
    //DDRB=0xff;
 
/////  ТАЙМЕР  ///////////////////////////////////////////////////////////
    TCCR1A=0x00;                                    // Настройка
    TCCR1B = (0<<CS12) |(1<<CS11) |(1<<CS10)        // Предделитель 64
    | (0<<WGM13) | (1<<WGM12);                      // CTC Режим
    OCR1A=0xbb;                                     // Порог счета
    TCNT1=0x00;                                     // Обнуление таймера
    TIMSK=(1<<OCIE1A);                              // Разрешение прерываний по совпадению A
    asm("sei");                                     // Разрешение глобальных прерываний
    TIMSK|=(1<<4);                                  // Старт таймера
//////////////////////////////////////////////////////////////////////////
    
    
    while(1)
    {
/////  ЧТЕНИЕ ВХОДНОГО СИГНАЛА  //////////////////////////////////////////
        asm("cli");                                 // Запрет прерываний
        if (flag == 1)
        {
            if (PIND &= 1<<6)                       // Проверка уровня на входе
            {
                Read = (Read<<1) | 0;
            }
            else
            {
                Read = (Read<<1) | 1;
            }
                        
            flag=0;
        }
        asm("sei");                                 // Разрешение прерываний
//////////////////////////////////////////////////////////////////////////
    }
}
Как отличить полезный сигнал от случайных помех?
Есть ли вообще смысл в таком подходе или нужно использовать UART на источнике и приемнике?
Для передачи на компьютер думаю использовать V-USB.

Программу хоста еще не знаю как реализовать. С использованием libusb наверно. Пока больше не знаю.
Разбираюсь в этом плохо, поэтому вопросы глупые...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2014, 20:34
Ответы с готовыми решениями:

UART проблема при приеме данных. ATmega128A
Добрый день. В программировании микроконтроллеров навичек. Столкнулся со...

Виснет USART при приеме
Добрый вечер всем. Подскажите как решить проблему с USORT. Проверяю через...

какая то черная магия при приеме по UART
Вообщем принимаю я две строки по UART, в блок switch все нормально приходит,...

Коды символов при передаче
Подскажите пожалуйста, при вводе в Hyper Terminal числа , например 12( в...

При передаче по UART не переключается порт.
Добрый день. Что имеем : ATMiko16a, тактирование -- внешний кварц на 16 МГц....

8
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
05.11.2014, 21:07 2
...расширить пакет из восьми бит с учетом контроля четности, контрольной суммы и т.п.

Среди прочего, если вы используете дерганье ножек (нет UART, SPI и т.д.), то в качестве канала связи стоит использовать дифференциальный интерфейс связи, например LVDS. В качестве коих прекрасно подходят SN65LVDS31 (передатчики) и SN65LVDS32 (приемники) или более современные. Также можно использовать токовую петлю а-ля ИРПС.

Для передачи на компьютер думаю использовать V-USB
а что мешает использовать тоже UART и простейнький драйвер - конвертр интерфейсов UART TTL/USB? FTDI/CP21XX/PL2303 и т.п.
0
Moonlight00
1 / 1 / 0
Регистрация: 25.02.2014
Сообщений: 13
05.11.2014, 21:26  [ТС] 3
raxp, Мне это нужно для ИК пульта управления, чтобы перелистывать слайды, регулировать громкость и тд. Здесь, наверно, можно ограничиться проверкой контрольной суммы? Длинных проводов в устройстве нет. И все помехи будут возникать только при воздействии на луч?
0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
05.11.2014, 21:29 4
ИК пульт сами разрабатываете или чужой? Если чужой, смотреть его протокол. Если свой, воспользоваться наработками в виде RC5 кодирования например, а не изобретать велосипед.
0
Витальич
05.11.2014, 21:38
  #5

Не по теме:

Цитата Сообщение от raxp Посмотреть сообщение
RC5
О, я, я Манчестер гуд. :)

0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
05.11.2014, 21:47 6
TC, вот вам для затравки http://fi-com.ru/mcu/rc5.htm. Правда вы не ответили еще насчет своего-чужого.
1
Moonlight00
1 / 1 / 0
Регистрация: 25.02.2014
Сообщений: 13
05.11.2014, 21:51  [ТС] 7
raxp, Пульт свой.
0
AlexVRud
483 / 194 / 73
Регистрация: 04.07.2014
Сообщений: 547
08.11.2014, 14:13 8
Moonlight00, В любом случае в указанном направлении.
Вот хорошее описание http://www.sbprojects.com/knowledge/ir/index.php
В качестве приёмника TSOP1236, или аналогичный.
За счёт модуляции никаких ложных срабатываний.
Поиск RC5+Arduino даст кучу примеров реализации. А там под себя переделаешь.
0
Moonlight00
1 / 1 / 0
Регистрация: 25.02.2014
Сообщений: 13
14.11.2014, 00:31  [ТС] 9
Пробую сделать с использованием RC5.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <avr/io.h>
#include <avr/interrupt.h>
 
 
int counter;
 
char lastbit;
 
int read;
 
int timeget;
int timecontrol;
 
 
ISR(SIG_INTERRUPT1)
{
    asm("nop");
    if (counter == 0)
    {
        TCNT1 = 0;
        TIMSK|= (1<<4);
        counter++;
        return;
    }
    else if (counter == 1)
    {
        counter++;
        return;
    }
    else if(counter == 2)
    {
        timeget = TCNT1;
        TCNT1 = 0;
        counter++;
        return;
    }
    else if(counter < 28)
    {
        timeget = TCNT1;
        TCNT1 = 0;
        counter++;
        return;
    }
    else if (counter == 28)
    {
        counter = 0;
    }
}
 
 
int main(void)
{
    TCCR1A=0x00;
    TCCR1B = (0<<CS12) |(0<<CS11) |(1<<CS10)        // Предделитель 64
    | (0<<WGM13) | (0<<WGM12);                      // Normal Режим
    TCNT1=0x00; 
 
    GIMSK |= (1<<INT1);                 //прерывания по входу
    MCUCR = (0<<ISC11) | (1<<ISC10);
    
    while(1)
    {
        asm("sei");
 
        if (counter == 1)
        {
            read = 0b11;
        }
        else if (counter == 3)          
        {
            timecontrol = (timeget*3)/4;    //Определение контрольного времени
            lastbit = 1;
            counter++;
        }
        else if (counter < 28 && counter >3)
        {
            if (timeget >= timecontrol)     //Полный бит
            {
                lastbit = (!lastbit)&1;     //Значение противоположно предыдущему
                read|= read | (lastbit<<0); //Запись
            }
            else                            //Полубит
            {                               //Значение соответствует предыдущему
                read|= read | (lastbit<<0); //Запись
                counter++;
            }       
        }
    }       
}


Программа не работает. Пропускает условия в основном цикле, и не правильно записывает комбинацию входа.
0
14.11.2014, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2014, 00:31

Теряются байты при передаче по RS485
В общем, в чем идея. Комп шлет контроллеру пакет из 5ти байт, контроллер...

atmega48pa + adm483 портятся данные при передаче
Всем привет. Собираю одно устройство и возникла проблема. Суть в том, что...

SPI в AVR. Потеря первого байта при передаче строки
Доброго времени суток господа. При попытке передать 16 символьную строку, от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru