Software-Update zum SDR-Praxisbuch
Bei der Arbeit am SDR-Praxisbuch hatte ich die Etherkit Si5351
Bibliothek in der Version 1.1.2 verwendet und dabei leider übersehen,
dass neu hinzugekommene Anwender zuerst auf die neuere Version 2.1.4
stoßen. Mit der neuen Version und meinen ursprünglichen Quelltexten
erhält man einige Fehlermeldungen, weil sich einige Strukturen
geringfügig geändert haben. Inzwischen habe ich alle Beispielprogramme
aus dem Buch überarbeitet. Das Archiv enthält nun sowohl die
ursprünglichen als auch die aktualisierten Versionen.
Download: SDR2_0SoftwareArchiv0519.zip
Die entscheidenden Änderungen sind diese:
Initalisierung
Aus
si5351.init(SI5351_CRYSTAL_LOAD_8PF,
0);
wird
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0,0);
weil eine zusätzliche Null jetzt dafür steht, dass man die
Quarzfrequenz an dieser Stelle nicht abweichend von 25 MHz genauer angeben
will. Die eigentliche Kalibrierung muss nach dem Init stehen:
Aus
si5351.set_correction(162100);
wird
si5351.set_correction(162100,
SI5351_PLL_INPUT_XO);
wobei die INPUT_XO angibt, dass sich die Kalibrierung auf
den Quarzoszillator bezieht.
Frequenzausgabe
Aus
si5351.set_freq(freq*100ULL,
SI5351_PLL_FIXED, SI5351_CLK0); (alt)
wird
si5351.set_freq(freq*100ULL, SI5351_CLK0); (neu)
d.h. PLL_FIXED muss nicht mehr angegeben werden, weil die
Library das selbst so entscheidet.
//SI5351_vfo2.1 + LCD + Output Clk0/Clk2
#include "si5351.h"
#include "Wire.h"
#include <LiquidCrystal.h>
Si5351 si5351;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
unsigned long freq;
void setup(void)
{
Serial.begin(9600);
Serial.println("Si5351 Clockgen"); Serial.println("");
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
si5351.set_correction(162100, SI5351_PLL_INPUT_XO);
Serial.println(10100);
si5351.set_freq(4040000000ULL, SI5351_CLK1);
si5351.output_enable(SI5351_CLK1, 1);
freq = 10100;
lcd.begin(16, 2);
lcd.print(freq);
}
static void flush_input(void)
{
while (Serial.available() > 0)
Serial.read();
}
void loop(void)
{
si5351.update_status();
if (si5351.dev_status.SYS_INIT == 1) {
setup();
delay(500);
}
if (Serial.available()) {
int ch = Serial.read();
freq = Serial.parseInt();
Serial.println (freq);
int ch2 = Serial.read();
delay(1);
ch2 = Serial.read();
if (freq> 8){
lcd.setCursor(0, 0);
lcd.print(freq);
lcd.print(" ");
if (ch == 32) si5351.set_freq(freq*400000ULL, SI5351_CLK1); //" "
if (ch == 70) si5351.set_freq(freq*400000ULL, SI5351_CLK1); //F
if (ch == 102) si5351.set_freq(freq*400ULL, SI5351_CLK1); //f
if (ch == 65) si5351.set_freq(freq*100000ULL, SI5351_CLK0); //A
if (ch == 97) si5351.set_freq(freq*100ULL, SI5351_CLK0); //a
if (ch == 66) si5351.set_freq(freq*100000ULL, SI5351_CLK2); //B
if (ch == 98) si5351.set_freq(freq*100ULL, SI5351_CLK2); //b
}
if (freq==0){
if (ch == 65) si5351.output_enable(SI5351_CLK0, 0);
if (ch == 66) si5351.output_enable(SI5351_CLK2, 0);
if (ch == 70) si5351.output_enable(SI5351_CLK1, 0);
}
if (freq==1){
if (ch == 65) si5351.output_enable(SI5351_CLK0, 1);
if (ch == 66) si5351.output_enable(SI5351_CLK2, 1);
if (ch == 70) si5351.output_enable(SI5351_CLK1, 1);
}
}
}