mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Code von IAR-Compiler für GCC convertieren


Autor: Hans R. (hansrichter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 (;;)
      {

      }
    }

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um dem Kompiler klarzumachen, das ein Byte im EEPROM landen soll, bzw, 
steht, geht in GCC sowas:
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
Autor: Hans R. (hansrichter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans R. schrieb:
> ISR(ANALOG_COMPARATOR_ENABLE)

Da müßte ISR(ANALOG_COMP_vect) stehen, wenn ich nicht irre.

Autor: Hans R. (hansrichter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, hast natürlich recht, danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.