Arduino+2X12 LCD para emular una unidad de pantalla Kenwood HF defectuosa

Tengo un equipo de HF con un inicio de pantalla defectuoso (controlador LC7582A y LCD personalizado con 9 indicadores numéricos de siete segmentos y algunos íconos que hacen un total de 100 o más segmentos). Los pines de entrada del controlador LCD son CE CLK y DATA. Deduzco de la hoja de datos que espera alrededor de 105 bits del flujo de DATOS. Tengo una idea aproximada en mi cabeza de que tengo que construir un "búfer de recepción" de unos cien bits, luego averiguar y clasificar qué bits son para los segmentos del indicador numérico, qué bits son para un indicador de medidor de señal de 10 segmentos y los demás iconos (AM, LSB, USB, TX, RX, etc.) y una vez que he "descifrado" el stream. páselos a un búfer de pantalla LCD para luego insertarlos en una pantalla LCD u OLED genérica. Estoy empezando a pensar que podría tener que abordar este proyecto en dos pasos: construya un sistema para decodificar y clasificar los bits del flujo y luego, después de conocer el "protocolo" del flujo, construya el sistema completo. La razón por la que obtuve este equipo fue para obligarme a aprender finalmente Arduino o la programación de microcontroladores. Si alguien puede señalarme algunas referencias (bocetos, etc.) para ayudarme a comenzar en la dirección correcta, o darme algunos consejos, ¡realmente lo agradecería!ingrese la descripción de la imagen aquí

¿Ya conoces C/C++?
Todavía estoy aprendiendo.
Este Ham hizo algo similar pero para una radio diferente y usando un Cypress PSoC. se muestra parte de su código. 7l1wrk-1.cocolog-nifty.com/blog/2014/06/ic732-oled-453d.html
El obstáculo más difícil aquí es "decodificar" el flujo de datos del segmento. Solo puedo pensar en mostrar los 102 bits en forma binaria, tal vez como una matriz de diodos. y por "prueba y error", jugando con los botones de la radio (ingresando números de prueba para radiofrecuencia, desconectando la antena esperando una respuesta en el "medidor de señal", etc.) mientras observa la pantalla binaria. ¿Alguna idea sobre un sistema práctico de visualización binaria de 102 bits?
No precisamente. Sin embargo, vas a tratar con ellos en grupos de 8, así que solo dígitos hexadecimales a través de UART como de costumbre.
Está bien, lo investigaré.

Respuestas (1)

Eso suena como un proyecto interesante para jugar con Arduino y MCU. Espero que no sea demasiado tarde y que sigas trabajando en el proyecto.

Si tiene un osciloscopio, es posible que desee comenzar a echar un vistazo a las líneas SCK y Data, ¿hay algún pin CS o CE para la selección de chips? Verifique también los voltajes en esos pines para asegurarse de que nada se vaya a quemar ...

Si no tiene acceso a un osciloscopio, es posible que pueda usar el propio Arduino y una interrupción externa. Básicamente, creará un esclavo SPI de software muy simple, algo así debería funcionar:

(No he intentado compilar este código yo mismo, podría necesitar algunos ajustes)

//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;

}

Esto es solo un ejemplo... Espero que la velocidad de SCK sea lo suficientemente lenta para que el código funcione y que la comunicación esté usando un múltiplo de 8 bits. Un problema aquí podría ser que la "impresión" se interponga, por lo que es posible que deba crear un búfer de bytes e imprimir desde el búfer.

Podría usar un ejemplo similar solo para contar cuántos bits está obteniendo y crear el tamaño de búfer correcto. Con este código, debería poder decodificar la pantalla y comenzar a pensar cómo escribir la segunda parte para imprimir en la pantalla de reemplazo.

Dependiendo de su caso, es posible que pueda usar el SPI de hardware AVR como esclavo. Pero eso puede ser un poco difícil de entender si recién está comenzando con MCU. Echa un vistazo a esta página: http://www.gammon.com.au/forum/?id=10892&reply=1#reply1

¡Buena suerte!

Gracias por los muy buenos consejos. Voy a husmear un poco con el visor.