Программа для управления селектором Selteka KS-H-14XX

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Пробую свои силы в написании программы  для упарвление селектором тв тюнера KS-H-14X.Написал програмку по вводу частоты напрямую.Селектор управляется по i2c.Но при прогоне в  ПРОТЕУСЕ-дебаггер показывает ,что в тюнер не отправляются еоманды,функция setFrequencу не выполняется вообще.Подскажите где я на грабли встал?



#define TUNER_adr 0x60      //Адрес i2c тюнера  write mode
#define TUNER_gain_on 0x89  //Вкл режима усиления сигнала, шаг 50кгц
#define TUNER_gain_off 0x88 //Выкл режима усиления сигнала (нормальный режим) шаг 50кгц
#define TUNER_LB  0x01      //Первый диапозон тюнера
#define TUNER_MB  0x02      //Второй диапозон тюнера
#define TUNER_HB  0x0C      //Третий диапозон тюнера

#define HiBYTE(w) (uint8_t)((w >> 8) & 0x00ff)
#define LoBYTE(w) (uint8_t)((w >> 0) & 0x00ff)
#define RCV_MAX 855000                  //Максимальная принимаемая частота
#define RCV_MIN  40000                  //Минимальная принимаемая частота
volatile uint8_t TunerGain  = 0;        //Переменная включения усиления
volatile uint32_t FrcvWork  =107.900;             //Настраиваемая частота приема


#include <Wire.h>               // I2C-Library для управления радиомодулем RDA5807
// SDA приемника RDA5807 подключаем к аналоговому входу 4
// SCL приемника RDA5807 подключаем к аналоговому входу 5 



// Стартовая частота настройки приемника RDA5807. (Можно изменить на нужную).

void setup()
{
  Wire.begin();   // Инициализация двухпроводной шины I2C.
  setFrequency();  // Присваиваем значение частоты радиомодулю RDA5807
  pinMode(3, INPUT); // вход для подключения кнопки "Частота вниз"
  pinMode(4, INPUT);// вход для подключения кнопки "Частота вверх"
  Serial.begin(9600);
}

void loop()                  
{
float FrcvWork=(FrcvWork*1000); // производим вычисления для отображения установленной частоты на дисплее
int fin2=FrcvWork/100; // производим вычисления для отображения установленной частоты на дисплее

Serial.print("frequency    ");
Serial.println(fin2);
// проверяем нажатие кнопки "Частота вниз"
if (digitalRead(6) == HIGH){
// если кнопка "Частота вниз" нажата
FrcvWork=FrcvWork-0.1; // уменьшаем значение частоты на 0,1 МГц
 setFrequency(); // передаем новое значение частоты радиомодулю
};
// проверяем нажатие кнопки "Частота вверх"
if (digitalRead(7) == HIGH){
// если кнопка "Частота вверх" нажата
FrcvWork=FrcvWork+0.1;// увеличиваем значение частоты на 0,1 МГц
 setFrequency();// передаем новое значение частоты радиомодулю
};
delay(500); // задержка 0,5 сек. 
}
  

void setFrequency()  // Функция загрузки частоты настройки в модуль RDA5807.
{
   uint32_t fPCH1;
  uint8_t  Band;
    Band = TUNER_LB;
     if(FrcvWork > 155000L) Band = TUNER_MB;
     if(FrcvWork > 440000L) Band = TUNER_HB;
      fPCH1 = (uint16_t)((FrcvWork + 38900)/50);
  Wire.beginTransmission(TUNER_adr);                        // Адрес чипа 
  Serial.println(TUNER_adr);
  Wire.write(HiBYTE(fPCH1));
  Serial.println(HiBYTE(fPCH1));// Старший байт.
  Wire.write(LoBYTE(fPCH1));  
  Serial.println(LoBYTE(fPCH1));// Младший байт.
  Wire.write((TunerGain)? TUNER_gain_on:TUNER_gain_on);   // усиление 
  Serial.println( (TunerGain)? TUNER_gain_on:TUNER_gain_on);
  Wire.write(Band);                                        // Диапазон
  Serial.println(Band);
  Wire.endTransmission();                                  // формируем I2C-Stop.
} 

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

 

Вот скрин с пртеуса

post27
Offline
Зарегистрирован: 06.04.2012

Прошло 5 лет и нифига. Че то не правильно работает начальная установка частоты см float  

b707
Offline
Зарегистрирован: 26.05.2017

После строки 13 я бы абсолютно ничего хорошего от этого кода не ждал бы. Да и строка 35 после строки 13 тоже хороша :)

Похоже человек, который писал код, вообще ничего не понимал ни в типах переменных языка си, ни вообще в программировании...

post27
Offline
Зарегистрирован: 06.04.2012

И как это все исправить? Я тоже не шарю. Но у меня есть KS H и Ардуино нано, ошибок нет, но начальная частота отображается не правильно

sadman41
Offline
Зарегистрирован: 19.10.2016

Тут "исправлять" 80% кода нужно. И ещё столько же дописать.

post27
Offline
Зарегистрирован: 06.04.2012

Исправил работает с энкодером

#include <rotary.h>
#define encPinA 2   // encoder pin A
#define encPinB 3  // encoder pin B
 
#define TUNER_adr 0x60      //Адрес i2c тюнера  write mode
#define TUNER_gain_on 0x89  //Вкл режима усиления сигнала, шаг 50 кгц
#define TUNER_gain_off 0x88 //Выкл режима усиления сигнала (нормальный режим) шаг 50 кгц
#define TUNER_LB  0x01      //Первый диапозон тюнера
#define TUNER_MB  0x02      //Второй диапозон тюнера
#define TUNER_HB  0x0C      //Третий диапозон тюнера
#define HiBYTE(w) (uint8_t)((w >> 8) & 0x00ff)
#define LoBYTE(w) (uint8_t)((w >> 0) & 0x00ff)
volatile uint8_t TunerGain  = 0;        //Переменная включения усиления
 
Rotary encoder = Rotary(encPinA, encPinB); // sets the pins the rotary encoder uses.
int_fast32_t rx = 92300;  // Starting frequency of VFO 92.3000 MHz
 
 
 
int_fast32_t step = 50; // starting VFO update increment in HZ
 
 
 
#include <Wire.h> 
void setup() {
  Wire.begin();
   Serial.begin(9600);
setFrequency();
}
 
void loop() {
unsigned char result = encoder.process();
  if (result) {
    if (result == DIR_CW) {
      rx = rx + step;
      
   
    
     setFrequency();
    }
     else {
      rx = rx - step;
      
      
      setFrequency(); // передаем новое значение частоты радиомодулю
    };
 if (rx >= 850000) {
      rx = 849950;
    }; // UPPER VFO LIMIT 800MHz
    if  (rx <= 40000) {
      rx = 39950;
    }; // LOWER VFO LIMIT 40MHz  
 
}
}
void setFrequency()
{
uint32_t fPCH1;
uint8_t  Band;
   Band = TUNER_LB;
     if(rx > 155000L) Band = TUNER_MB;
     if(rx> 440000L) Band = TUNER_HB;
     fPCH1 = (uint32_t)((rx + 38900)/50);
      Wire.write(fPCH1);
       Serial.print("Частота ");
      Serial.println(rx);  
       Serial.print("В тьюнер   ");
  Serial.println(fPCH1);
  Wire.beginTransmission(TUNER_adr);                        // Адрес чипа
  Serial.print("Адрес чипа   ");
  Serial.println(TUNER_adr);
  Wire.write(HiBYTE(fPCH1));
  Serial.print("Старший байт.   ");
  Serial.println(HiBYTE(fPCH1));// Старший байт.
  Wire.write(LoBYTE(fPCH1)); 
   Serial.print("Младший байт.   ");
  Serial.println(LoBYTE(fPCH1));// Младший байт.
  Wire.write((TunerGain)? TUNER_gain_on:TUNER_gain_on);   // усиление
   Serial.print("усиление ");
  Serial.println( (TunerGain)? TUNER_gain_on:TUNER_gain_on);
  Wire.write(Band);                                        // 
 Serial.print("Диапазон  ");
  Serial.println(Band);
  Wire.endTransmission();     
}         
 
 
post27
Offline
Зарегистрирован: 06.04.2012

Только все фигня как я понимаю, это работает и без KS-H 148, хотя когда спрашиваешь у него адрес по I2C отвечает правильно. Все остальное это скетч?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

post27 пишет:

Исправил работает с энкодером

#include <rotary.h>

А правила форума за 9 лет так и не прочитали.... Тенденция, однако!