¿Cómo conecto un microcontrolador al controlador LED M5480?

1

Estoy intentando conectar un Atmega328PB a un M5480 controlador LED / Relay. Soy consciente de que esta parte es obsoleta. La razón por la que estoy tratando de hacer esto es que tengo un sintonizador de antena que usa este chip. Un sintonizador de antena es básicamente una caja grande con relés, condensadores e inductores.

La forma original en que esto funcionó fue

Micro MC146805E2P. - > M5480 - > ULN2003A - > Relé de conmutación de un condensador o inductor.

Las entradas al ULN2003A tienen resistencias pullup. Las bobinas de relé no se accionan directamente, pero tienen una resistencia de 10 ohmios en serie

He quitado el microcontrolador original. También hubo unos 10k reistores pullup en las líneas "DATA IN" y "CLOCK IN" del M5480 que eliminé. Programé mi Atmega328PB para buscar una entrada de serie como "C00 ... 11D", donde 1 es un máximo lógico y 0 es un mínimo lógico. Esta entrada en serie controla lo que está escrito en el controlador de LED a través de bit banging.

El M5480 quiere que se escriba un bit alto, seguido de "35 bits de datos". Este controlador LED parece ser una versión reducida de un microcontrolador más grande, probablemente el mismo IC internamente. La "Tabla 3" que incluyen es increíblemente confusa, ya que "START" aparece dos veces por alguna razón.

Otro obstáculo aquí es que no hay un pin de reinicio en el M5480. He estado encendiendo manualmente el M5480 después del Atmega, lo que debería evitar cualquier tipo de ruido durante el inicio del microcontrolador que causa problemas. ¿Hay algún truco para "sincronizar" el microcontrolador con el M5480 en ausencia de un pin de reinicio?

No hay nada en la hoja de datos de M5480 sobre el estado en el encendido, pero no debe eliminar ninguna corriente, ya que todas las entradas ULN2003A se mantienen altas en el encendido.

Hasta ahora he podido activar los relés, pero el problema es que no hay coherencia. Escribir los mismos bits dos veces en el M5480 hace que suceda uno de los siguientes:

  1. Aleteo de relé, donde todos los relés se mueven brevemente de su posición a otro.

  2. Los relés se activan y desactivan, aparentemente al azar.

Aquí hay algunos rastros de alcance de lo que estoy incorporando en los datos de los controladores LED & Reloj, el amarillo es la señal del reloj. El primero es todos ceros, el segundo tiene algunos bits establecidos.

Yaquíhayalgunasfotosdelaconfiguraciónfísicareal

AquíestáelcódigoqueestoyusandoenelAtmega328PB

#defineF_CPU16000000UL#define__STDC_FORMAT_MACROS#defineBAUD57600#include<string.h>#include<stdint.h>#include<stdio.h>#include<avr/io.h>#include<util/delay.h>uint64_tdriverState;voidm5480_clock_high(void){PORTC|=0x1;}voidm5480_clock_low(void){PORTC&=0xfe;}voidm5480_data_high(void){PORTC|=0x2;}voidm5480_data_low(void){PORTC&=0xfd;}voidm5480_delay(void){_delay_us(1500);}#defineDRIVER_STATE_BITS35voidwrite_m5480(void){uint64_tbit=0;m5480_clock_low();m5480_delay();m5480_data_high();m5480_delay();m5480_clock_high();m5480_delay();m5480_clock_low();m5480_delay();m5480_data_low();m5480_delay();for(;bit!=DRIVER_STATE_BITS;bit++){uint64_tbitmask=0x1;bitmask<<=bit;if(0x0!=(bitmask&driverState)){m5480_data_high();}else{m5480_data_low();}m5480_delay();m5480_clock_high();m5480_delay();m5480_clock_low();m5480_delay();}}#include<util/setbaud.h>voiduart_init(void){UBRR0H=UBRRH_VALUE;UBRR0L=UBRRL_VALUE;#ifUSE_2XUCSR0A|=_BV(U2X0);#elseUCSR0A&=~(_BV(U2X0));#endifUCSR0C=_BV(UCSZ01)|_BV(UCSZ00);/*8-bitdata*/UCSR0B=_BV(RXEN0)|_BV(TXEN0);/*EnableRXandTX*/}intuart_putchar(charc,FILE*stream){loop_until_bit_is_set(UCSR0A,UDRE0);UDR0=c;return0;}intuart_getchar(FILE*stream){loop_until_bit_is_set(UCSR0A,RXC0);/*Waituntildataexists.*/returnUDR0;}FILEuart_output=FDEV_SETUP_STREAM(uart_putchar,NULL,_FDEV_SETUP_WRITE);FILEuart_input=FDEV_SETUP_STREAM(NULL,uart_getchar,_FDEV_SETUP_READ);charcmdBuffer[256];unsignedcharcmdBufferIdx;charstate;#defineOUTSIDE_CMD0#defineREADING_CMD1voidreset_command(void){state=OUTSIDE_CMD;cmdBufferIdx=0;memset(cmdBuffer,0x0,sizeof(cmdBuffer));}intmain(void){reset_command();uart_init();stdout=&uart_output;stdin=&uart_input;driverState=0x0;state=OUTSIDE_CMD;write_m5480();PORTB=0x0;PORTC=0x0;DDRC=0x3;charc;while(1){PORTB^=0x20;fread(&c,sizeof(c),1,stdin);if(state==READING_CMD){if(c=='D'){if(cmdBufferIdx!=DRIVER_STATE_BITS){printf("Invalid length: %u\n", cmdBufferIdx);
        }else{
          driverState = 0x0;
          cmdBufferIdx = 0;
          uint64_t bitmask = 0x1;
          for(;cmdBufferIdx != DRIVER_STATE_BITS;cmdBufferIdx++){
            if( cmdBuffer[cmdBufferIdx] == '1' ) {
              driverState |= bitmask;
            }
            bitmask <<= 1;
          }

          write_m5480();
          puts("driver state: ");
          cmdBufferIdx = 0;
          bitmask = 0x1;
          for(;cmdBufferIdx != DRIVER_STATE_BITS; cmdBufferIdx++){
            if(0 != (bitmask & driverState)){
              putc('1', stdout);
            }else{
              putc('0', stdout);
            }
            bitmask <<= 1;
          }

          putc('\n', stdout);

        }
        reset_command();


      }else{
        cmdBuffer[cmdBufferIdx++] = c;
      }
    } else if (c == 'C') {
      state = READING_CMD;
    }



  }
}

¿Estoy cometiendo un error obvio aquí, o es posible que este controlador esté dañado y se esté comportando mal?

    
pregunta Eric Urban

1 respuesta

1
  

No hay nada en la hoja de datos de M5480 sobre el estado en el encendido

La hoja de datos dice:

  

Cuando la alimentación se aplica por primera vez al chip, un reinicio interno de encendido ENCENDIDO   se genera una señal que restablece todos los registros y todos los cierres.

  

Otro obstáculo aquí es que no hay un pin de reinicio en el   M5480

La hoja de datos dice:

  

En el estado bajo del reloj se genera una señal RESET   que borra todos los registros de desplazamiento para el siguiente conjunto de datos.

Si necesitaba un reinicio, configuraría los datos bajos y generaría más de 36 relojes.

  

Estoy cometiendo un error obvio aquí, o es posible que este controlador sea   ¿Solo dañado y portando mal? Dudo que esté dañado.

Ninguna de las anteriores.
Dudo que esté dañado.
Tu error no es obvio.

Su código no es fácil de seguir. La convención de nombres de variable no es muy clara.

Yo agregaría el tiempo de cero antes del for loop en la rutina write_m5480 () .

    
respondido por el Misunderstood

Lea otras preguntas en las etiquetas