getadc() bringt manchmal falsches Ergebnis

  • 1
  • 2
  • 3
  • 4
  • Page 3 of 4
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 13.09.2007 - 16:47  ·  #17
Hallo Carsten,

der Zeitverbrauch des SysTick lässt sich sehr schön im Simulator zeigen. Auf
jeden Fall sind das sehr wenige Zyklen.

rolf
E-labUser555
 
Avatar
 
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 16:10  ·  #18
Hallo,

ich habe ein ähnliches Problem mit dem ADCPort-Treiber. Die Werte der AD-Kanäle landen bei mir hier vertauscht. Szenario: Ich lasse drei Kanäle rotieren. Ich erhalte bei GetADC(1); GetADC(2); Werte die eigentlich an ADC3 gemessen werden. Der früher beschriebene Workaround funktioniert hier bei mir nicht, da mein Programm sehr komplex ist, und die Abfragen von GetADC zu unvorhersagbaren Zeitpunkten stattfinden.

Meine Frage ist jetzt: Verwendet GetADC(1); GetADC(2); ... GetADC(n); immer dieselben Register im Systick? D.h. werden die Werte solange in Registern gespeichert, bis ich Sie mit GetADC(x) abhole ?

Gibt es einen Bugfix inzwischen? Meine Version des Compilers ist: Compiler Revision 4.95.00

Sonst bleibt mir wahrscheinlich nur noch im onsystick eine Routine zu schreiben, welche in globales Array die getADC(x)-Werte speichert oder eben ohne den ADCPort-Treiber zu arbeiten und alles händisch in Assembler zu schreiben.

Hardware-Fehler schließe ich aus. Es wird ein Mega128 verwendet und programmiert wird mit dem ISP3-USB.

Grüße,

E-labUser
E-labUser555
 
Avatar
 
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 16:23  ·  #19
Ach noch was,

merkwürdigerweise zeigt bei mir SetADCfixed(true,1); beispielsweise keine Wirkung. ADC3 wird trotzdem noch gemessen.

Gruß,

E-labUser
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 18:11  ·  #20
Hallo,

also lt. Simulator und Demo ADCAVR werden die Werte für
jeden Kanal in einem eigenen RAM-Bereich gespeichert
(Register werden nie exklusiv für einen bestimmten Treiber "reserviert").

Test:
1. Frame Size muss auf $20 gesetzt werden
2. Kanäle 1..4 einstellen (z.B. 100, 200, 300, 400).
3. vor endloop; ein SetADCfixed(true,3); anfügen

Beim 1. Durchlauf zeigt er mir für jeden Kanal den
eigestellten Wert, ab dem 2. Durchlauf kommt bei Kanal
1,2,4 immer der obige Wert und nur Änderungen an Kanal 3
werden angezeigt. Änderungen an den anderen bewirken nichts.

Seit 4.95.00 gab es keine Bugfixes am ADC. Erst mit 4.97.10
wurde der ADC für den xMega erweitert. Lt. meinem obigen
Test hatte das jedoch keine negativen Auswirkungen auf den
"alten" ADC.

Tritt das Problem nur bei realer Hardware auf oder auch im Sim?
Beachtet, dass der AVRco die Kanäle 1,2,3, ... zählt und nicht
wie Atmel 0,1,2, ... ?
Falls beide Fragen = "ja" hilft wohl nur, ein möglichst kleines Demo
Programm an rh zu schicken (PM), das den Fehler im Sim zeigt.

Gruß
Gunter
E-labUser555
 
Avatar
 
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 18:57  ·  #21
Hallo,

Danke für die Antwort. Also wenn ich mein Programm im Simulator starte und _ADCBUFF in die Watches packe. Dann lassen sich die Kanäle separat mit dem ADC-Tool manipulieren und man sieht auch schön wie sich in _ADCBUFF[0], _ADCBUFF[1], _ADCBUFF[2] sich die Werte ändern. Auch wenn ich dann z.B. in meiner Hauptschleife value:=GetADC(3); als Watch im Simulator beobachte sieht man die Manipulation mit Reglern des ADCTools korrekt. Auch setADCFixed(true,1); verhindert eine Änderung am Watch value:=GetADC(3);

Also alles korrekt. Merkwürdig. Die Hardware ist es auf jeden Fall nicht. Ein Nebensprechen der ADC-Leitungen schließe ich definitiv aus, da ich weit voneinander entfernte Kanäle eingestellt habe und ich trotzdem den Effekt habe, den auch der Threadsteller festgestellt hat.

Ist es möglich von meinem Programm aus auf das System-Array _ADCBUFF zu zugreifen? Das würde mir schon mal weiter helfen.

Viele Dank und Gruß,

E-labUser
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 19:02  ·  #22
klar kann man zugreifen
value := _adcbuff; funktioniert!
E-labUser555
 
Avatar
 
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 19:10  ·  #23
Aha, ich hatte value:= _ADCBUFF[0]; probiert. Wie verstehe ich diese Systemvariable ? Wo sind die nächsten Kanäle dann zu finden ?
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: getadc() bringt manchmal falsches Ergebnis

 · 
Posted: 10.07.2010 - 19:16  ·  #24
schau mal ins ASM Listing!
_ADCBUFF ist ein word.
Was da genau gemacht wird habe ich noch nicht nachvollzogen.
Muss aber nach Label
SYSTEM.$INTERRUPT_TIMER0:
(dem Systick) zu finden sein
  • 1
  • 2
  • 3
  • 4
  • Page 3 of 4
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   123   137 · Page-Gen-Time: 0.032398s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI