Hilfe beim Verbinden von benutzerdefiniertem ATMega328PB mit seriellem FTDI

Ich habe diese ATMega328PB- Schaltung gebaut. SchemaEs läuft mit 3,3 V von einer 1,5-V-Batterie mit Booster und 8 MHz von einem externen Resonator ( CSTCE8M00G52A-R0 ).

Mit USBTinyISP habe ich Sicherungen gesetzt: Low-FF (für 8MHz), High-D8 (Boot Reset Vector Enabled), Ext-FD.

Mit VisualStudio und dem vMicro Plug-In habe ich ein Programm für UNO kompiliert. vMicro hat eine HEX-Datei meines Programms MIT einem Bootloader erstellt, den ich über ISP hochgeladen habe, und es läuft gut (LED blinken).

Mein Endziel ist es, einen angepassten 8-MHz-Bootloader zu erstellen, aber als Zwischenschritte versuche ich, mit FT231X FTDI ein Lebenszeichen über die serielle Schnittstelle zu erhalten und dann eine Skizze darüber hochzuladen.

Ich habe den 5-V-Jumper am FT231X durchtrennt und stattdessen den 3,3-V-Jumper angeschlossen. Dann verbunden (ohne Batterie):

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

Da das Standard-UBRR-Register des UNO-Bootloaders auf 16 MHz eingestellt ist, initialisiere ich es manuell und versuche, Daten über die serielle Schnittstelle zu übertragen.

#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
    }
}

Auf dem PC führe ich aus: avrdude -v -p m328p -c arduino -PCOM8 -b 9600 Die PorteinstellungenAvrdude erkennt den richtigen COM-Port, gibt aber Folgendes aus:

avrdude: stk500_getsync(): nicht synchron: resp=0x00

Die RX- und TX-LEDs am FT231X blinken nie.

Ich weiß nicht einmal, ob das Problem HW oder SW ist. Was mache ich falsch. Was kann ich noch versuchen?

avrdude dient zum Programmieren von Datenverkehr, nicht zur Verwendung mit einer Skizze, die textliche Hallo-Nachrichten ausdruckt. Sie sollten die USB-Seriell selbst mit einem Terminalprogramm testen und einen Loopback-Jumper installieren/entfernen. Erwägen Sie auch, "normalen" Arduino-Code auf Ihrem Board zu testen, anstatt Ihren "ursprünglichen" seriellen Code für die direkte Registrierung. Und wenn Sie benutzerdefinierten Code schreiben, wie Sie es mit einem eingebetteten GPIO-Ausgangsumschalter getan haben, teilen Sie uns mit, ob der GPIO am Ende umgeschaltet hat oder nicht, was darauf hinweist, dass das Programm hängen geblieben ist.

Antworten (2)

Beginnen Sie in einem solchen Fall mit einem funktionierenden Setup und arbeiten Sie sich dann Schritt für Schritt zu Ihrem endgültigen Setup vor. Wie:

  • Beginnen Sie mit 5 V, 16 MHz, vorhandenem Bootloader, Arduino IDE mit „Hello World“-Sketch.
  • Wechseln Sie zu 3,3 V (Laborversorgung) und 8 MHz. verifizieren (Baudrate wird halbiert)
  • Verwenden Sie Ihre FTDI-zu-Seriell-Schaltung. verifizieren.
  • Wechseln Sie zu Ihrer 3,3-V-Versorgung. verifizieren.
  • Wechseln Sie zur Verwendung Ihrer IDE und Ihres ISP. verifizieren.

Wenn der Schritt, der Dinge zum Schnabel bringt, immer noch zu groß ist, teilen Sie ihn in kleinere Schritte auf. Teile und herrsche! Dies ist die gleiche Technik, die ich verwende, um herauszufinden, warum ein Compiler bei einer Anwendung mit 30.000 Zeilen abstürzt. Dauert etwas, aber am Ende wird man es schaffen.

Wouter, FOA, vielen Dank für Ihre anhaltende Unterstützung für dieses Projekt. Auf meinem Board kann ich keine 5 V 16 MHz betreiben, es ist fest mit 3,3 V bei 8 MHz verdrahtet. Dort befindet sich eine Komponente, die bei 5 V brennt, und der Resonator hat 8 MHz. Also ich verstehe den ersten Schritt nicht.
Beschränken Sie sich nicht auf „Ihr Board“. Oder (vorübergehend) diese Komponente entfernen.
Es gibt existierende 8-MHz-Bootloader. Oder Sie können einen 16-MHz-Build verwenden, Sie müssen nur mit der Hälfte der vorgesehenen Baudrate damit kommunizieren.
@Chris Stratton - einverstanden. Der Minicore von MCUDude ermöglicht es, den "Kanal" für den Bootloader aus UART0 und UART1 auszuwählen.

Es funktioniert. Es war letztlich eine Kombination aus Umschalten zwischen TX und RX und Nutzung der halben Baudrate des Bootloaders auf dem PC. Also habe ich zuerst geladen: setup {Serial.begin(9600); aufrechtzuerhalten. Schleife {Serial.write ("Hallo"); }. hfuse=D9, Arduino Serial Monitor mit Baudrate 4800 geöffnet und endlich Ausdrucke bekommen. Dann habe ich 115200 Baud mit 57600 auf dem Monitor sowohl in TX als auch in RX mit einer Lese- / Schreibschleife überprüft. Dann habe ich einen UNO-Bootloader gebrannt (Standard-Baudrate 115200) und uno.upload.speed=57600 in boards.txt gesetzt, hfuse=D8 gesetzt, um den Bootloader auszuführen, und jetzt kann ich Programme über die serielle Schnittstelle hochladen.