Проблемы с переходом на 3.3в 8мгц
- Войдите на сайт для отправки комментариев
Приветствую участников сообщества!
На днях столкнулся с проблемой которой ни как не могу найти решения изза отстутствия знаний.
Есть у меня дебильное хобби в сфере радиолюбительской, я строю автономные маяки и ставлю их в лесу.
Не так давно решил я поставить 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 () ; }
148 - 206 шедеврально выглядят !
насколько я вижу - у вас код успевает крутануться несколько раз за секунду, по которой производится отсчет старта
Насчет 148-206 согласен что не очень, я еще над этим не работал проблема посылки WSPR пакета в том что его нужно начать передавать четко каждую четную минуту. Я потом переделаю, проблема как подправить эти таймеры на ардуину 3.3v 8mhz
Раз частота в два раза ниже при переходе с 16 на 8, то и отсчетов этой частоты должно быть в два раза меньше !
Может я не до конца понял, проверьте. Изначальная проблема в том, что Вы используете 8МГц а ардуина генерит Вам код для 16МГц и все задержки и периоды у Вас вдвое увеличиваются. так?
Если так, то Вам не нужно менять код вообще, а нужно просто объяснить ардуино IDE, чтобы она генерила код под 8МГц. Это совсем несложно - на десяток кликов мышом.
Раз частота в два раза ниже при переходе с 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.
Ну вот ты в маяках своих шаришь? А почему тогда дураком себя в другой области выставляешь?
Может я не до конца понял, проверьте. Изначальная проблема в том, что Вы используете 8МГц а ардуина генерит Вам код для 16МГц и все задержки и периоды у Вас вдвое увеличиваются. так?
Если так, то Вам не нужно менять код вообще, а нужно просто объяснить ардуино IDE, чтобы она генерила код под 8МГц. Это совсем несложно - на десяток кликов мышом.
Именн так, изначально была проблема что посылка сильно длинная, это я исправил изменением параметра СТС, но всеравно эти таймеры не работают правильно.. выше сообщение сама настройка, но я не понимаю что там нужно сделать
WSPR_CTC надо в два раза уменьшить
Если проблема только в этом, то давайте лучше решим её "в корне".
Если проблема только в этом, то давайте лучше решим её "в корне".
Давайте решим если это возможно.
ЕвгенийП У него константы таймера не привязаны к частоте !
ЕвгенийП У него константы таймера не привязаны к частоте !
Да, к сожалению, это так, я уже заметил.
В общем, из серии "что такое говнокод" - автору лень прописать тривиальные макросы, а потом немерянно траху с простейшими изменениями :-(((
Там бы и millis с головой хватило без прерываний и таймеров насколько я вижу ...
кто то извратился, но даже перезапуск таймера не сделал
Все посылки получаются немного разной длины в итоге ???
Там бы и millis с головой хватило без прерываний и таймеров насколько я вижу ...
кто то извратился, но даже перезапуск таймера не сделал
Все посылки получаются немного разной длины в итоге ???
Вроде да, первая посылка вроде правильно, остальные смешены как по времени старта так и длине. В один заход получается 3 посылки, и потом по кругу от плана включения
Сколько должна длиться посылка ?
Сколько должна длиться посылка ?
1.4648 бод ,110секунд весь пакет идет
9 строка можно удалить, а библиотека morse.h откуда?
ТС - Вас 39 и 103 строки не пугают ?
9 строка можно удалить, а библиотека morse.h откуда?
В промежутках между вспр маяк еще планируется чтоб передавал CW/
ТС - Вас 39 и 103 строки не пугают ?
Еслиб я чтото в этом понимал...
9 строка можно удалить, а библиотека morse.h откуда?
В промежутках между вспр маяк еще планируется чтоб передавал CW/
я не об этом, чья библиотека, ссылка...
WSPR_CTC можно считать:
0 и 1 кодируются разной частотой ? А длительность 0 и 1 одинаковая ?
9 строка можно удалить, а библиотека morse.h откуда?
В промежутках между вспр маяк еще планируется чтоб передавал CW/
я не об этом, чья библиотека, ссылка...
WSPR_CTC можно считать:
Все верно, так я и поставил, потому что там СТС стояло для 16мгц.
Как тогда сбрасывать этот таймер после передачи посылки, он у меня 3 раза подряд передает.
По поводу библиотеки, я не знаю кто ее писал, он у меня давно, могу вам почтой отправить.
0 и 1 кодируются разной частотой ? А длительность 0 и 1 одинаковая ?
Длительность должна быть одинаковая. он ведь путем изменения частоты на 1.46гц разделяет их
По поводу библиотеки, я не знаю кто ее писал, он у меня давно, могу вам почтой отправить.
отправь, позывной на яндексе...
в таймерах тут сильны DIMAX, ЕвгенийП, WDRAKULA... ну и еще с десяток другой, но они менее активны...