closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

ADC Treiber mit ATXMega 384C3



pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 13:45   -  
Hallo rolf,

ich habe es jetzt mal komplett zu Fuß gemacht. Der ADC0 gibt einen sauberen Wert raus, aber nach der Meldung das die Messung abgeschlossen ist, starte ich die Messung vom ADC1, aber diese Messung wird NIE abgeschlossen. Entweder habe ich einen INIT-Fehler gemacht oder es ist das selbe Fehlerbild wie bei Deinem Treiber. Wenn ich alle Messungen gleichzeitig starte bekommme ich nur das IF-Flag vom ADC0 und somit auch nur diesen Wert

Vielleicht fällt Dir noch was auf:
Mein INIT-Code
Code
{ Main Program }
{$IDATA}
begin

//  INIT ADC
  ADCACTRLB     := $00;   // Auflösung auf 12bit und rechtsbündig
  ADCAREFCTRL   := $10;   // INTVCC / 1.6
  ADCAPRESCALER := $04;   // ADCAPRESCALER auf 64
  ADCACTRLA.0   := true;  // Enable ADCA

// INIT CH0
  DDRA.0:= 0;  // 0=EINGANG  1=Ausgang
  ADCACH0CTRL    := $01; // singleended
  ADCACH0MUXCTRL := $0; // MUX CTRL
  ADCACH0CTRL    := ADCACH0CTRL OR $01; // singleended
  ADCACH0CTRL.7  := true;    // Starte Messung

// INIT CH1
  DDRA.1:= 0;  // 0=EINGANG  1=Ausgang
  ADCACH1CTRL    := $01; // singleended
  ADCACH1MUXCTRL := $0; // MUX CTRL
  ADCACH1CTRL    := ADCACH1CTRL OR $01; // singleended

// INIT CH2
  DDRA.2:= 0;  // 0=EINGANG  1=Ausgang
  ADCACH2CTRL    := $01; // singleended
  ADCACH2MUXCTRL := $0; // MUX CTRL
  ADCACH2CTRL    := ADCACH2CTRL OR $01; // singleended

// INIT CH2
  DDRA.3:= 0;  // 0=EINGANG  1=Ausgang
  ADCACH3CTRL    := $01; // singleended
  ADCACH3MUXCTRL := $0; // MUX CTRL
  ADCACH3CTRL    := ADCACH3CTRL OR $01; // singleended

  EnableInts($87);                             // mandory for USB_ControlJob
...


Im Main-LOOP
Quote
...
//Messung abgeschlossen?
if ADCACH0INTFLAG.0 then
ADCACH0INTFLAG.0:=false; // Flag reset
LO(ww0):= ADCACH0RESL; // Ziehe Werte
HI(ww0):= ADCACH0RESH;
ADCACH1CTRL.7 := true; // Starte neue Messung
endif;

if ADCACH1INTFLAG.0 then
ADCACH1INTFLAG.0:=false; // Flag reset
LO(ww1):= ADCACH1RESL; // Ziehe Werte
HI(ww1):= ADCACH1RESH;
ADCACH2CTRL.7 := true; // Starte neue Messung
endif;

if ADCACH2INTFLAG.0 then
ADCACH2INTFLAG.0:=false; // Flag reset
LO(ww2):= ADCACH2RESL; // Ziehe Werte
HI(ww2):= ADCACH2RESH;
ADCACH3CTRL.7 := true; // Starte neue Messung
endif;

if ADCACH3INTFLAG.0 then
ADCACH3INTFLAG.0:=false; // Flag reset
LO(ww3):= ADCACH3RESL; // Ziehe Werte
HI(ww3):= ADCACH3RESH;
ADCACH0CTRL.7 := true; // Starte neue Messung
endif;
...


Hast Du noch eine Idee? Haben wir bei dem MUXCTRL vielleicht einen Denkfehler? Beim MUX bin ich mir mit dem CONFIG nicht so sicher.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 08.10.2019 - 13:47 by pvs-deck.
go down go up
Torsten offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Bad Doberan
Age: 54
Posts: 57
Registered: 11 / 2005
Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 14:51   -  
Hallo Thorsten,

vielleicht macht es Sinn den Wert für das MUX Register mal anzupassen, laut Datenblatt ATXMega C Seite 298, Tab. 25-11.

Torsten
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 17:29   -  
Hallo rolf,
Hallo Torsten,

worin liegt eigentlich hierbei der Sinn, wenn ich im "single-ended", zusätzlich das MUXPOS auf den ADCx angeben muß. Das ist mir nicht so ganz klar. Ich habe im Datenblatt zwar was gelesen, dass dies etwas mit dem EVENT-System vom XMEGA zu tun hat.

Wenn ich doch eigentlich den ADC1 einstelle und diesen zum messen starte, muß ich dann wirklich zusätzlich den MAXPOS auf ADC1 (0001) einstellen? Und wenn ja warum?

Auch wenn ich das MUXPOS anpasse:
Code
  ADCACH0MUXCTRL := $0; // MUX CTRL MAXPOS ADC0
  ADCACH1MUXCTRL := $4; // MUX CTRL MAXPOS ADC1
  ADCACH2MUXCTRL := $8; // MUX CTRL MAXPOS ADC2
  ADCACH3MUXCTRL := $C; // MUX CTRL MAXPOS ADC3


Macht es keinen Unterschied.

@Thorsten; Bei Dir laufen jetzt die ADC mit Messungen an den Externen Ports?

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 08.10.2019 - 17:53 by pvs-deck.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 18:21   -  
Hallo rolf,

bitte schaue Dir mal das Bild an.
Hier ist doch noch was anderes FAUL.

Ich bin mit einem PDI Debugger gerade an das System und habe den BREAK direkt auf das EnableInts, nach dem ADC-INITs gemacht. Aus irgendeinen Grund sind aber nur die Parameter vom ADC0 gesetzt worden. Das kann doch so eigentlich gar nicht sein. Oder?

Könnt es sein, das diese Bereiche aus irgendeinen Grund gesperrt sind? Ich meine irgendwo was gelesen zu haben, während der Messung.

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 08.10.2019 - 18:34 by pvs-deck.
go down go up
Torsten offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Bad Doberan
Age: 54
Posts: 57
Registered: 11 / 2005
Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 18:45   -  
Hallo Thorsten,
ich nutze vom PortA Pin 0,1,2 , wenn ich den ADC Treiber so konfiguriere bekomme ich nur vom A.0 ein Ergebnis der Rest ist null.
Was ist eigentlich der Unterschied zwischen der Konfiguration des Treibers ADCAchans[0..2] und [0..7]?
Ich habe mich heute mal versucht durch die Datenblätter und Applikationen zu arbeiten, so richtig habe ich auch nichts gefunden. Mir ist nur aufgefallen, dass es bei den ADCs der A Serie und der C Serie der XMegas Unterschiede gibt, was hier wohl keine Neuigkeit ist.
Mir fehlt leider in der Woche etwas Zeit um weiter nach einer Lösung zu suchen. Ich bin noch mit dem Aufbau der Hardware beschäftigt.

Torsten
go down go up
rh offline
Administrator
Avatar
Gender: male
Location: GERMANY  Germany
Age:
Posts: 5472
Registered: 03 / 2002
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 20:43   -  
Hallo Thorsten,
das Problem ist dass da mehr als 4 channels angesprochen werden [0..4]
Da scheint die C Version anderst zu funktionieren als die A Version.
Schleierhaft ist die Anzahl der zur Verfügung gestellten channel Register.
Bei der A Version sind das 4. Bei der C Version findet man hierzu keine
Angaben. Z.B. gibt es da mehr als 4 ??
ADCACH0CTR...ADCACH3CTR beim A.
Und beim C evtl.
ADCACH0CTR...ADCACH7CTR
Nix zu finden....

rolf
Cars don't buy cars -- Autos kaufen keine Autos.
Henry Ford
This post has been edited 1-times. Last edit: 08.10.2019 - 20:44 by rh.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 21:50   -  
Hallo rolf,

ich arbeite mich weiter vor. Mir fehlt aber etwas die Zeit.

Ich denke folgendes, ich kann die Register für die Chan1 bis Chan3 nicht beschreiben, da der C wahrscheinlich nur den Chan0 hat.

Also muß man wahrscheinlich über die "ADCACH0MUXCTRL" die Pins umschalten und für die einzelnen Pins messen und dann weiterschalten. Leider bekomme ich es nicht sauber ans laufen, aber es sieht besser aus. Irgendwo im Internet habe ich gelesen das man nach dem umschalten wohl einige Messungen verwerfen muss, da nach dem umschalten der ADC einen Moment braucht.

Ich will eine positive Spannung Messen, im "singleended" Mode gegen die interne INTVCC/1.6.
Kannst Du mir erklären, wie ich dann das Register ADCACH0MUXCTRL setzen muß? Dies ist mir trotz den Datenblättern nicht so klar.

Muss ich bei den Ports noch was anderes beim INIT anpassen als das für eine ADC Messung?
Code
  DDRA.0:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.1:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.2:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.3:= 0;  // 0=EINGANG  1=Ausgang


Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Torsten offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Bad Doberan
Age: 54
Posts: 57
Registered: 11 / 2005
Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 22:44   -  
Hallo Thorsten,
nach dem Umschalten auf den nächsten Kanal könnte vielleicht das Flush Bit im Control A Register helfen.

Torsten
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 08.10.2019 - 23:54   -  
Quote by Torsten

Hallo Thorsten,
nach dem Umschalten auf den nächsten Kanal könnte vielleicht das Flush Bit im Control A Register helfen.

Torsten

Hallo Torsten,

leider macht das keinen Unterschied, ob mit oder ohne Flush. Die C-Serie muss irgendeine Eigenheit haben, über die ich aber keine Doku finde. Ich befürchte langsam, dass bei diesem CHIP in einen anderen Modi gelesen werden muß.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 08.10.2019 - 23:55 by pvs-deck.
go down go up
Torsten offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Bad Doberan
Age: 54
Posts: 57
Registered: 11 / 2005
Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 09.10.2019 - 11:44   -  
Hallo,

ich habe mal eine Versuch unternommen. Das Ergebnis sieht nicht so schlecht aus. Ich hoffe, eine kleine Anregung für den ADC-Treiber geben zu können.
Es wird kein IRQ benutzt und ich prüfe auch nicht ob der ADC fertig ist. Ich wollte nur mal sehen ob
ich überhaupt ein Ergebnis bekomme. Die Funktion readADC macht nichts weiter als die Register
ADCAResLCH0 und ADCAResHCH0 zu lesen, den Code spare ich mir mal. Es gibt bei dem ADC auch einen SCAN-Mode bei dem dann mehrere Eingänge nacheinander abgearbeitet werden. Die Ergebnisse landen immer in den CH0-Ergebnisregistern. Ob der SCAN-Mode mit dem Freerun-Flag etwas zu tun hat, habe ich nicht verstanden.
Wenn man die ADC's in den verschieden ATXMega-Serien vergleicht, dann werden dort verschiedene Unteschiede in der Version mit und ohne Pipe's aufgelistet. Dazu gibt es auch eine kleine Doku die sich auf die Auswahl der Versionen bezieht, hatte Thorsten auch schon gefunden.
Weiterhin viel Erfolg bei der Arbeit.

Torsten

@ Thorsten und Rolf : Vielen Dank für die Unterstützung!

Code
 // Init ADC_A
  ADCACTRLA       := %00000001; // 2- CH0Start , 1-Flush, 0-Enable

  ADCACTRLB       := %00000000; // 12Bit

  ADCAREFCTRL     := %00000000;  // REF 1V

  ADCAEVCTRL      := %00000000;   // no events input

  ADCAPRESCALER   := %00000111; // clk DIV512

  //
  ADCACH0CTRL     := %00000001; // single-ended pos input signal
  //               //x0000xxx
  ADCACH0MUXCTRL  := %00000000; // pin-0
  //
  ADCACH0INTCTRL  := %00000000;




  EnableInts($87);
  loop
  // Start Messung
  //               //x0000xxx
  ADCACH0MUXCTRL := %00000000; // PortA pin-0
  mdelay(1);
  ADCACH0CTRL := ADCACH0CTRL or $80;  // Start
  mdelay(10);
  temp := readADC;
  writeln(SeroutD0,'ADC 0 '+ inttostr(temp));

  //               //x0000xxx
  ADCACH0MUXCTRL := %00001000; // PortA pin-1
  mdelay(1);
  ADCACH0CTRL := ADCACH0CTRL or $80;  // Start
  mdelay(10);
  temp := readADC;
  writeln(SeroutD0,'ADC 1 '+ inttostr(temp));


  //               //x0000xxx
  ADCACH0MUXCTRL := %00010000; // PortA pin-2
  mdelay(1);
  ADCACH0CTRL := ADCACH0CTRL or $80;  // Start
  mdelay(10);
  temp := readADC;
  writeln(SeroutD0,'ADC 2 '+ inttostr(temp));

  mdelay(1000);
  endloop;
This post has been edited 1-times. Last edit: 09.10.2019 - 12:00 by Torsten.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 09.10.2019 - 15:47   -  
Hallo Thorsten,

ich bin jetzt soweit das mit meinen Messungen ADC0, ADC1 und ADC2 sauber gemessen werden. Alles über den CH0.

Problem was ich jetzt nur noch habe, der ADC0 wird auf dem ADC3 gespiegelt, ich komme nicht an die richtigen Werte/Messungen vom ADC3.

Code
program X384_Test;
{ $NOSHADOW}
{ $WG}                     {global Warnings off}

Device = xmega384C3, VCC = 3.3;

Define_Fuses
  Override_Fuses;
  NoteBook               = D;
  COMport                = USB;
//   LockBits0 = [BLBB0, BLBB1, LB0, LB1];   // Sichere Boot und MainApp gegen das auslesen
  LockBits0     = [];                        // Für Debug ISP muss dies leer sein !!!
  FuseBits0     = [];
//  FuseBits1   = [ WDPER0, WDPER3 ];        // Watchdog   0:3 / 0110 512CLK 0.512s
  FuseBits1     = [];                        // Watchdog   leer nutze Hardwarewatchdog
// DEBUG   FuseBits2     = [BootRst];                    // Bootloader Einsprung, sonst springt er nicht in den Bootloader
  FuseBits2     = [];                    //
  // Brown-out is obligatory with USB !!!
  FuseBits5     = [BodLevel0,BodLevel2, BodAct0, EESAVE]; //  2.6V:

  ProgFuses     = true;
  ProgFlash     = TRUE;  // program Flash
  ProgEEprom    = false; // program EEprom sonst werden die Einstellungen überschrieben !!!
  AutoRelease   = true;  // Release Target    // Wichtig für Programmierung über UPP !!


//----------------------------

import SysTick,
       SerPortD0;

from System import Processes, longword, longint;

define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
Define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
//   OSCtype                = int2MHz, PLLmul = 16, prescB = 1, prescC = 1;        // 32MHz                          f
  // OSCtype                = int2MHz, PLLmul = 20, prescB = 1, prescC = 1, overdrive; // 40 MHz
  // OSCtype                = int2MHz, PLLmul = 24, prescB = 1, prescC = 1, overdrive; // 48 MHz
  OSCtype                = int2MHz, PLLmul = 31, prescB = 1, prescC = 1, overdrive; // 62 MHz

  SysTick                = 10;                 // msec
  StackSize              = 1024, iData;
  FrameSize              = 512, iData;
  Scheduler              = iData;

  
  SerPortD0              = 57600, Databit8,parNone, Stop1;
  RxBufferD0             = 255, iData;
  TxBufferD0             = 255, iData;
  SerCtrlD0              = PortB, 0, negative; {control line for RS485 driver}




implementation

{$IDATA}

{------------------------------------------------------------------------------}
{ Type Declarations }
type

{--------------------------------------------------------------}
{ Const Declarations }
const

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  st            : STRING[15];
  ww0            : word;
  ww1            : word;
  ww2            : word;
  ww3            : word;
  adPort         : byte;
  Zahl          : word;
  Zahl2          : word;
  xFor           : integer;
{--------------------------------------------------------------}


// DebugOut
procedure DebugOut( OutStr : String[100] );
var
 xc : integer;
begin
  Writeln(SerOutD0,OutStr);
end; //Ende Debug Out



{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin

DebugOut('InitADCA...');

//  INIT ADC
  ADCACTRLB     := $00;   // Auflösung auf 12bit und rechtsbündig
  ADCAREFCTRL   := $10;   // INTVCC / 1.6
//  ADCAREFCTRL   := %00000100;   // INTVCC/2

  ADCAPRESCALER := %00000111;   // ADCAPRESCALER auf 512
  ADCACTRLA.0   := true;  // Enable ADCA
  ADCAEVCTRL    := %00000000;   // no events input
  
// INIT CH0
DebugOut('InitPortpin...');
 // PIN0CTRLA:= %01011000;  // pullup und INVERT
  DDRA.0:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.1:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.2:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.3:= 0;  // 0=EINGANG  1=Ausgang

DebugOut('InitADCCH0...');
  ADCACH0CTRL    := $01; // singleended
  ADCACH0MUXCTRL := $0; // MUX CTRL MAXPOS ADC0
  ADCACH0CTRL    := ADCACH0CTRL OR $01; // singleended
  ADCACH0INTCTRL := %00000000;
  
  ADCACH0CTRL.7  := true;    // Starte Messung

  EnableInts($87);


mDelay(50);
DebugOut('Start loop...');
  loop
  
//Messung abgeschlossen?
if ADCACH0INTFLAG.0 then
    ADCACH0INTFLAG.0:=false;  // Flag reset

    // PORTPIN ADC0
     if    adPort = 0  then
       LO(ww0):= ADCACH0RESL;    // Ziehe Werte
        HI(ww0):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then
            ADCACTRLA.1   := true;  // flush
             inc(adPort);
              ADCACH0MUXCTRL := %00001000; // MUX CTRL MAXPOS ADC1 nächster Port
          xFor:=0;
         endif;

    // PORTPIN ADC1
     elsif adPort = 1  then
       LO(ww1):= ADCACH0RESL;    // Ziehe Werte
        HI(ww1):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);
          ADCACH0MUXCTRL := %00010000; // MUX CTRL MAXPOS ADC2 nächster Port

          xFor:=0;
         endif;

    // PORTPIN ADC2
     elsif adPort = 2  then
       LO(ww2):= ADCACH0RESL;    // Ziehe Werte
        HI(ww2):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);
          ADCACH0MUXCTRL := %00011000; // MUX CTRL MAXPOS ADC3 nächster Port

          xFor:=0;
         endif;

    // PORTPIN ADC3
     elsif adPort >= 3  then
       LO(ww3):= ADCACH0RESL;    // Ziehe Werte
        HI(ww3):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);
          ADCACH0MUXCTRL := %00000000; // MUX CTRL MAXPOS ADC0 nächster Port

          xFor:=0;
         endif;

     endif;
       // mDelay(50);
        //mDelay(200);
          ADCACH0CTRL.7  := true;    // Starte neue Messung

endif;

// TEST ADC Zeitverzögerung für Ausgabe ohne freilauf zu blockieren
if Zahl <= 65500 then
  Zahl:= Zahl +1;
else
  Zahl2:= Zahl2 +1;
endif;

if (Zahl >= 65500) AND (Zahl2 = 0) then
 Zahl2:=1;



endif;


if (Zahl2 >= 65500) AND (Zahl2 <> 0) then
      DebugOut('  ');
      DebugOut('-------------');
      st:= 'B0: ' + IntToStr(ww0 : 6);
      DebugOut(st);
      st:= 'B1: ' + IntToStr(ww1 : 6);
      DebugOut(st);
      st:= 'B2: ' + IntToStr(ww2 : 6);
      DebugOut(st);
      st:= 'B3: ' + IntToStr(ww3 : 6);
      DebugOut(st);

 Zahl:=0;
 Zahl2:=0;

endif;



  endloop;

end X384_Test.


Anbei mein Testprojekt, vielleicht kannst Du es mal mit Deinen Treiber abgleichen, so das wenigstens die ADCs 0 bis 2 mit Deinem Treiber laufen. Vielleicht fällt Dir auch noch was dabei auf.

Im Moment befürchte ich einen BUG im Chip für das lesen des ADC3, ich hab es an 3 Boards getestet, bei allen das selbe, der ADC0 wird auf den ADC3 gespiegelt.

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Torsten offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Bad Doberan
Age: 54
Posts: 57
Registered: 11 / 2005
Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 09.10.2019 - 18:42   -  
Hallo Thorsten,

wenn ich nichts übersehen habe, so müsste in deinem Code ein Fehler stecken.
Die Variable adPort muss doch bestimmt auf 0 gesetzt werden, in dem Bereich siehe Codebox. Es wird somit Port 0 vom ADC gelesen, das Programm speichert ihn dann in ww3.

Torsten

Code
// PORTPIN ADC3
     elsif adPort >= 3  then
       LO(ww3):= ADCACH0RESL;    // Ziehe Werte
        HI(ww3):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);    !!! hier könnte der Fehler stecken !!!
          ADCACH0MUXCTRL := %00000000; // MUX CTRL MAXPOS ADC0 nächster Port

          xFor:=0;
         endif;

     endif;
       // mDelay(50);
        //mDelay(200);
          ADCACH0CTRL.7  := true;    // Starte neue Messung
endif;
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1046
Registered: 02 / 2009
Homepage Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 10.10.2019 - 10:52   -  
Hallo Torsten,

ja, die folgende Zeile ist wohl beim bereinigen des Codes verlorengegangen :-D Danke

Code
  if adPort >=4 then adPort:=0;endif;



Jetzt gehen alle 4 PortPins, das war jetzt noch der letzte Schliff, hier nochmal der komplette TestCode

Code
program X384_Test;
{ $NOSHADOW}
{ $WG}                     {global Warnings off}

Device = xmega384C3, VCC = 3.3;

Define_Fuses
  Override_Fuses;
  NoteBook               = D;
  COMport                = USB;
//   LockBits0 = [BLBB0, BLBB1, LB0, LB1];   // Sichere Boot und MainApp gegen das auslesen
  LockBits0     = [];                        // Für Debug ISP muss dies leer sein !!!
  FuseBits0     = [];
//  FuseBits1   = [ WDPER0, WDPER3 ];        // Watchdog   0:3 / 0110 512CLK 0.512s
  FuseBits1     = [];                        // Watchdog   leer nutze Hardwarewatchdog
// DEBUG   FuseBits2     = [BootRst];                    // Bootloader Einsprung, sonst springt er nicht in den Bootloader
  FuseBits2     = [];                    //
  // Brown-out is obligatory with USB !!!
  FuseBits5     = [BodLevel0,BodLevel2, BodAct0, EESAVE]; //  2.6V:

  ProgFuses     = true;
  ProgFlash     = TRUE;  // program Flash
  ProgEEprom    = false; // program EEprom sonst werden die Einstellungen überschrieben !!!
  AutoRelease   = true;  // Release Target    // Wichtig für Programmierung über UPP !!


//----------------------------

import SysTick,
       SerPortD0;

from System import Processes, longword, longint;

define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
Define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
//   OSCtype                = int2MHz, PLLmul = 16, prescB = 1, prescC = 1;        // 32MHz                          f
  // OSCtype                = int2MHz, PLLmul = 20, prescB = 1, prescC = 1, overdrive; // 40 MHz
  // OSCtype                = int2MHz, PLLmul = 24, prescB = 1, prescC = 1, overdrive; // 48 MHz
  OSCtype                = int2MHz, PLLmul = 31, prescB = 1, prescC = 1, overdrive; // 62 MHz

  SysTick                = 10;                 // msec
  StackSize              = 1024, iData;
  FrameSize              = 512, iData;
  Scheduler              = iData;

  
  SerPortD0              = 57600, Databit8,parNone, Stop1;
  RxBufferD0             = 255, iData;
  TxBufferD0             = 255, iData;
  SerCtrlD0              = PortB, 0, negative; {control line for RS485 driver}




implementation

{$IDATA}

{------------------------------------------------------------------------------}
{ Type Declarations }
type

{--------------------------------------------------------------}
{ Const Declarations }
const

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  st            : STRING[15];
  ww0            : word;
  ww1            : word;
  ww2            : word;
  ww3            : word;
  adPort         : byte;
  Zahl          : word;
  Zahl2          : word;
  xFor           : integer;
{--------------------------------------------------------------}


// DebugOut
procedure DebugOut( OutStr : String[100] );
var
 xc : integer;
begin
  Writeln(SerOutD0,OutStr);
end; //Ende Debug Out



{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin

DebugOut('InitADCA...');

//  INIT ADC
  ADCACTRLB     := $00;   // Auflösung auf 12bit und rechtsbündig
  ADCAREFCTRL   := $10;   // INTVCC / 1.6
//  ADCAREFCTRL   := %00000100;   // INTVCC/2

  ADCAPRESCALER := %00000111;   // ADCAPRESCALER auf 512
  ADCACTRLA.0   := true;  // Enable ADCA
  ADCAEVCTRL    := %00000000;   // no events input
  
// INIT CH0
DebugOut('InitPortpin...');
 // PIN0CTRLA:= %01011000;  // pullup und INVERT
  DDRA.0:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.1:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.2:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.3:= 0;  // 0=EINGANG  1=Ausgang

DebugOut('InitADCCH0...');
  ADCACH0CTRL    := $01; // singleended
  ADCACH0MUXCTRL := $0; // MUX CTRL MAXPOS ADC0
  ADCACH0CTRL    := ADCACH0CTRL OR $01; // singleended
  ADCACH0INTCTRL := %00000000;
  
  ADCACH0CTRL.7  := true;    // Starte Messung

  EnableInts($87);


mDelay(50);
DebugOut('Start loop...');
  loop

  if adPort >=4 then adPort:=0;endif;

  
  
//Messung abgeschlossen?
if ADCACH0INTFLAG.0 then
    ADCACH0INTFLAG.0:=false;  // Flag reset

    // PORTPIN ADC0
     if    adPort = 0  then
       LO(ww0):= ADCACH0RESL;    // Ziehe Werte
        HI(ww0):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then
            ADCACTRLA.1   := true;  // flush
             inc(adPort);
              ADCACH0MUXCTRL := %00001000; // MUX CTRL MAXPOS ADC1 nächster Port
          xFor:=0;
         endif;

    // PORTPIN ADC1
     elsif adPort = 1  then
       LO(ww1):= ADCACH0RESL;    // Ziehe Werte
        HI(ww1):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);
          ADCACH0MUXCTRL := %00010000; // MUX CTRL MAXPOS ADC2 nächster Port

          xFor:=0;
         endif;

    // PORTPIN ADC2
     elsif adPort = 2  then
       LO(ww2):= ADCACH0RESL;    // Ziehe Werte
        HI(ww2):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);
          ADCACH0MUXCTRL := %00011000; // MUX CTRL MAXPOS ADC3 nächster Port

          xFor:=0;
         endif;

    // PORTPIN ADC3
     elsif adPort >= 3  then
       LO(ww3):= ADCACH0RESL;    // Ziehe Werte
        HI(ww3):= ADCACH0RESH;
        inc(xFor);
         if xFor >=50 then

            ADCACTRLA.1   := true;  // flush

         inc(adPort);
          ADCACH0MUXCTRL := %00000000; // MUX CTRL MAXPOS ADC0 nächster Port

          xFor:=0;
         endif;

     endif;
       // mDelay(50);
        //mDelay(200);
          ADCACH0CTRL.7  := true;    // Starte neue Messung

endif;

// TEST ADC Zeitverzögerung für Ausgabe ohne freilauf zu blockieren
if Zahl <= 65500 then
  Zahl:= Zahl +1;
else
  Zahl2:= Zahl2 +1;
endif;

if (Zahl >= 65500) AND (Zahl2 = 0) then
 Zahl2:=1;



endif;


if (Zahl2 >= 65500) AND (Zahl2 <> 0) then
      DebugOut('  ');
      DebugOut('-------------');
      st:= 'B0: ' + IntToStr(ww0 : 6);
      DebugOut(st);
      st:= 'B1: ' + IntToStr(ww1 : 6);
      DebugOut(st);
      st:= 'B2: ' + IntToStr(ww2 : 6);
      DebugOut(st);
      st:= 'B3: ' + IntToStr(ww3 : 6);
      DebugOut(st);

 Zahl:=0;
 Zahl2:=0;

endif;



  endloop;

end X384_Test.


@rolf; Kannst Du das mal mit Deinen Treiber vergleichen? Ansonsten packe diesen Code etwas abgewandelt für mein Projekt in eine extra Funktion.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Torsten offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Bad Doberan
Age: 54
Posts: 57
Registered: 11 / 2005
Private message
Subject: Re: ADC Treiber mit ATXMega 384C3  -  Posted: 10.10.2019 - 12:36   -  
Hallo,

bei dem Studium der Datenblätter ist mir aufgefallen, dass diese Art von ADC auch in anderen Serien der ATXMegas vorhanden ist.
Somit ist zu prüfen, ob der Treiber für diese Bausteine auch passend ist.

Torsten
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 14.10.2019 - 13:03