Проблемы с переходом на 3.3в 8мгц

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Приветствую участников сообщества!
На днях столкнулся с проблемой которой  ни как не могу найти решения изза отстутствия знаний.
Есть у меня дебильное хобби в сфере радиолюбительской, я строю автономные маяки и ставлю их в лесу.
Не так давно решил я поставить WSPR маяк в лесу, до этого ставил только CW на MSP430. И перейти на Ардуино, купил ардуинку 3.3в 8мгц и на ней решил все сделать. 
Проблема случилась в том что при питании 3.3в 8мгц все задержки и тайминги сдвигаются.. И тут для меня случилась проблема, я ни как не понимаю как с ними работать, честно признаюсь читал, но не могу понять что нужно делать. Один из скетчей мне все же удалось заставить работать, но там проблема в том что посылка сообщения происходит 3 раза подряд, а должна всего один и то после изменения параметра CТС (в два раза я уменьшил). Остальное как подправить я не знаю, помогите знающие люди, есть скетч там даже некоторое описание есть, но все сводится к этимтаймерам.. с которыми я увы не умею работать.

Вопрос такой : почему он передает 3 раза подряд и только после изменения параметра СТС (в два раза меньше).

#include <morse.h>

#define PIN_STATUS  12

#include "si5351.h"
#include "Wire.h"
#include <JTEncode.h>
#include <int.h>
#include "Wire.h"
#include <TinyGPS++.h>

#include <SoftwareSerial.h>

SoftwareSerial ss(9, 8); // RX, TX

#define TONE_SPACING            146           // ~1.46 Hz
//#define WSPR_CTC                21344         // CTC value for WSPR
//#define WSPR_CTC                10672         // CTC value for WSPR
#define WSPR_CTC                5336         // CTC value for WSPR
#define SYMBOL_COUNT            WSPR_SYMBOL_COUNT
#define CORRECTION              0             // Change this for your ref osc

//#define TX_LED_PIN              12
//#define SYNC_LED_PIN            13

Si5351 si5351;

TinyGPSPlus gps;

JTEncode jtencode;
unsigned long freq = 14093300UL;  
unsigned long freqcw = 1405330000UL;  

 
//unsigned long freq = 6517080UL;// Change this
char call[7] = "R0AGL";                        // Change this
char loc[5] = "NO67";                            // Change this
uint8_t dbm = 10;
uint8_t tx_buffer[SYMBOL_COUNT];

// Global variables used in ISRs
volatile bool proceed = false;

// Timer interrupt vector.  This toggles the variable we use to gate
// each column of output to ensure accurate timing.  Called whenever
// Timer1 hits the count set below in setup().
ISR(TIMER1_COMPA_vect)
{
    proceed = true;
    // Serial.println("timer fired");
}


void setup()
{
  ss.begin(9600);
  //pinMode(6, OUTPUT);
  pinMode(12, OUTPUT);
  //pinMode(13, OUTPUT);
  //digitalWrite(6, HIGH);
   //digitalWrite(13, HIGH);
    

  //digitalWrite(TX_LED_PIN, LOW);
  //Serial.begin(9600);

  // Set time sync provider
  //setSyncProvider(requestSync);  //set function to call when sync required

  // Initialize the Si5351
  // Change the 2nd parameter in init if using a ref osc other
  // than 25 MHz
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, CORRECTION);

  // Set CLK0 output
  si5351.set_freq(freq * 100, SI5351_CLK0);
  si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA); // Set for max power
  si5351.set_clock_pwr(SI5351_CLK0, 0); // Disable the clock initially

  // Set up Timer1 for interrupts every symbol period.
  (gps.encode(ss.read()));
  
  noInterrupts();          // Turn off interrupts.
  TCCR1A = 0;              // Set entire TCCR1A register to 0; disconnects
                           //   interrupt output pins, sets normal waveform
                           //   mode.  We're just using Timer1 as a counter.
  TCNT1  = 0;              // Initialize counter value to 0.
  TCCR1B = (1 << CS12) |   // Set CS12 and CS10 bit to set prescale
    (1 << CS10) |          //   to /1024
    (1 << WGM12);          //   turn on CTC
                           //   which gives, 64 us ticks
  TIMSK1 = (1 << OCIE1A);  // Enable timer compare interrupt.
  OCR1A = WSPR_CTC;       // Set up interrupt trigger count;
  interrupts();            // Re-enable interrupts.

  //encode(); // transmit once and stop
}

// Loop through the string, transmitting one character at a time.
void encode()
{
    uint8_t i;
  memset(tx_buffer, 0, 255);
  jtencode.wspr_encode(call, loc, dbm, tx_buffer);
  // jtencode.wspr_encode(call, loc, dbm);

    // Reset the tone to 0 and turn on the output
     //digitalWrite(13, HIGH);

    digitalWrite(12, HIGH);
    si5351.set_clock_pwr(SI5351_CLK0, 1);
    
    
   

    // Now do the rest of the message
    for(i = 0; i < SYMBOL_COUNT; i++)
    {
      uint64_t frequency = (freq * 100) + (tx_buffer[i] * TONE_SPACING);
        si5351.set_freq(frequency, SI5351_CLK0);
        proceed = false;
        while(!proceed);
    }
      // Turn off the output
    si5351.set_clock_pwr(SI5351_CLK0, 0);
    digitalWrite(12, LOW);
   // digitalWrite(13, LOW);
   (gps.encode(ss.read()));// do a GPS read
}

void cw(){
   si5351.set_clock_pwr(SI5351_CLK0, 1);
   si5351.set_freq(freqcw, SI5351_CLK0);
  LEDMorseSender cqSender(PIN_STATUS);
  cqSender.setWPM(17);
  cqSender.setup();
  cqSender.setMessage(String("cq cq de r0agl bcn no66 "));
  cqSender.sendBlocking();
   si5351.set_clock_pwr(SI5351_CLK0, 0);
  (gps.encode(ss.read()));// do a GPS read
  }


void gpsgatetime ()        //setup of transmission times at 0,7,14,21,24,32,35
                           //44,46,50 and 55 minutes of each hour at exact zero seconds
{

  if (gps.time.minute() == 0 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 2 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 4 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 6 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 8 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 10 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 12 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 14 && gps.time.second() == 1){
    cw();}  
  if (gps.time.minute() == 16 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 18 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 20 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 22 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 24 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 26 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 28 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 30 && gps.time.second() == 1){
    cw();}  
    if (gps.time.minute() == 32 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 34 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 36 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 38 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 40 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 42 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 44 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 46 && gps.time.second() == 1){
    cw();}  
  if (gps.time.minute() == 48 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 50 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 52 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 54 && gps.time.second() == 1){
    cw();}
  if (gps.time.minute() == 56 && gps.time.second() == 1){
    encode();}
     if (gps.time.minute() == 58 && gps.time.second() == 1){
    cw();}
 
}



void loop()
{

  //if (ss.available() > 0) {
 //   (gps.encode(ss.read()));
 // } else {
    //
///  }
//  gpsgatetime () ;
   // blink LED when we've finished the transmit
  //digitalWrite(TX_LED_PIN, HIGH);
 while (ss.available() > 0)
   if (gps.encode(ss.read()))
    gpsgatetime () ;
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

148 - 206 шедеврально выглядят !

насколько я вижу - у вас код успевает крутануться несколько раз за секунду, по которой производится отсчет старта

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Насчет 148-206 согласен что не очень, я еще над этим не работал проблема посылки WSPR пакета в том что его нужно начать передавать четко каждую четную минуту. Я потом переделаю, проблема как подправить эти таймеры на ардуину 3.3v 8mhz

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Раз частота в два раза ниже при переходе с 16 на 8, то и отсчетов этой частоты должно быть в два раза меньше !

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Может я не до конца понял, проверьте. Изначальная проблема в том, что Вы используете 8МГц а ардуина генерит Вам код для 16МГц и все задержки и периоды у Вас вдвое увеличиваются. так? 

Если так, то Вам не нужно менять код вообще, а нужно просто объяснить ардуино IDE, чтобы она генерила код под 8МГц. Это совсем несложно - на десяток кликов мышом.

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Komandir пишет:

Раз частота в два раза ниже при переходе с 16 на 8, то и отсчетов этой частоты должно быть в два раза меньше !

Это я понимаю.
вот тут это настраивается, только я не знаю что именно поменять.

083   noInterrupts();          // Turn off interrupts.
084   TCCR1A = 0;              // Set entire TCCR1A register to 0; disconnects
085                            //   interrupt output pins, sets normal waveform
086                            //   mode.  We're just using Timer1 as a counter.
087   TCNT1  = 0;              // Initialize counter value to 0.
088   TCCR1B = (1 << CS12) |   // Set CS12 and CS10 bit to set prescale
089     (1 << CS10) |          //   to /1024
090     (1 << WGM12);          //   turn on CTC
091                            //   which gives, 64 us ticks
092   TIMSK1 = (1 << OCIE1A);  // Enable timer compare interrupt.
093   OCR1A = WSPR_CTC;       // Set up interrupt trigger count;
094   interrupts();            // Re-enable interrupts.

 

Green
Offline
Зарегистрирован: 01.10.2015

Ну вот ты в маяках своих шаришь? А почему тогда дураком себя в другой области выставляешь?

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

ЕвгенийП пишет:

Может я не до конца понял, проверьте. Изначальная проблема в том, что Вы используете 8МГц а ардуина генерит Вам код для 16МГц и все задержки и периоды у Вас вдвое увеличиваются. так? 

Если так, то Вам не нужно менять код вообще, а нужно просто объяснить ардуино IDE, чтобы она генерила код под 8МГц. Это совсем несложно - на десяток кликов мышом.

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

WSPR_CTC надо в два раза уменьшить

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

evgeny_zaryanov пишет:
только я не знаю что именно поменять.
Ничего не нужно, я уже написал Вам в #4

Если проблема только в этом, то давайте лучше решим её "в корне".

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

ЕвгенийП пишет:

evgeny_zaryanov пишет:
только я не знаю что именно поменять.
Ничего не нужно, я уже написал Вам в #4

Если проблема только в этом, то давайте лучше решим её "в корне".


 

Давайте решим если это возможно.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ЕвгенийП У него константы таймера не привязаны к частоте !

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Komandir пишет:

ЕвгенийП У него константы таймера не привязаны к частоте !

Да, к сожалению, это так, я уже заметил.

В общем, из серии "что такое говнокод" - автору лень прописать тривиальные макросы, а потом немерянно траху с простейшими изменениями :-(((

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Там бы и millis с головой хватило без прерываний и таймеров насколько я вижу ...

кто то извратился, но даже перезапуск таймера не сделал

Все посылки получаются немного разной длины в итоге ???

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Komandir пишет:

Там бы и millis с головой хватило без прерываний и таймеров насколько я вижу ...

кто то извратился, но даже перезапуск таймера не сделал

Все посылки получаются немного разной длины в итоге ???

Вроде да, первая посылка вроде правильно, остальные смешены как по времени старта так и длине. В один заход получается 3 посылки, и потом по кругу от плана включения

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Сколько должна длиться посылка ?

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Komandir пишет:

Сколько должна длиться посылка ?

1.4648 бод ,110секунд весь пакет идет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

9 строка можно удалить, а библиотека morse.h откуда?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ТС - Вас 39 и 103 строки не пугают ?

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

ua6em пишет:

9 строка можно удалить, а библиотека morse.h откуда?

В промежутках между вспр маяк еще планируется чтоб передавал CW/

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Komandir пишет:

ТС - Вас 39 и 103 строки не пугают ?

Еслиб я чтото в этом понимал... 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

evgeny_zaryanov пишет:

ua6em пишет:

9 строка можно удалить, а библиотека morse.h откуда?

В промежутках между вспр маяк еще планируется чтоб передавал CW/

я не об этом, чья библиотека, ссылка...

WSPR_CTC можно считать:
 

uint16_t WSPR_CTC = (F_CPU/1499.25);

 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

0 и 1 кодируются разной частотой ? А длительность 0 и 1 одинаковая ?

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

ua6em пишет:

evgeny_zaryanov пишет:

ua6em пишет:

9 строка можно удалить, а библиотека morse.h откуда?

В промежутках между вспр маяк еще планируется чтоб передавал CW/

я не об этом, чья библиотека, ссылка...

WSPR_CTC можно считать:
 

uint16_t WSPR_CTC = (F_CPU/1499.25);

 

 

Все верно, так я и поставил, потому что там СТС стояло для 16мгц.
Как тогда сбрасывать этот таймер после передачи посылки, он у меня 3 раза подряд передает.

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

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Komandir пишет:

0 и 1 кодируются разной частотой ? А длительность 0 и 1 одинаковая ?

Длительность должна быть одинаковая. он ведь путем изменения частоты на 1.46гц разделяет их  

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

evgeny_zaryanov пишет:

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

отправь, позывной на яндексе...

в таймерах тут сильны DIMAX, ЕвгенийП, WDRAKULA... ну и еще с десяток другой, но они менее активны...