Arduino+2X12 LCD zur Emulation einer defekten Kenwood HF-Rig-Anzeigeeinheit

Ich habe ein HF-Rig mit einer schlechten Display-Initialisierung (LC7582A-Treiber und benutzerdefiniertes LCD mit 9 numerischen Sieben-Segment-Anzeigen und einigen Symbolen, die insgesamt etwa 100 Segmente ergeben). Die Eingangspins des LCD-Treibers sind CE CLK und DATA. Ich entnehme dem Datenblatt, dass es ungefähr 105 Bits aus dem Datenstrom erwartet. Ich habe eine ungefähre Vorstellung in meinem Kopf, dass ich einen "Empfangspuffer" von ungefähr hundert Bits aufbauen muss, dann herausfinden und sortieren muss, welche Bits für die numerischen Anzeigesegmente sind, welche Bits für eine 10-Segment-Signalanzeige und die anderen Icons (AM, LSB, USB, TX, RX usw.) und einmal habe ich den Stream "dekodiert". leiten sie an einen LCD-Display-Puffer weiter, um sie später in ein generisches LCD- oder OLED-Display zu schieben. Ich fange an zu denken, dass ich dieses Projekt möglicherweise in zwei Schritten angehen muss: Bauen Sie ein System, um die Stream-Bits zu dekodieren und auszusortieren, und bauen Sie später, nachdem Sie das Stream-"Protokoll" kennen, das komplette System auf. Der Grund, warum ich dieses Rig bekam, war, mich dazu zu zwingen, endlich Arduino- oder Mikrocontroller-Programmierung zu lernen. Wenn mir jemand auf einige Referenzen (Skizzen usw.) verweisen kann, um mich in die richtige Richtung zu führen, oder einige Tipps geben kann, wäre ich sehr dankbar!Geben Sie hier die Bildbeschreibung ein

Kennen Sie schon C/C++?
Ich lerne noch.
Dieser Ham hat etwas Ähnliches gemacht, aber für ein anderes Radio und mit einem Cypress PSoC. ein Teil seines Codes wird angezeigt. 7l1wrk-1.cocolog-nifty.com/blog/2014/06/ic732-oled-453d.html
Die größte Hürde dabei ist das „Decodieren“ des Segmentdatenstroms. Ich kann nur daran denken, die 102 Bits in binärer Form anzuzeigen, vielleicht wie eine Diodenmatrix. und durch "Versuch und Irrtum", herumfummeln mit den Knöpfen des Radios (Eingabe von Testnummern für Funkfrequenz, Abklemmen der Antenne, in der Hoffnung auf eine Antwort auf dem "Signalmesser" usw.), während die Binäranzeige beobachtet wird. Irgendwelche Ideen zu einem praktischen 102-Bit-Binäranzeigesystem?
Nicht wirklich. Sie werden sie jedoch trotzdem in Gruppen von 8 behandeln, also nur Hexadezimalziffern über UART wie gewohnt.
Okay ich probier es aus.

Antworten (1)

Das klingt nach einem interessanten Projekt, um mit Arduino und MCUs zu spielen. Hoffe das ist nicht zu spät und du arbeitest noch an dem Projekt.

Wenn Sie ein Oszilloskop haben, möchten Sie vielleicht einen Blick auf die SCK- und Datenleitungen werfen. Gibt es einen CS- oder CE-Pin für die Chipauswahl? Überprüfen Sie auch die Spannungen an diesen Pins, um sicherzustellen, dass nichts brennt ...

Wenn Sie keinen Zugriff auf ein Oszilloskop haben, können Sie möglicherweise Arduino selbst und einen externen Interrupt verwenden. Sie erstellen im Grunde einen sehr einfachen Software-SPI-Slave, so etwas sollte es tun:

(Ich habe nicht versucht, diesen Code selbst zu kompilieren, möglicherweise müssen einige Anpassungen vorgenommen werden.)

//Connect your Data to the pinMISO.
int pinSCK = 7;
int pinMISO = 8;

//Variables used inside interrupt functions needs to be volatile
volatile uint8_t myByte = 0;
volatile uint8_t bitCounter = 0;

int8_t byteCounter = 0;

void setup() {
  pinMode(pinSCK, INPUT);
  pinMode(pinMISO, INPUT);

  //This tells Arduino to execute bitRead() every time the pinSCK goes from LOW to HIGH. In other works, it'll get executed every clock.
  attachInterrupt(pinSCK, bitRead, RISING);

  //Add some serial output so you can debug on screen and don't worry with the second part of you code for now.
  Serial.begin(115200);
}

//This function will be called every time the interrupt is triggered, it's important to keep it very simple to run fast!
void bitRead() {
  //Left shit one bit, this assume the communication is MSB first
  myByte <<= 1;

  //Append the read value of the pinMISO to our byte (it'll be 0 or 1). I think I need to cast to (uint8_t) as digitalRead returns an int.
  myByte |= (uint8_t)digitalRead(pinMISO);

  //Increment our bit counter
  bitCounter++
}

void loop() {
  if(bitCounter == 8) {
    Serial.print("New byte [ "); Serial.print(byteCount); Serial.print("] "); Serial.println(myByte, bin);

    //Increment our byte counter
    byteCounter++;

    //Reset myByte and bitCounter for the next byte
    myByte = 0;
    bitCounter = 0;

}

Dies ist nur ein Beispiel ... Ich gehe davon aus, dass die SCK-Geschwindigkeit langsam genug ist, damit der Code funktioniert, und dass die Kommunikation ein Vielfaches von 8 Bit verwendet. Ein Problem könnte hier sein, dass der "Druck" im Weg steht, sodass Sie möglicherweise einen Puffer mit Bytes erstellen und aus dem Puffer drucken müssen.

Sie könnten ein ähnliches Beispiel verwenden, um zu zählen, wie viele Bits Sie erhalten, und die richtige Puffergröße zu erstellen. Mit diesem Code sollten Sie in der Lage sein, den Bildschirm zu decodieren und darüber nachzudenken, wie Sie den zweiten Teil schreiben, der auf dem Ersatzbildschirm gedruckt werden soll.

Abhängig von Ihrem Fall können Sie möglicherweise das AVR-Hardware-SPI als Slave verwenden. Aber das könnte etwas schwierig zu verstehen sein, wenn Sie gerade erst mit MCUs beginnen. Schauen Sie sich diese Seite an: http://www.gammon.com.au/forum/?id=10892&reply=1#reply1

Viel Glück!

Vielen Dank für die sehr guten Tipps. Ich werde etwas mit dem Zielfernrohr herumschnüffeln.