Ayuda para conectar un ATMega328PB personalizado mediante FTDI serie

Construí este circuito ATMega328PB . esquemasFunciona a 3,3 V con una batería de 1,5 V con refuerzo y 8 MHz con un resonador externo ( CSTCE8M00G52A-R0 ).

Usando USBTinyISP configuré fusibles: Low-FF (para 8MHz), High-D8 (Boot Reset Vector Enabled), Ext-FD.

Utilizando VisualStudio y vMicro plug-in compilé un programa para UNO. vMicro creó un archivo HEX de mi programa CON un gestor de arranque que cargué a través del ISP y funciona bien (el LED parpadea).

Mi objetivo final es hacer un gestor de arranque de 8 MHz personalizado, pero como pasos intermedios, estoy tratando de obtener una señal de vida en serie usando FT231X FTDI, y luego subir un boceto sobre él.

Corté el puente de 5v en FT231X y en su lugar conecté el puente de 3.3v. Luego conectado (sin batería):

ATmega328   FT321X
---------   ------
Vcc         Vcc 
GND         GND
GND         CTS
RST         DTR (over 0.1uF)
RxD         TX
TxD         RX

Dado que el registro UBRR predeterminado del cargador de arranque UNO está configurado para 16 MHz, lo inicializo manualmente e intento enviar datos a través de la serie.

#define myubbr (8000000/16/9600-1)
void setup()
{
    pinMode(6, OUTPUT);
    // Init serial
    UBRR0H = (unsigned char)(myubbr >> 8);
    UBRR0L = (unsigned char)myubbr;
    UCSR0A = 0;//Disable U2X mode
    UCSR0B = (1 << TXEN0);//Enable transmitter
    UCSR0C = (3 << UCSZ00);//N81
}

void loop()
{
    digitalWrite(6, HIGH);
    delay(100);
    digitalWrite(6, LOW);
    delay(100);

    char * str = "Hello World";
    while (*str) {
        while (!(UCSR0A & (1 << UDRE0)));
        UDR0 = *str++; //send the data
    }
}

En la PC ejecuto: avrdude -v -p m328p -c arduino -PCOM8 -b 9600 La configuración del puertoAvrdude reconoce el puerto com correcto pero da:

avrdude: stk500_getsync(): no sincronizado: resp=0x00

Los LED RX y TX del FT231X nunca parpadean.

Ni siquiera sé si el problema es HW o SW. Qué estoy haciendo mal. ¿Qué más puedo probar?

avrdude es para programar el tráfico, no para usar con un boceto que imprime mensajes de texto de saludo. Debe probar la serie USB por sí misma con un programa de terminal e instalar/quitar un puente de bucle invertido. También considere probar el código Arduino "normal" en su placa en lugar de su código de serie de registro directo "original". Y si escribe código personalizado como lo hizo con un conmutador de salida GPIO incrustado como lo hizo, díganos si el GPIO terminó alternando o no, lo que indica que el programa se atascó.

Respuestas (2)

En tal caso, comience con una configuración de trabajo y luego avance paso a paso hasta su configuración final. Como:

  • Comience con 5 V, 16 MHz, cargador de arranque existente, Arduino IDE con boceto 'hello world'.
  • Cambie a 3,3 V (suministro de laboratorio) y 8 MHz. verificar (la velocidad en baudios se reducirá a la mitad)
  • use su circuito FTDI-to-serial. verificar.
  • cambie a su suministro de 3.3V. verificar.
  • cambie a usar su IDE e ISP. verificar.

Si el paso que hace que las cosas tengan pico todavía es demasiado grande, divídalo en pasos más pequeños. ¡Divide y conquistaras! Esta es la misma técnica que utilizo para averiguar qué hace que un compilador se bloquee en una aplicación de 30k líneas. Lleva algo de tiempo, pero al final llegarás allí.

Wouter, FOA gracias por su continuo apoyo a este proyecto. En mi placa no puedo ejecutar 5v 16MHz, está cableado a 3.3v a 8MHz. Hay un componente allí que se quemará a 5v y el resonador es de 8MHz. Así que no entiendo el primer paso.
No te limites a 'tu tablero'. O (temporalmente) elimine ese componente.
Existen cargadores de arranque de 8 MHz. O puede usar una compilación de 16 MHz, solo tendrá que comunicarse con ella a la mitad de la velocidad de transmisión diseñada.
@Chris Stratton - de acuerdo. El mininúcleo de MCUDude permite elegir el "canal" para el cargador de arranque de UART0 y UART1.

Esta funcionando. En última instancia, fue una combinación de cambiar entre TX y RX y usar la mitad de la velocidad en baudios del cargador de arranque en la PC. Así que primero cargué: setup { Serial.begin(9600); } loop { Serial.write("Hola"); }. hfuse=D9, abrí Arduino Serial Monitor con una velocidad de transmisión de 4800 baudios y finalmente obtuve impresiones. Luego verifiqué 115200 baudios con 57600 en el monitor tanto en TX como en RX usando un bucle de lectura/escritura. Luego grabé un cargador de arranque UNO (velocidad de baudios predeterminada 115200) y configuré uno.upload.speed=57600 en boards.txt, configuré hfuse=D8 para ejecutar el cargador de arranque y ahora puedo cargar programas en serie.