Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить

связь 2х Atmega8 через RFM69HW

Ср янв 24, 2024 11:53:01

всем доброго дня.
Пытаюсь передать переменную через RFM69HW. Значения переменной не передаются или не принимаются.
Оборудования для замера радиочастотной активности нет.
Может у кого то есть кусочек кода, что бы точно рабочий был, для проверки модулей. А то может с ними что то не так.
Хотя может и я в коде что то напортачил. вот код передающей части:
Код:
#define F_CPU 1000000UL // Частота контроллера 1 МГц

            #include <avr/io.h>
            #include <util/delay.h>
            #include <avr/interrupt.h>
            #include <stdint.h>

            #define LCD_RS 2
            #define LCD_EN 3
            #define LCD_D4 4
            #define LCD_D5 5
            #define LCD_D6 6
            #define LCD_D7 7

            #include "LCD.h"


            // Настройки битов модуля RFM69HW
            #define RFM69_FREQUENCY_MSB 0x10
            #define RFM69_FREQUENCY_LSB 0xE4
            #define RFM69_POWER_LEVEL   0x80
            #define RFM69_DATA_RATE     0x03
            #define RFM69_CHANNEL_WIDTH 0x48
            #define RFM69_SPI_SPEED     1000000 // 1 MHz SPI speed

            // Пины для подключения к модулю RFM69
            #define SS_PIN  2
            #define MOSI_PIN 3
            #define MISO_PIN 4
            #define SCK_PIN  5

            // Переменные для передачи данных
            volatile uint16_t comand_1 = 0;

            void spi_init() {
               // Настройка SPI
               DDRB |= (1 << MOSI_PIN) | (1 << SCK_PIN) | (1 << SS_PIN);
               SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);
            }

            void spi_transfer(uint8_t data) {
               SPDR = data;
               while (!(SPSR & (1 << SPIF)));
            }

            void rfm69_init() {
               // Настройка битов модуля
               spi_transfer(0x80 | RFM69_FREQUENCY_MSB);
               spi_transfer(RFM69_FREQUENCY_LSB);
               spi_transfer(RFM69_POWER_LEVEL);
               spi_transfer(RFM69_DATA_RATE);
               spi_transfer(RFM69_CHANNEL_WIDTH);

               // Включение передатчика
               spi_transfer(0x80 | 0x09);
               spi_transfer(0x01);
            }

            void rfm69_send(uint16_t data) {
               // Передача данных
               spi_transfer(0x80 | 0x00);
               spi_transfer(data >> 8);
               spi_transfer(data & 0xFF);
               spi_transfer(0x80 | 0x08);
            }

            int main() {
               spi_init();
               rfm69_init();
               LCD_Init();
               _delay_ms(10);
               LCD_Print("333-555");

               while (1) {
                  rfm69_send(comand_1);
                  comand_1++;
                  print_varible (comand_1)  ;

                  _delay_ms(2000); // Задержка 2 секунды
               }

               return 0;
            }



А вот приннимающей:
Код:
#define F_CPU 1000000UL // Частота контроллера 1 МГц

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>
#define LCD_RS 2
#define LCD_EN 3
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7

#include "LCD.h"

// Настройки битов модуля RFM69HW
#define RFM69_FREQUENCY_MSB 0x10
#define RFM69_FREQUENCY_LSB 0xE4
#define RFM69_POWER_LEVEL   0x80
#define RFM69_DATA_RATE     0x03
#define RFM69_CHANNEL_WIDTH 0x48
#define RFM69_SPI_SPEED     1000000 // 1 MHz SPI speed

// Пины для подключения к модулю RFM69
#define SS_PIN  2
#define MOSI_PIN 3
#define MISO_PIN 4
#define SCK_PIN  5

// Переменные для принятия данных
volatile uint16_t comand_2 = 0;

void spi_init() {
   // Настройка SPI
   DDRB |= (1 << MOSI_PIN) | (1 << SCK_PIN) | (1 << SS_PIN) | (1 << MISO_PIN);
   SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);
}

uint8_t spi_transfer(uint8_t data) {
   SPDR = data;
   while (!(SPSR & (1 << SPIF)));
   return SPDR;
}

void rfm69_init() {
   // Настройка битов модуля
   spi_transfer(0x80 | RFM69_FREQUENCY_MSB);
   spi_transfer(RFM69_FREQUENCY_LSB);
   spi_transfer(RFM69_POWER_LEVEL);
   spi_transfer(RFM69_DATA_RATE);
   spi_transfer(RFM69_CHANNEL_WIDTH);

   // Включение приемника
   spi_transfer(0x80 | 0x05);
   spi_transfer(0x01);
}

uint16_t rfm69_receive() {
   // Прием данных
   spi_transfer(0x80 | 0x10);
   uint16_t received_data = (spi_transfer(0) << 8) | spi_transfer(0);
   return received_data;
}

int main() {
   spi_init();
   rfm69_init();
   LCD_Init();
   _delay_ms(10);
   LCD_Print("333-444");

   while (1) {
      comand_2 = rfm69_receive();
      print_varible (comand_2);

      // Ваш код для обработки переменной comand_2

      _delay_ms(500); // Задержка 0.5 секунды
   }

   return 0;
}

Re: связь 2х Atmega8 через RFM69HW

Вс апр 14, 2024 22:10:21

Жаль, что так никто ничего и не подсказал (((

Re: связь 2х Atmega8 через RFM69HW

Ср апр 17, 2024 01:00:53

потому что не в том разделе тема

для работы с передатчиками нужен волномер, схемы сам загуглиш

правильный код - это библиотеки для арудино
https://github.com/LowPowerLab/RFM69
залил примеры и сразу проверил модули, а не изобретать велосипед

Re: связь 2х Atmega8 через RFM69HW

Ср апр 17, 2024 12:50:06

Оборудования для замера радиочастотной активности нет.

Оборудование для замера радиочастотной активности - это простой диод с индикатором))
https://www.youtube.com/watch?v=YChJt2jQXVg
:tea:
в попу все ваши библиотеки для арудино))
надо открыть даташит и настроить всё согласно даташиту.
:tea:
кто это будет делать за вас... не ясно))
:tea:

Re: связь 2х Atmega8 через RFM69HW

Ср апр 17, 2024 14:30:23

кто это будет делать за вас... не ясно))

уже сделали... в библиотеках :))
Ответить