AVR-Studio Bugs: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
Zeile 61: Zeile 61:
*  Simulator (AD Wandler). Beim manuellen Setzen des ADIF Bits in ADCSR, wird nicht die dazugehörige Interrupt Routine angesprungen.
*  Simulator (AD Wandler). Beim manuellen Setzen des ADIF Bits in ADCSR, wird nicht die dazugehörige Interrupt Routine angesprungen.


*  Kein Bug, eher Programmierfehler. Interrupt-Flags lassen sich nicht per Software setzen, sie lassen sich nur löschen und zwar indem man es setzt (!)
*  Kein Bug, eher Programmierfehler: Interrupt-Flags lassen sich nicht per Software setzen, sie lassen sich nur löschen und zwar indem man es setzt (!)


==AVR-Studio 4.09 (Build 338)==
==AVR-Studio 4.09 (Build 338)==

Version vom 17. Februar 2007, 04:38 Uhr

Einleitung

Das kostenlose AVR Studio von Atmel enthält einige Fehler. Falls euch zusätzliche Fehler bekannt sind, bitte hier hinzufügen.

Damit Fehler in einer der kommenden Versionen (hoffentlich) behoben werden, sollten Fehlerberichte ("Bug-Reports") zur jeweils aktuellen Version mit genauer Beschreibung zum Reproduzieren des Fehlers (evtl. mit Codebeispiel) auch an avr@atmel.com gesendet werden (in Englisch).

Das AVR-Studio-Forum bei avrfreaks wird ebenfalls von den AVR-Studio-Entwicklern "beobachtet". Gelegentlich finden sich inoffizielle Updates für AVR-Studio auf www.atmel.no/beta_ware.

AVR-Studio 4.12 RC1 (Build 450) und später

Simulation der 16-Bit Timer

AVRSimIOTimert16pwm1.DLL File Version: 1.0.0.10 Product Version: 1.0.0.2

Diese DLL wird zur Simulation der 16-Bit Timer in ATmega8/88/48/32 verwendet (wahrscheinlich in allen CPU's mit zwei Output Compare Units).

Der Fehler tritt im ATmega128 nicht auf, der einen erweiterten 16-Bit Timer hat und deswegen die AVRSimIOTimert16pwm2.DLL verwendet.

Fehler:

Mode  Timer/CounterMode                Fehlerbeschreibung
      of Operation
0     Normal                           kein Fehler
1     PWM, Phase Correct, 8-bit        kein Fehler
2     PWM, Phase Correct, 9-bit        kein Fehler
3     PWM, Phase Correct, 10-bit       kein Fehler
4     CTC                              kein Fehler
5     Fast PWM, 8-bit                  arbeitet wie Mode 1
6     Fast PWM, 9-bit                  arbeitet wie Mode 2
7     Fast PWM, 10-bit                 arbeitet wie Mode 3
8     PWM, Phase and Frequency Correct ignoriert ICR1, arbeitet wie Mode 0
9     PWM, Phase and Frequency Correct ignoriert OCR1A, arbeitet wie Mode 1
10    PWM, Phase Correct               ignoriert ICR1, arbeitet wie Mode 2
11    PWM, Phase Correct               ignoriert OCR1A, arbeitet wie Mode 3
12    CTC                              ignoriert ICR1, arbeitet wie Mode 4(OCR1A)
13    (Reserved)
14    Fast PWM                         ignoriert OCR1A, arbeitet wie Mode 2
15    Fast PWM                         ignoriert ICR1, arbeitet wie Mode 3

Ursache:

WGM13 wird total ignoriert und WGM12 nur für die Aktivierung von Mode 4 verwendet. Das ist kein einfacher Programmierfehler, der Rest ist unbegreiflicherweise gar nicht implementiert! Auch in der Build 472 immer noch falsch.

weitere Fehler:

  • 1. Wenn OCR1B = 0 ist, wird das OCF1B-Flag bei TCNT = 0 nicht gesetzt und der Interrupt somit nicht ausgeführt.
  • 2. Wenn OCR1A = OCR1B ist, wird manchmal der OCR1B-Interrupt vor dem OCR1A-Interrupt ausgeführt obwohl OCR1A die höhere Priorität hat.

ATmega88

  • Schreiben nach UCSR0C (Adresse 0xC2h) beschreibt ebenfalls UBRR0H (Adresse 0xC5h)

AVR-Studio 4.10 (Build 356)

ATMega8

  • Simulator (AD Wandler). Beim manuellen Setzen des ADIF Bits in ADCSR, wird nicht die dazugehörige Interrupt Routine angesprungen.
  • Kein Bug, eher Programmierfehler: Interrupt-Flags lassen sich nicht per Software setzen, sie lassen sich nur löschen und zwar indem man es setzt (!)

AVR-Studio 4.09 (Build 338)

AVR Studio :4, 9,0, 338 Platform :JTAG ICE Build :1, 0, 0, 32 Part :ATmega16 Build :91

  • 1. Beim Debuggen mit JTAG, wenn globale Struktur ohne typedef deklariert ist und Deklaration im Header-datei steht, zeigt AVR-Studio im Watch-fenster nicht.
  • 2. Variable foo mit __attribute__ ((section (".eeprom"))) wird mit SRAM-location angezeigt, obwohl richtig behandelt.

AVR-Studio 4.08 (Build 310)

ATtiny12

  • Int0 (Interrupt 0) wird durch PinB.2 (falsch) und nicht durch PinB.1 (richtig) ausgelöst (In Version 4.09 bereinigt)

ATtiny15

  • OCF1A-Flag in TIFR wird beim Ausführen des Interrupts nicht automatisch zurückgesetzt. Das führt dazu, dass die Interruptroutine sofort nach Beendigung wieder angesprungen wird obwohl inzwischen kein neuer Interrupt erfolgte. Abhilfe: Zurücksetzen des Flags per Programm in der Interrupt-Routine:
ldi temp, 0x40
out TIFR, temp
  • PINB.1 zeigt Signalwechsel obwohl laut DDRB.1 als Eingang programmiert. Festgestellt bei Verwendung der "output compare"-Funktion von Timer/Counter1.

AT902313 (und wahrscheinlich auch andere Devices)

Die Simulation des EEPROM-Beschreibens funktioniert nicht. Der Code scheint zwar fehlerfrei zu laufen, doch die Daten im EEPROM verändern sich nach dem Schreibbefehl einfach nicht.

Simulator (getestet mit AT90S8535)

Wird gerade im Einzelschritt Modus (F11) ein C Code mit einer if Verzweigung simuliert und in diesem Moment die Variable, die für die if Verzweigung entscheidend ist, von Hand geändert und dann der nächste Schritt simuliert, stürzt das AVR Studio mit der Meldung "Diese Anwendung wird aufgrund eines ungültigen Vorgangs geschlossen" ab.

Beispiel: if (dispmode == 2) {

Der gelbe Pfeil zeigt auf die Zeile; dispmode (vom Typ uint8_t) ist Null; dispmode wird zur "Watch 1" Liste hinzugefügt und dort wird die Variable von Hand in 2 geändert; dann wird der nächste Schritt (F11) simuliert -> Absturz des Programms

Timer des ATMEGAS128 wird nicht richtig simuliert

Es ist leider schon eine Ewigkeit aus, deshalb kann ich keine genaueren Angaben machen. Es gibt einen Modus, wo der Timer hinaufzählt. Hat er den höchsten Wert erreicht zählt er wieder hinunter. Im AVR-Studio änderte der Timer nie seine Zählrichtung.