6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
1

Передатчик-приемник

25.01.2021, 11:58. Показов 1312. Ответов 35
Метки нет (Все метки)

Не получается связать передатчик и приемник. Смущает то что на передатчики отсутствует катушка в 3 витка(подскажите зачем она нужна) (Фото 1 - мой передатчик, фото 2 - фото из интернета). Приемник пробовал разные(фото 3, 4). Приемник ведет себя странно. Светодиод загорается произвольно, даже если передатчик выключен, но не реагирует на передатчик.
Код передатчика (пока держу кнопку, передается байт 0b10110010):

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
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
 
#define RF_PORT PORTB
#define RF_PIN  PINB    
#define RF_DDR  DDRB
 
#define OUT_PIN 1
#define IN_PIN  0       
#define SET(r, b) (r |= (1 << b))
#define CLR(r, b) (r &= ~(1 << b))
#define OUT_LOW  (CLR(RF_PORT, OUT_PIN))
#define OUT_HIGH (SET(RF_PORT, OUT_PIN))
 
#define DELAY 200           // 
 
void RF_init()
{
    RF_DDR = (1 << OUT_PIN) | (0 << IN_PIN);
    RF_PORT = (1 << OUT_PIN) | (1 << IN_PIN);
}
 
void RF_write(unsigned char data){
 
    unsigned char i;
    for(i = 0; i < 8; i++)
    {
 
        if(((data >> 7) & 1)) 
            OUT_HIGH;
        else
            OUT_LOW;
        _delay_us(DELAY);       
        data <<= 1;
    }
}
 
int main(void)
{
    RF_init();
    while (1) 
    {
        if(!(PINB & (1 << IN_PIN)))
            RF_write (0b10110010);
    }
}
Код приемника (если принят байт 0b10110010, то зажигается светодиод):
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
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
 
 
#define DELAY 200   
 
#define RF_PORT PORT
#define RF_PIN  PINC
#define RF_DDR  DDRC
 
#define IN_PIN  0   
#define OUT_PIN 1   
 
#define SET(r, b) (r |= (1 << b))  
#define CLR(r, b) (r &= ~(1 << b)) 
 
#define OUT_LOW  (CLR(RF_PORT, OUT_PIN))
#define OUT_HIGH (SET(RF_PORT, OUT_PIN))
 
unsigned char RF_read(void)
{
 
    unsigned char  res = 0;
    unsigned char i;
    
    for(i = 0; i < 8; i++)
    {
        res <<= 1;
        if((RF_PIN >> IN_PIN) & 1)
            res |= 1;       
        _delay_us(DELAY);
    }
 
    
    return res;
}
 
void RF_init()
{
    RF_DDR = (1 << OUT_PIN) | (0 << IN_PIN);
    RF_PORT = (0 << OUT_PIN) | (1 << IN_PIN);
}
 
 
 
int main(void)
{
    RF_init();
    PORTD = DDRD = (1 << 0);
    while (1) 
    {
        int h = 0;
        h = RF_read ();
        if(h == 0b10110010)
            SET(RF_PORT, OUT_PIN);
    }
}
Можно ли передавать данные, без антенны на расстояние 4 -10 см до приемника?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Передатчик-приемник   Передатчик-приемник   Передатчик-приемник  

Передатчик-приемник  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2021, 11:58
Ответы с готовыми решениями:

ИК приемник-передатчик. Проблем
Доброго времени суток! Стоит такая задача сделать ИК бампер для определения препятствия, для...

Atmega8 и 433Mhz передатчик и приемник
Вобщем такая беда. Есть 2 атмеги8, одна приемник ,другая передатчик,работают на частоте 12.8Mhz от...

Передатчик RC5 в Proteus
Всем привет. Нужно к микроконтроллеру AT90S2313 (К контакту PD0) подключить передатчик RC5. Но как...

Atmega и приемник
Есть Atmega и приемник с четырьмя ногами на которые в случае прихода годного сигнала выдается &quot;1&quot;...

35
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
25.01.2021, 12:12 2
Цитата Сообщение от Sierra26 Посмотреть сообщение
Приемник ведет себя странно. Светодиод загорается произвольно, даже если передатчик выключен, но не реагирует на передатчик.
Это объяснимо - передатчик ловит мусор из эфира, и интерпретирует сигналы как что-то полезное.

PS: Вам стоит обернуть передачу пакетов чем-то более надежным, чем просто бит-бандингом. Например, UART, а еще и с битами четности заметно защитит ваши данные от потерь (ну, хотя бы отсеет 99% мусора). а так - кодирование данных с кодом хемминга (есть и другие варианты) существенно стабилизирует передачу данных вообще.

Добавлено через 1 минуту
Цитата Сообщение от Sierra26 Посмотреть сообщение
Можно ли передавать данные, без антенны на расстояние 4 -10 см до приемника?
думаю, вполне может
1
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
25.01.2021, 13:41  [ТС] 3
Voland_, Скажите, а как мне поможет бит четности. То Есть в вместо 0b10110010, я просто передам 0b101100100. То есть просто увеличиться размер переданной информации.
0
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
25.01.2021, 13:56 4
Цитата Сообщение от Sierra26 Посмотреть сообщение
как мне поможет бит четности
интерфейс сам отбросит ошибочный байт (пакет, в общем случае). Но это действительно - помогает быстро и дешево идентифицировать ошибку. Для большинства протоколов это сильно тормозит обмен данными.
0
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
25.01.2021, 14:00  [ТС] 5
Voland_, какой интерфейс?
0
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
25.01.2021, 14:05 6
Цитата Сообщение от Sierra26 Посмотреть сообщение
какой интерфейс?
UART
0
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
25.01.2021, 14:52  [ТС] 7
Voland_ а разве у меня реализован, не UART интерфейс?
0
3349 / 1927 / 368
Регистрация: 09.09.2017
Сообщений: 7,799
25.01.2021, 15:02 8
Sierra26, я что-то не увидел в вашей реализации контроля четности или более серьезных проверок.
Да и UART'а, кстати, тоже не увидел. Где стартовый и стоповый биты? Как ваш приемник вообще узнает что пора начать принимать байт?
1
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
25.01.2021, 15:22 9
Цитата Сообщение от Sierra26 Посмотреть сообщение
не UART интерфейс?
нет.

И биты вы шлете примерно на скорости ~400-800кбит (точнее лень считать). Это, думаю, слишком быстро для приема данных для этой радио-свистульки.
1
973 / 598 / 99
Регистрация: 15.05.2012
Сообщений: 3,526
25.01.2021, 15:28 10
Цитата Сообщение от Sierra26 Посмотреть сообщение
UART интерфейс
Железный уарт сам все проверит, отсеет и сообщит об ошибке.
0
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
25.01.2021, 15:55  [ТС] 11
COKPOWEHEU, исправил:
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
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
 
 
#define DELAY 500   
 
#define RF_PORT PORTC
#define RF_PIN  PINC
#define RF_DDR  DDRC
 
#define IN_PIN  0   
#define OUT_PIN 1   
 
#define SET(r, b) (r |= (1 << b))  
#define CLR(r, b) (r &= ~(1 << b)) 
 
unsigned char RF_read(void)
{
 
    unsigned char  res = 0;
    unsigned char i;
    
    for(i = 0; i < 8; i++)
    {
        res <<= 1;
        if((RF_PIN >> IN_PIN) & 1)
            res |= 1;       
        _delay_us(DELAY);
    }
 
    
    return res;
}
,Скорость уменьшил, не помогло
 
void RF_init()
{
    RF_DDR = (1 << OUT_PIN) | (0 << IN_PIN);
    RF_PORT = (0 << OUT_PIN) | (1 << IN_PIN);
}
 
 
 
int main(void)
{
    RF_init();
    PORTD = DDRD = (1 << 0);
    while (1) 
    {
        int h = 0;
        h = RF_read ();
        if(h == 0b01001011)
            SET(RF_PORT, OUT_PIN);
    }
}
Не помогло

Добавлено через 1 минуту
Но ситуация улучшилась, теперь реже стал самопроизвольно сжигаться светодиод.
0
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
25.01.2021, 15:58 12
Цитата Сообщение от Sierra26 Посмотреть сообщение
Но ситуация улучшилась,
конечно ). Теперь у вас многократно увеличился шанс вообще хоть-то что-то принять от передатчика. Но... Вы все же прислушайтесь к совету, и переходите на UART. В Вашем коде еще очень много других проблем, которые он поможет решить.
0
3349 / 1927 / 368
Регистрация: 09.09.2017
Сообщений: 7,799
25.01.2021, 17:48 13
Цитата Сообщение от Sierra26 Посмотреть сообщение
исправил:
А что именно вы исправили? Может, я не туда смотрю, но стартовый бит все еще не ловится, проверок четности и всего остального все еще нет. Нет, небольшое увеличение задержки видно, но это явно не то изменение, о котором стоит упоминать.
Цитата Сообщение от Sierra26 Посмотреть сообщение
if((RF_PIN >> IN_PIN) & 1)
Так лучше не делать. Вы сдвигаете переменную, это дорогая операция. Лучше сдвигайте константу:
C
1
if( RF_PIN & (1<<IN_PIN) )
Цитата Сообщение от Voland_ Посмотреть сообщение
Вы все же прислушайтесь к совету, и переходите на UART.
Искренне поддерживаю!
Если не хотите аппаратный, можете даже на программный перейти, все равно будет лучше, чем сейчас. Заодно тестировать проще будет.
0
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
25.01.2021, 18:34  [ТС] 14
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А что именно вы исправили? Может, я не туда смотрю, но стартовый бит все еще не ловится, проверок четности и всего остального все еще нет. Нет, небольшое увеличение задержки видно, но это явно не то изменение, о котором стоит упоминать.
. 0b01001011 первый бил 0, то есть значение перешло с 1 на 0 (это я и считаю стартовым битом, последний бит 1 - это проверка четности).
0
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
26.01.2021, 19:55  [ТС] 15
Попробовал через USART. Светодиод вообще не загорается.
Приемник
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
#include <avr/io.h>
#include "avr/interrupt.h"
 
 
#define SET(r, b) (r |= (1 << b))
#define CLR(r, b) (r &= ~(1 << b))
 
 
ISR(USART_RXC_vect)
{
    unsigned cCommand = UDR; 
    if(cCommand == 0xb10110010)
        SET(PORTC, PC5);
//  else
//      CLR(PORTD, PD0);        
}
 
void init_IO()
{
    SET(DDRC, PC5);
}
 
 
void init_USART()
{   
    UBRRH = 0;
    UBRRL = 50;
    UCSRB = (1 << RXCIE) | (1 << RXEN);
    UCSRC = (1 << URSEL) | (1 << UPM1) | (1 << UCSZ0) | (1 << UCSZ1);   
}
 
 
int main(void)
{
    init_IO();
    init_USART();
    sei();
    while (1) 
    {       
    }
}
Передатчик
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
#include <avr/io.h>
#include <avr/interrupt.h>
 
#define SET(r, b) (r |= (1 << b))
#define CLR(r, b) (r &= ~(1 << b))
 
ISR(USART_UDRE_vect)
{
    UDR = (unsigned char)0xb10110010;
    CLR(UCSRB, UDRIE);
}
 
 
void USART_Transmit( unsigned char data ) //Функция отправки данных
{
    while (!(UCSRA & (1 << UDRE))); //Ожидание опустошения буфера приема
        UDR = data; //Начало передачи данных
}
 
void init_USART()
{   
    UBRRH = 0;
    UBRRL = 50;
    UCSRB = (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UPM1) | (1 << UCSZ0) | (1 << UCSZ1);   
}
 
void init_IO()
{
    SET(PORTB, PB0);
};
 
 
int main(void)
{
    init_IO();
    init_USART();   
    sei();
    while (1) 
    {
        if(!(PINB & (1 << PB0)))
            SET(UCSRB, UDRIE);      
    }
}
Подскажите пожалуйста в чем может быть проблема? В вектор прерывания заходит и в приемнике и в передатчике, а вот условие в приемнике не срабатывает.
0
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
26.01.2021, 21:36 16
По виду у Вас ножки UART'а не настраиваются. И Передатчик надо подключать к USART TX передатчика, а Приемник - к USART RX приемника.
0
3349 / 1927 / 368
Регистрация: 09.09.2017
Сообщений: 7,799
26.01.2021, 22:48 17
Цитата Сообщение от Sierra26 Посмотреть сообщение
if(cCommand == 0xb10110010)
точно? Шестнадцатеричное число?
Цитата Сообщение от Sierra26 Посмотреть сообщение
Попробовал через USART. Светодиод вообще не загорается.
Попробуйте напрямую соединить TX передатчика и RX приемника, без беспроводных модулей. И линии земли, естественно. Просто чтобы проверить что с самим UART все в порядке.
0
6 / 6 / 3
Регистрация: 04.06.2015
Сообщений: 189
27.01.2021, 00:06  [ТС] 18
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Попробуйте напрямую соединить TX передатчика и RX приемника
так и делаю, от простого к сложному. Линии земли - что это за линия?
if(cCommand == 0xb10110010), сейчас просто пишу if(cCommand == 178) и на отправки UDR = 178. Все равно не загорается. Попробовал условие на 0, тогда загорается

Добавлено через 1 минуту
Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
USART TX передатчика, а Приемник - к USART RX приемника.
все верно
0
3349 / 1927 / 368
Регистрация: 09.09.2017
Сообщений: 7,799
27.01.2021, 08:14 19
Цитата Сообщение от Sierra26 Посмотреть сообщение
Линии земли - что это за линия?
Я же не знаю какая у вас схема включения. Вдруг у вас два контроллера, соединенных только линией данных и не имеющих никакого общего потенциала. Так сигнал передаваться не будет. Так что при проводной передаче сигнала нужно соединить хоть какой-то постоянный потенциал, обычно землю, минусовый вывод контроллера.
0
1927 / 1242 / 124
Регистрация: 04.01.2010
Сообщений: 4,448
27.01.2021, 10:51 20
Цитата Сообщение от Sierra26 Посмотреть сообщение
все верно
см.мое сообщение выше. Ноги UART вы где настраиваете?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2021, 10:51

ик приемник + AT89C2051 + EM8511
Здравствуйте, у меня есть такой вопрос: отдали мне медиа приставку rapsody-250, а пульта в коробке...

Atmega8 и ИК приемник+ пульт от вентилятора
Привет всем. Есть у меня RGB ночник, работающий на меге8. Возникло желание управлять им с...

ИК приемник
Здравствуйте. Купил vs1838b, пробую подключить к МК stm32f103 Для тестов, мигаю ИК диодом и...

stm32f3discovery + ir приемник
Доброго времени суток, форумчане!!! В попытках дальнейшего освоения stm контроллеров захотелось...

PIC12F1822 не могу запустить приемник UART
Добрый день. Не могу запустить UART приемник на PIC12F1822 Прерывание дергается, при старте мк,...

Приёмник цифр импульсного набора номера телефонного аппарата
нужен фрагмент программы на языке ассемблера с комментариями ( для приёмника цифр импульсного...


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

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

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