Ich verwende einen ATmega64A für mein Projekt mit ESP8266 und RFM75. Aber der ATmega64 hängt beim Einschalten und ich muss den Reset auf Low ziehen, damit mein Code funktioniert. Ich verwende einen externen 8-MHz-Quarz.
Ich habe alle VCC- und GND-Pins ordnungsgemäß mit 0,1-µF-Kondensatoren an jedem VCC-PIN verbunden. Der RESET-Pin wird mit 10-kΩ-Widerständen hochgezogen und 10-µF-Kondensatoren werden zwischen RESET und GND geschaltet (ich habe auch 0,1-µF-Kondensatoren ausprobiert).
Ich brauche eine Art Hilfe, um aus diesem Problem herauszukommen. Alle Kommentare oder Vorschläge werden geschätzt.
EDIT 1: Mein Schaltplan hier angehängt.
Ich habe den Spannungspegel am RESET PIN im eingeschalteten Zustand gemessen.
BEARBEITEN 2 : Nur der LED-Blinkcode funktioniert gut auf derselben Hardware. Ich habe dies so oft überprüft, indem ich die Versorgung ein- und ausgeschaltet habe. Ich denke, Code hat einige Probleme. Ich versuche es herauszufinden.
BEARBEITEN 2: Ich habe beim Start einen einfachen LED-Blinkcode angezeigt, bevor ich die ESP8266- oder RFM-Initialisierung starte. Ich habe auch eine Debug-Option in meinem Code. Als Debug-Terminal wird ATmega64 UART1 verwendet. Ich habe versucht, die LED vor der Debug-Initialisierung zu blinken. Led Blinking funktioniert wie ein Zauber! Ich habe eine Funktion im Debug-Terminal, um beim Start ein Banner zu drucken. Es gibt Datum, Uhrzeit der Kompilier- und Neustartursachen sowie eine Codeversion aus. Als ich die Funktion kommentiert habe, funktioniert mein Code einwandfrei. Ich habe viele Male auf verschiedenen Boards getestet, bis das Problem dann verschwunden ist. hier die funktion die ich entfernt habe.
static void PrintBanner(void)
{
unsigned char status = MCUCSR;
unsigned char moreThanOne = 0;
printf_P(PSTR(CMD_LINE_MSG_WELCOME));
printf_P(PSTR("Firmware: v%S [Compiled on "__DATE__" "__TIME__"]\r\nBoot cause: "), PSTR(APP_VERSION));
if(status & (1 << PORF))
{
printf_P(PSTR("Power On"));
MCUCSR &= ~(1 << PORF);
moreThanOne = 1;
}
if(status & (1 << EXTRF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("External"));
MCUCSR &= ~(1 << EXTRF);
moreThanOne = 1;
}
if(status & (1 << BORF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("Brown-out"));
MCUCSR &= ~(1 << BORF);
moreThanOne = 1;
}
if(status & (1 << WDRF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("Watchdog"));
MCUCSR &= ~(1 << WDRF);
moreThanOne = 1;
}
if(status & (1 << JTRF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("JTAG"));
MCUCSR &= ~(1 << JTRF);
moreThanOne = 1;
}
printf_P(PSTR(" Reset.\r\n"));
}
Was wäre die Ursache für das RESET-Problem des ATmega64 mit diesem Codestück? Liegt es daran, dass Daten aus dem Programmspeicher abgerufen werden, um über UART zu drucken? Trotzdem versuche ich, der Ursache für dieses Problem auf den Grund zu gehen. Wenn jemand eine Ahnung davon hat, werfen Sie bitte etwas Licht darauf. Danke.
Einige Hinweise:
AVRs haben Startverzögerungssicherungen für die Uhr (SUT1/SUT0 für ATmega64) – prüfen Sie, ob das Problem bei unterschiedlichen Einstellungen der Startverzögerung auftritt.
Verwenden Sie die Brownout-Erkennung (auch eine Sicherungseinstellung).
Versuchen Sie, am Anfang eine Busy-Wait-Schleife hinzuzufügen.
John Evans
SamGibson
Jack Creasey
SamGibson
Taher Kawantwala
Taher Kawantwala
Taher Kawantwala
Jack Creasey
Taher Kawantwala
SamGibson
Anonym
Taher Kawantwala
Anonym
Chris Stratton
DiBosco