
Zitat von
DanielSan
... Ich habe den Eindruck, das der Controller zwischendurch neustartet ... Habt ihr eine Idee woran das liegen kann? ...
Das Problem mit ungewollten Resets kenne ich. Seit langem verwende ich daher unmittelbar nach der Portdefinition, noch vor dem Erlauben der Interrupts, eine markante Blinkroutine, siehe Code (ALLE programmrelevanten Zeilen aber viel Kommentar/Dokumentation gelöscht)
HTML-Code:
// =================================================================================
// === HAUPTProgramm ==============================================================
// Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
// Ausgabe des Identifizierungsstrings per USART
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main(void)
{
uint8_t i;
DDRB = 0b00011111; // siehe aktuell oben ...
PORTB = 0b00100000; // und Port/Pull Ups (1) aktivieren
DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
DDRD = 0b11110000; // -> siehe unter DDRB, sowie PD2,3 extInt
PORTD = 0b00001111; // Pull Ups aktivieren
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for(i=0; i<10; i++) // gLED auf PC5 i-fach blinken lassen
// ###>>> bevor Interrupts erlaubt sind, um ungewollte
// Resets u.ä. besser erkennen zu können
{
SetBit(PORTC, 5); // LED auf PC5 schalten EIN, HELL
waitms(3); // ... damit man kurze resets besser erkennt
ClrBit(PORTC, 5); // LED auf PC5 schalten AUS, Dunkel
waitms(97);
}
.................................
} // Ende main
// ================================================================================
/* ============================================================================== */
/* ============================================================================== */
/*### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !*/
void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
/* ============================================================================== */
// Auszug aus headerdatei:
#define SetBit(ADDR,BIT) ((ADDR) |= (1<<(BIT))) // Setzt Bit
#define ClrBit(ADDR,BIT) ((ADDR) &= ~(1<<(BIT))) // Löscht Bit
Das eindeutig identifizierbare Blinken nach einem Reset/Kaltstart hilft erstmal nix - aber man weiß dann sicher, dass es kam - und manchmal fällt einem etwas Kluges ein, wenn man sieht WANN es kommt . . . .
Als Grund für ungewollte Resets hatte ich schon falsche Portinitialisierungen, falsche Interruptinitialisierung, mikroskopische Kurzschlüsse etc. Aber ich glaube, das ist noch nicht die Liste aller Möglichkeiten.
Lesezeichen