Hallo Leute, ich würde gerne den Code aus der AtmelAplication Note (AVR444) im AtmelStudio mittels GCC-Compiler zum Laufen bekommen. Könnte mir jemand für den folgenden Auszug aus dem Quelltext sagen, wordurch ich die IAR Befehle ersetzen muss? Im Grunde geht es um die Zeilen: __eeprom unsigned static int restartAttempts; sowie __disable_interrupt(); __watchdog_reset(); Danke euch Vollständige Funktion: static void ResetHandler(void) { __eeprom unsigned static int restartAttempts; // Temporary variable to avoid unnecessary reading of volatile register MCUSR. unsigned char tempMCUSR; tempMCUSR = MCUSR; MCUSR = tempMCUSR & ~((1 << WDRF) | (1 << BORF) | (1 << EXTRF) | (1 << PORF)); // Reset watchdog to avoid false stall detection before the motor has started. __disable_interrupt(); __watchdog_reset(); WDTCSR |= (1 << WDCE) | (1 << WDE); WDTCSR = 0x00; // Examine the reset source and take action. switch (tempMCUSR & ((1 << WDRF) | (1 << BORF) | (1 << EXTRF) | (1 << PORF))) { case (1 << WDRF): restartAttempts++; if (restartAttempts >= MAX_RESTART_ATTEMPTS) { // Do something here. E.g. wait for a button to be pressed. for (;;) { } }
Um dem Kompiler klarzumachen, das ein Byte im EEPROM landen soll, bzw, steht, geht in GCC sowas:
1 | unsigned static int restartAttempts __attribute__((section(".eeprom"))) = 0; |
Die Null am Ende kann dazu benutzt werden, um einmalig ins EEPROM geschrieben zu werden und landet im *.eep File des Projektes. Das Schreiben ins EEPROM macht man bei der avrlibc mit den dafür vorgesehenen Funktionen. Die Hilfe zu GCC gibt auch Tipps zur Portierung von IAR. Schau da mal rein.
:
Bearbeitet durch User
Danke Matthias, mittlerweile hab ich es fast soweit. Probleme macht nur noch die ISR. Habe an entprechnenden Stellen #pragma vector=WDT_vect __interrupt void WatchdogISR() auskommentiert und durch z.B. ISR(WDT_vect) ersetzt. Nur an der Stelle (ISR(ANALOG_COMPARATOR_ENABLE) meckert der Compiler noch mit der Meldung: Error: expected identifier or '(' before 'void' #ifdef ANALOG_COMPARATOR_ENABLE //#pragma vector=ANA_COMP_vect //__interrupt void OverCurrentISR() ISR(ANALOG_COMPARATOR_ENABLE) { DISABLE_DRIVING; for(;;) { ; } } #endif
Hans R. schrieb: > ISR(ANALOG_COMPARATOR_ENABLE) Da müßte ISR(ANALOG_COMP_vect) stehen, wenn ich nicht irre.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.