Software-Update zum SDR-Praxisbuch  

Elektronik-Labor  Lernpakete  Projekte  HF  



https://www.elektor.de/das-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);
}
}
}



Elektronik-Labor  Lernpakete  Projekte  HF