Forum: Mikrocontroller und Digitale Elektronik XMega noch unbekannter HW-Bug


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Elektrolurch (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte einen seltsamen und noch unbekannten HW-Bug hier 
melden/vorstellen.

- Dieser Fehler tritt bei mir bei Timer TCE0 im PWM-Betrieb (ca. 71kHZ)
  auf (andere Timer nicht getestet)

=> Beim schreiben auf das .CCBBUF-Register mit einem Wert wird
   *sporadisch/sehr selten* der Wert des .PERBUF(low)-Registers
   verfälscht!!!
   Daraus folgend, wird eine(!) PWM-Periode verfälscht!

=> Das ist KEIN Programmier- oder Compilerfehler!
   (Habe das im Disassembly-Fenster nachgeschaut)

==> Workaround:
Wenn nach: TCE0.CCBBUF= uint16_t;
Das Register TCE0.PERBUFL gelesen wird (z.B. if(TCE0.PERBUFL != 
wert)...
tritt der Fehler nicht mehr auf!

- Prozessor ATXMega64A3U Rev. G
- Taktfrequenz: 32MHz (ext.), Ub= 3,3V
- 1 DMA-Kanal mit 430kByte/s und mehrere INT-Routinen aktiv

von Ingo L. (corrtexx)


Bewertung
0 lesenswert
nicht lesenswert
Elektrolurch schrieb:
> Wenn nach: TCE0.CCBBUF= uint16_t;
> Das Register TCE0.PERBUFL gelesen wird (z.B. if(TCE0.PERBUFL !=
> wert)...
> tritt der Fehler nicht mehr auf!
Hast du mal einen atomaren Zugriff auf das CCBBUF Register probiert?!

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@Elektrolurch (Gast)

>=> Das ist KEIN Programmier- oder Compilerfehler!
>   (Habe das im Disassembly-Fenster nachgeschaut)

Das sagen sie alle ;-)

Zeig mal den Quelltext und das Assemblerlisting.

>==> Workaround:
>Wenn nach: TCE0.CCBBUF= uint16_t;
>Das Register TCE0.PERBUFL gelesen wird (z.B. if(TCE0.PERBUFL !=
>wert)...
>tritt der Fehler nicht mehr auf!

>- Prozessor ATXMega64A3U Rev. G
>- Taktfrequenz: 32MHz (ext.), Ub= 3,3V
>- 1 DMA-Kanal mit 430kByte/s und mehrere INT-Routinen aktiv

Möglicherweise kommen sich mehrere Interrupts in die Quere. Oder 
gemeinsame Pufferregister werden doppelt benutzt. Da ist wahrscheinlich 
irgendwas nicht ganz atomar.

https://www.mikrocontroller.net/articles/Interrupt#Atomarer_Datenzugriff

von Ingo L. (corrtexx)


Bewertung
0 lesenswert
nicht lesenswert
Elektrolurch schrieb:
> => Das ist KEIN Programmier- oder Compilerfehler!
>    (Habe das im Disassembly-Fenster nachgeschaut)
Was das Disassembly dir nicht verrät ist, das ein Interrupt wärend des 
Schreibvorganges dazwischen funken kann. Dann nämlich gibts korrupte 
Daten wie du schon gemerkt hast. Der Compiler kann nichts dafür, der 
arme AVR auch nicht. Schuld ist wie so oft der Programmierer der den 
atomaren Zugriff auf Register > 8Bit auf einem 8Bit Controller vergisst.

von Peter D. (peda)


Bewertung
2 lesenswert
nicht lesenswert
Elektrolurch schrieb:
> => Beim schreiben auf das .CCBBUF-Register mit einem Wert wird
>    *sporadisch/sehr selten* der Wert des .PERBUF(low)-Registers
>    verfälscht!!!

Diese Problem ist auch von den classic AVRs bekannt. Die AVRs sind 
8Bitter, d.h. ein Schreibzugriff auf 16Bit ist nicht atomar. Er muß 
daher atomar gekapselt werden (atomic.h).
Grund ist, daß das temporäre high-Register von allen Timerregistern 
gemeinsam verwendet wird.
"The same temporary register is shared between all 16-bit registers 
within each 16-bit timer."

P.S.:
Eigentlich sollte dann aber das high-Byte verfälscht sein.

: Bearbeitet durch User
von Elektrolurch (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe vergessen zu erwähnen, dass der CCBBUF-Zugriff in einem 
HI-Level-Interrupt erfolgt - daher kann eigentlich kein anderer INT 
dazwischen funken.

>> Schuld ist wie so oft der Programmierer der den
atomaren Zugriff auf Register > 8Bit auf einem 8Bit Controller vergisst.

Ja das Problem kannte ich zu gut, ABER:
- der Zugriff erfolgt NICHT auf das Zählerregister, sondern auf ein 
BUFFER-Register!
- außerdem besitzt der Xmega extra eine Hardware um die 
16Bit-Peripherie
quasi-atomar ansprechen zu können!

* So, habe jetzt alle anderen INTs abgeschaltet - Fehler.
* Habe DMAs gecheckt: Kein schreiben auf PERBUF
* Habe Stack gecheckt, kein Überlauf.
* Das Programm läuft etwas über 120ms bis die Veränderung erkannt 
wird/passiert.

Ich finde die Stelle, an der das CCBUF verändert wird einfach nicht!

PS:
Das Programm ist sehr komplex und kommuniziert mit einer anderen 
Platine.
Deshalb ist es praktisch unmöglich, den nötigen Quelltext anzugeben.

von Volker B. (Firma: L-E-A) (vobs)


Bewertung
0 lesenswert
nicht lesenswert
Elektrolurch schrieb:

> Das Programm ist sehr komplex und kommuniziert mit einer anderen
> Platine.
> Deshalb ist es praktisch unmöglich, den nötigen Quelltext anzugeben.

Dann könnte man z.B. alle Teile, die vermutlich nichts mit dem Effekt zu 
tun haben, entfernen und so ein Minimalprogramm erzeugen, das den Fehler 
zeigt. Dieses ließe sich dann problemlos an Dritte weitergeben -- wenn 
es denn den beschriebenen Fehler aufweist...

Ansonsten können Dir vermutlich nur telepathisch begabte Menschen 
weiterhelfen...

Grüßle,
Volker.

von WaMin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Elektrolurch schrieb:
> Das Programm ist sehr komplex

Daher ist es nötig, dass du ein Minimalprogramm erzeugst, das das 
Verhalten reproduzierst.
Anders kann dir weder geholfen werden, noch der mögliche HW-Bug 
eingegrenzt werden.

von Pete K. (pete77)


Bewertung
1 lesenswert
nicht lesenswert
Schicke Deine Beobachtung doch an Microchip(AVR). Die können das 
bestimmt beurteilen und sind sicher dankbar für solche Hinweise.

: Bearbeitet durch User
von Soul E. (souleye) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Mit etwas Glück schicken sie Dir das zu Deiner Beobachtung passende 
Errata-Sheet. Was Du natürlich wegen NDA nicht weitergeben darfst ;-)

Das ist das Schöne an den Japanern. Da bekommt man die Errata wenigstens 
regelmässig unaufgefordert zugeschickt. Weitergeben darf man sie aber 
auch nicht.

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]
  • [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.