FT 857 PA am Hermes

Themen rund um Hermes-Systeme
Antworten
Benutzeravatar
DH1KLM
Offline
Beiträge: 145
Registriert: Sa Mär 26, 2016 9:12 pm

FT 857 PA am Hermes

Beitrag von DH1KLM » Di Dez 03, 2019 8:30 pm


Hallo zusammen,
Nach “längerer” Sommerpause hat mich das Bastelfieber wieder gepackt und baue nun an meinem Hermes SDR weiter.
Leider existiert das Unterforum Hermes nicht mehr, deshalb setze ich das mal unter Apache Labs rein.
Ich hatte ja vor das Hermes Board mit einer FT857 PA Unit zu verbinden und auch zu steuern.
Nach verschiedenen, größtenteils erfolglosen Versuchen mit herkömmlichen BCD Adaptern und viel Recherchearbeit bin ich durch Zufall auf das Arduino Projekt von UA1NER gestoßen welcher einen FT857 mit fehlerhaftem Mainprozessor hatte und dieser die PA Unit nicht mehr steuern konnte. Anatoly hat mit Hilfe eines anderen OM ein Arduinosketch erstellt welches die Steuerung der PA Unit übernimmt. Anatoly hat mir das Sketch freundlicherweise zur Verfügung gestellt. Nach kurzer Augenscheinnahme war klar, das müsste auch für mein Projekt passen.
Und na ja was soll ich sagen, es funktioniert nach anpassen der PINS auf Anhieb.
Ich habe das ganze zuerst einmal auf dem Breadboard mit Shiftregistern und LED’s aufgebaut um nicht gleich die PA Unit zu himmeln.
Nachdem es ohne Probleme funktionierte, habe ich die auf dem Breadboard vorhandenen
Shiftregister einfach parallel zu denen auf der PA Unit angeschlossen (um über die LED’s informiert zu werden was gerade so los ist). Hatte aber eigentlich nicht damit gerechnet dass es so funktionieren würde, was es aber tat.

Am Hermes J16 Connector sind die Open Collector Anschlüsse OC1 – OC4 mit den Arduino Pin’s A0 – A3 verbunden. PTT Out Pin 25 am Hermes mit Pin 4 am Arduino.
Die Anschlüsse Data, Latch und Clock vom Arduino sind mit den Shift Registern auf der 857 PA Unit verbunden.
Shiftregister.PNG

Hier nun das Sketch. Leider ist darin so gut wie nichts dokumentiert, was mir das Verstehen der Funktionen sehr erschwert, ich kann ja nicht programmieren.
Das wenige war dann auch noch Russisch wurde aber durch Google übersetzt.
Die restlichen Anmerkungen stammen von mir.

Code: Alles auswählen

// Thanks to UA1NER
// This sketch is simulating the PA handling part of FT857 Mainprocessor. 
// FT857 PA to be used and controlled with Hermes or any other Anan Radio. J16 connectors having various pin descriptions, take care of it.
// Configuration via PowerSDR mrx PS, Thetis, etc. (Hermes ctrl).

// todo: cleaning up code, 
// add fan control via FT857 PA NTC., 

#define pin_D A3 // Hermes J16 Pin 26 Nano
#define pin_C A2 // Hermes J16 Pin 25 Nano
#define pin_B A1 // Hermes J16 Pin 24 Nano
#define pin_A A0 // Hermes J16 Pin 23 Nano 

#define buttonMinusPin  2 // not used by Hermes. Should be removed
#define buttonPlusPin   3 // not used by Hermes. Should be removed
#define buttonTXPin     4 // Hermes J16 Pin 25 PTT Output

struct BandReg {
   byte first;
   byte second;
};

struct BandCode {
   byte DCBA;
   byte bandRegNum;
};

// the lower 4 bits of the 1st byte is a DCBA combination from PDF, (translated from russian language)
// 2nd byte - range number from the next TX / RX array (translated from russian language)
BandCode bandCode[13] = {
   B0001, 0, //160 
   B0010, 1, //80
   B0011, 2, //60 ?
   B0011, 2, //40
   B0100, 3, //30
   B0101, 3, //20
   B0110, 4, //17
   B0111, 4, //15
   B1000, 5, //12
   B1001, 5, //10
   B1010, 6, //6
   B1011, 7, //2
   B1100, 8  //0.7
};

BandReg bandReg[2][9] = {
   //TX
   B00001100, B10001110, //1.8 MHz
   B00101000, B10001110, //3.6
   B00011000, B10001110, //7.0
   B10001000, B10001110, //10/14
   B00001001, B10001110, //18/21
   B00001010, B10001110, //24/28
   B01001000, B10001110, //50
   B00000000, B10001000, //VHF
   B00000000, B10000100, //UHF
   //RX
   B00000100, B00011110, //1.8 MHz
   B00100000, B00011110, //3.6
   B00010000, B00011110, //7.0
   B10000000, B00011110, //10/14
   B00000001, B00011110, //18/21
   B00000010, B00011110, //24/28
   B01000000, B00011111, //50
   B00000000, B00101110, //VHF
   B00000000, B01001110  //UHF
};

int dataPin  = 16; // MOSI Pin is connected to DATA input Pin 2 > BU4094 = Pin10 Yaesu Connector
int latchPin = 15; // SCLK Pin is connected to STB input Pin 1 > BU4094 = Pin 9 Yaesu Connector
int clockPin = 14; // MISO Pin is connected to CLK input Pin 3 > BU4094 = Pin 8 Yaesu Connector
int xStateButtonMinus = HIGH; //not used by Hermes. Should be removed
int xStateButtonPlus  = HIGH; //not used by Hermes. Should be removed
int xStateButtonTX    = HIGH;
int xcDCBAState       = 0;
int band = 0;
int txrx = 0;

void setup() {
// set the OUTPUT mode
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin,  OUTPUT);
pinMode(buttonMinusPin, INPUT_PULLUP); // not used by Hermes. Should be removed
pinMode(buttonPlusPin,  INPUT_PULLUP); // not used by Hermes. Should be removed
pinMode(buttonTXPin,    INPUT_PULLUP);
pinMode(pin_A,    INPUT_PULLUP);
pinMode(pin_B,    INPUT_PULLUP);
pinMode(pin_C,    INPUT_PULLUP);
pinMode(pin_D,    INPUT_PULLUP);
txrx = 1; // originally RX mode
updateReg();
//Serial.begin(9600);
}

void updateReg() {
digitalWrite(latchPin, HIGH); // set the latch synchronization to HIGH
// start "pushing" the data along the chain of registers, starting from the last (translated from russian language)
shiftOut(dataPin, clockPin, LSBFIRST, bandReg[txrx][band].first); // pass sequentially to dataPin - in the first register, the value is B01001100
shiftOut(dataPin, clockPin, LSBFIRST, bandReg[txrx][band].second); // "push" the data into the following register - in the first register B10000111, in the second - B01001100
// etc. by the number of registers (translated from russian language)
digitalWrite(latchPin, LOW); // "click" the register, thereby setting the values at the outputs
}

void loop() {
int cButtonState;
int cDCBAState;
int i;

delay(50);
cDCBAState = (digitalRead(pin_D) << 3) | 
       (digitalRead(pin_C) << 2) |
       (digitalRead(pin_B) << 1) |
       (digitalRead(pin_A) << 0);
//Serial.println(cDCBAState, BIN);       
// if all 0 or 1 - ignore
if ((cDCBAState != B0000)&&(cDCBAState != B1111)) {
   i = 0;
   while ((i < 13)&&(bandCode[i].DCBA != cDCBAState)) i++;
   if (i < 13) {
      band = bandCode[i].bandRegNum;
      if (xcDCBAState != cDCBAState) {
        updateReg();
        xcDCBAState = cDCBAState;
      }
      }
}
//Serial.println(band, DEC);

// RX/TX
cButtonState = digitalRead(buttonTXPin);
if (cButtonState != xStateButtonTX) {
//delay(20);
if (digitalRead(buttonTXPin) != xStateButtonTX) {
if (cButtonState == LOW) {
txrx = 0;
} else {
txrx = 1;
}
updateReg();
xStateButtonTX = cButtonState;
}
}

if (xcDCBAState == 0) {
  
cButtonState = digitalRead(buttonMinusPin);
if (cButtonState != xStateButtonMinus) {
delay(20);
if (digitalRead(buttonMinusPin) != xStateButtonMinus) {
if (cButtonState == LOW) {
if (band > 0) {
band -= 1;
updateReg();
}
}
xStateButtonMinus = cButtonState;
}
}

cButtonState = digitalRead(buttonPlusPin);
if (cButtonState != xStateButtonPlus) {
delay(20);
if (digitalRead(buttonPlusPin) != xStateButtonPlus) {
if (cButtonState == LOW) {
if (band < 8) {
band += 1;
updateReg();
}
}
xStateButtonPlus = cButtonState;
}
}

}

}



Und jetzt bin ich auf euer Wissen / Hilfe angewiesen.
Die einzige Funktion die leider nicht so klappt wie im FT 857 ist die Lüftersteuerung, bzw die Nachlaufzeit bis entsprechend herunter gekühlt wurde.
Die OM's sind den einfachen Weg gegangen und setzen bei TX ein Bit auf 1 und schon läuft der Lüfter, aber sobald auf RX geschaltet wird ist natürlich Ruhe.
Ich könnte nun dieses Bit auch beim Empfang auf 1 setzen, das gefällt mir aber nicht weil dann der Lüfter immer arbeitet.

BandReg bandReg[2][9] = {
//TX
B00001100, B10001110, //1.8 MHz


Ich habe mir jetzt folgendes gedacht.
Wenn man den auf der PA vorhandenen NTC mit dem Arduino auslesen würde, im Sketch einen Schwellwert in RX, bei dem der Lüfter abschaltet, definiert,
sollte das doch zu machen sein. Nur wie sag ich das meinem Arduino?
Ich denke das es nicht so trivial sein wird wie es sich für mich anhört.

Ach ja was mich noch ein wenig stört ist, dass wenn der Arduino bootet und die Ein/Ausgänge initialisiert, alle PIN'S kurz auf HIGH zieht und somit
die Steuerung/LPF/FAN als auch die LED's unkwillkürlich geschaltet werden. Soll sich aber mit einem externen Pulldown Widerstand ändern lassen, nur in welche Signalleitung soll ich den
reinmachen? Data, Latch oder Clock, oder bei allen dreien?

Ich würde mich sehr freuen wenn mir hierbei jemand (sehr) hilfreich unter die Arme greifen könnte.
Sorry für das lange Posting :roll:
73 de Sigi, DH1KLM

Benutzeravatar
DD8JM
Site Admin
Offline
Beiträge: 297
Registriert: Mo Dez 01, 2014 1:41 pm

Re: FT 857 PA am Hermes

Beitrag von DD8JM » Di Dez 03, 2019 9:19 pm


Hallo Sigi,
ich habe wieder ein Unterforum Hermes eingerichtet.

Vielleicht kann man den RX-Status abfragen und nach einer Zeitschleife X das TX - Lüfter Bit nach der Nachlaufzeit X auf null setzen.
if(bedingung == wert) {
// ausführen
} else if(bedingung2 == wert2) {
//ausführen
}
else {
// ...
}
Ich würde versuchen alle drei mit einem Pulldown-Wiederstand auf ein definiertes Signal zu ziehen.

73 Jörg
Die Bässe breit die Höhen schmal das ist der Funk aus Wuppertal.

Benutzeravatar
DH1KLM
Offline
Beiträge: 145
Registriert: Sa Mär 26, 2016 9:12 pm

Re: FT 857 PA am Hermes

Beitrag von DH1KLM » Mi Dez 04, 2019 4:39 pm


Hallo Jörg,
danke für die Antwort. Ich kann das geschriebene zwar nachvollziehen, aber mit dem umsetzen ist es dann so eine Geschichte. :roll:

Ich werde jetzt mal versuchen den NTC mit dem Arduino auszulesen. Mal sehen ob da überhaupt sinnvolle Werte herauskommen.
Das mit den Pulldown Widerständen werde ich direkt so versuchen.
73 de Sigi, DH1KLM

Benutzeravatar
DH1KLM
Offline
Beiträge: 145
Registriert: Sa Mär 26, 2016 9:12 pm

Re: FT 857 PA am Hermes

Beitrag von DH1KLM » Fr Dez 06, 2019 6:36 pm


Irgendwie will mich der Arduino ärgern, tut er auch. :evil:
Hab mit verschiedenen Pulldown Widerstandswerten experimentiert, bekomme die 3 Leitungen aber nicht beruhigt.
Es ändert sich zwar das Verhalten der Output Pins an den Shift Registern, aber es bleibt halt während der Initialisierung nicht auf 0.
Der OE Pin an den Shift Registern ist in der PA mit 5V fest verbunden. Diesen PIN vom Arduino steuern zu lassen ist also keine Option bzw.
wäre das mit einem Eingriff in die PA verbunden und das will ich eigentlich verhindern.

Was ist denn sonst noch so möglich? Habe mich schon rauf unter runter gelesen, kann aber nicht wirklich noch was sinnvolles finden.
Das Einzige was mir spontan eingefallen ist, wäre zuerst den Arduino mit Spannung zu versorgen und die PA (oder die Shift Reg.) erst
dann wenn der Arduino das Programm gestartet hat. Ist aber auch irgendwie nicht so das gelbe vom Ei.
73 de Sigi, DH1KLM

Benutzeravatar
dj1yr
Offline
Beiträge: 21
Registriert: Mo Apr 24, 2017 6:14 am

Re: FT 857 PA am Hermes

Beitrag von dj1yr » Di Dez 10, 2019 5:30 am


Hallo,

also, in der Startphase arbeitet er schon die "updateReg" ab, ohne vorher einmal den Status des BCD abzufragen, das kann man einfach ändern, indem man die updateReg an eine Bedingung hängt, welche in der loop gesetzt wird.
Ich könnte dir jetzt die den code hier rein schreiben, dabei lernst du aber nichts.

nur soviel, in der void loop wird gleich am Anfang eine Bedingung auf 1 gesetzt, diese Bedingung muss erfüllt sein damit die update Reg angesprungen werden kann, per if(Bedingung ==1){ };
bei der Deklaration der Bedingung, diese dann gleich auf Null setzten (Bedingung=0;) damit ein definierter Zustand da ist.

als nächstes kannst du dich einarbeiten in das setzten von einzelnen Bits in einem Byte, brauchst du für deine Lüftersteuerung, danach gehts weiter zum Timer, nicht delay() nutzen in dem Fall, da sonst der Arduino ja nichts anderes machen kann.

Antworten