XMEGA und READPRODUCTIONROW Probleme

  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 14.07.2020 - 17:54  ·  #1
Hallo Leute,

hat irgend Jemand mal erfolgreich die Funktion "ReadProductionRow()" mit dem AVRco benutzt?

Ich habe jetzt verschiedene Wege ausprobiert.

1. In der Main App:
Code
 bCalLow:= ReadProductionRow(word(ADCACAL0));
  bCalHigh:= ReadProductionRow(word(ADCACAL1));

  DebugOut('low:  '+ByteToHex(bCalLow));
  DebugOut('High: '+ByteToHex(bCalHigh)); 


Ergebnis ist immer:
low: 00
High: 00

2. Versuch über das Boot:


Code
{$EEPROM}
  eebCalLow[EEpromEnd - 7] : byte;     // 4089 ADC CalLow aus Boot
  eebCalHigh[EEpromEnd - 6]: byte;     // 4090 ADC CalHigh aus Boot


Code
// ADC Kalibrierung
 eebCalLow:= ReadProductionRow($0020);
  eebCalHigh:= ReadProductionRow($0021);



Und in der MainApp:

Code
{$EEPROM}
  eebCalLow[EEpromEnd - 7] : byte;     // 4089 ADC CalLow aus Boot
  eebCalHigh[EEpromEnd - 6]: byte;     // 4090 ADC CalHigh aus Boot


Code
   DebugOut('low:  '+ByteToHex(eebCalLow));
    DebugOut('High: '+ByteToHex(eebCalHigh));


Ich habe das Gefühl diese ReadProduktionRow Funktion hat einen Fehler.

Der ASM Code sieht wie folgt aus:
Code
                        .LINE     621
                        PUSH      _FRAMEPTR
                        PUSH      _FPTRHI
                        LDI       _ACCA, 00020h SHRB 8
                        LDI       _ACCB, 00020h AND 0FFh
                        ST        -Y, _ACCA
                        ST        -Y, _ACCB
                        .FRAME  2
                        .FRAME  0
                        CALL       SYSTEM.READPRODUCTIONROW
                        POP       _FPTRHI
                        POP       _FRAMEPTR

                        STS       PVS2018_GLOBAL.BCALLOW, _ACCA


Code
                        .LINE     622
                        PUSH      _FRAMEPTR
                        PUSH      _FPTRHI
                        LDI       _ACCA, 00021h SHRB 8
                        LDI       _ACCB, 00021h AND 0FFh
                        ST        -Y, _ACCA
                        ST        -Y, _ACCB
                        .FRAME  2
                        .FRAME  0
                        CALL       SYSTEM.READPRODUCTIONROW
                        POP       _FPTRHI
                        POP       _FRAMEPTR

                        STS       PVS2018_GLOBAL.BCALHIGH, _ACCA


Ich bin kein ASM Profi, liegt hier nicht ein Fehler vor?
Code
                        LDI       _ACCA, 00021h SHRB 8
                        LDI       _ACCB, 00021h AND 0FFh


Die Funktion fordert im AVRco ein WORD (in C nutze ich hier aber ein uint8_t (entspricht ein Byte) ), in dieser Funktion wird das Word geladen und 8 Bits nach rechts geschoben, also kann die Adresse $20, $21 nie genutzt werden! Da diese Adresse verschoben wird! Das ist doch ein BUG oder?

Ich teste das ganze mal mit:
Code
// ADC Kalibrierung
 eebCalLow:= ReadProductionRow($2000);
  eebCalHigh:= ReadProductionRow($2100);



Thorsten

NACHTRAG:
Nach der Änderung erhalte ich nun auch Werte, ich weiss zwar noch nicht ob diese richtig sind:
low: 0B
High: FF
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 14.07.2020 - 23:11  ·  #2
Hallo Thorsten,

nach SRB 8 und AND $FF steht im 16bit register R16/17 $0021.
Im AVRco Treiber wird die Production Row normalerweise nicht
gelesen. Die CAL Bytes werden beim RESET automatisch geladen
und an die entspr. Stelle geschrieben.
Wenn ich mich richtig entsinne muss dieser Speicher Bereich mittels
Z-Register und EIND gelesen werden.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 15.07.2020 - 13:38  ·  #3
Quote by rh

Hallo Thorsten,

nach SRB 8 und AND $FF steht im 16bit register R16/17 $0021.
Im AVRco Treiber wird die Production Row normalerweise nicht
gelesen. Die CAL Bytes werden beim RESET automatisch geladen
und an die entspr. Stelle geschrieben.
Wenn ich mich richtig entsinne muss dieser Speicher Bereich mittels
Z-Register und EIND gelesen werden.

rolf


Hallo rolf,

sind die Register H/L verdreht? Wenn nein, verstehe ich es nicht!

< HIGH > < LOW >
0000 0000 0000 0000
0000 0000 0010 0001 = $21 / Dual 33


Wenn ich jetzt ein SRB 8 mache, dann erhalte ich doch

0000 0000 0000 0000 und dann hilft auch kein AND $FF

< HIGH > < LOW >
0000 0000 0000 0000
AND
0000 0000 1111 1111
=
0000 0000 0000 0000


Oder entspricht das SRB eher dem ROR vom Pascal, dann würde es so aussehen

< HIGH > < LOW >
0000 0000 0010 0001 = $21 / Dual 33
SRB 8
0010 0001 0000 0000 = $2100 / Dual 8448
AND
0000 0000 1111 1111
=
0000 0000 0000 0000


Ändert aber am Ergebnis nichts???
Es bleibt "0"

Wenn ich das richtig verstehe, mit meiner Korrektur:

< HIGH > < LOW >
0010 0001 0000 0000 = $2100 / Dual 8448
SRB 8
0000 0000 0010 0001 = $21 / Dual 33
AND
0000 0000 1111 1111
=
0000 0000 0010 0001 = $21 / Dual 33


Da würde dann auch das AND $FF sinn machen.

Weiterhin muss ich Dich enttäuschen, die Werte werden nicht
automatisch geladen und verwendet. Eben scheinbar genau wie von Atmel beschrieben.

Ich habe mal wir folgt getestet:

Code
 bCalLow:= ReadProductionRow($2000);
  bCalHigh:= ReadProductionRow($2100);

   DebugOut('low:  '+ByteToHex(bCalLow));
    DebugOut('High: '+ByteToHex(bCalHigh));

   DebugOut('vor Init low:  '+ByteToHex(ADCACALL));
    DebugOut('vor Init high: '+ByteToHex(ADCACALH));
  
  ADCACALL :=bCalLow;
   ADCACALH :=bCalHigh;
  
   DebugOut('nach Init low:  '+ByteToHex(ADCACALL));
    DebugOut('nach Init high: '+ByteToHex(ADCACALH));


Die Ausgabe sieht wie folgt aus:
low: 0B
High: 00
vor Init low: 00
vor Init high: 00
nach Init low: 0B
nach Init high: 00


Also sind in den ADCACALL/ADCACALH erst nach dem beschreiben Werte vorhanden.

Wenn ich es bei dem ASM nicht richtig mit dem "SRB 8" verstanden habe, erkläre es mir bitte. Denn mit der "ReadProductionRow()" erhalte ich bei normaler Eingabe bei allen meinen XMEGAs "$00" zurück.

Thorsten
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 16.07.2020 - 09:41  ·  #4
Hallo Thorsten,

- Habe die Funktion readProductionCode im Simulator durchgesteppt. Sah alles gut aus.
- Richtig, kein auto load für ADCnCAL Werte, dass macht der AVRco Treiber. Siehe Listing
Code

5854   0C00                                    ; >> ADC_B Init <<
5855   0C00       E2E4                         LDI       _ACCCLO, ADCBCAL0
5856   0C01       27FF                         CLR       _ACCCHI
5857   0C02       E012                         LDI       _ACCA, 2
5858   0C03   931001CA                         STS       NVMCMD, _ACCA
5859   0C05       95C8                         LPM


- Dein gepostete Assembler code legt das High und Lowbyte der Adresse des Funktionsparameters auf dem frame.
Code

LDI       _ACCA, 00020h SHRB 8   // im ACCA steht jetzt 00h
LDI       _ACCB, 00020h AND 0FFh // in ACCB steht jetzt 20h
ST        -Y, _ACCA   // Highbyte auf dem Frame legen
ST        -Y, _ACCB  // Lowbyte auf dem Frame legen


- Bei einem XMEGA32A4 (ohne USB) lese ich übrigens mit dem nachfolgenden code Werte ungleich Null aus (siehe angehängtes Bild).

Code

program PRODUCTIONROW;

Device = xmega32A4, VCC=3.3;

Import xmegaSupport;

Define
  OSCtype        = int32MHz;
  StackSize      = 128, iData;
  FrameSize      = 128, iData;

Implementation
{$IDATA}

type
  tProdRow = record
    RCOSC2M  : byte;
    RCOSC2MA : byte;
    RCOSC32K : byte;
    RCOSC32M : byte;
    RCOSC32MA : byte;
    Reserved0 : byte;
    Reserved1 : byte;
    Reserved2 : byte;
    LOTNUM0 : byte;
    LOTNUM1 : byte;
    LOTNUM2 : byte;
    LOTNUM3 : byte;
    LOTNUM4 : byte;
    LOTNUM5 : byte;
    Reserved3 : byte;
    Reserved4 : byte;
    WAFNUM : byte;
    Reserved5 : byte;
    COORDX0 : byte;
    COORDX1 : byte;
    COORDY0 : byte;
    COORDY1 : byte;
    Reserved6 : byte;
    Reserved7 : byte;
    Reserved8 : byte;
    Reserved9 : byte;
    USBCAL0 : byte;
    USBCAL1 : byte;
    RCOSC48M : byte;
    Reserved10 : byte;
    Reserved11 : byte;
    Reserved12 : byte;
    ADCACAL0 : byte;
    ADCACAL1 : byte;
    Reserved13 : byte;
    Reserved14 : byte;
    ADCBCAL0 : byte;
    ADCBCAL1 : byte;
    Reserved15 : byte;
    Reserved16 : byte;
    Reserved17 : byte;
    Reserved18 : byte;
    Reserved19 : byte;
    Reserved20 : byte;
    Reserved21 : byte;
    Reserved22 : byte;
    TEMPSENSE0 : byte;
    TEMPSENSE1 : byte;
    DACA0OFFCAL : byte;
    DACA0GAINCAL : byte;
    DACB0OFFCAL : byte;
    DACB0GAINCAL: byte;
    DACA1OFFCAL : byte;
    DACA1GAINCAL : byte;
    DACB1OFFCAL : byte;
    DACB1GAINCAL : byte;
    Reserved23 : byte;
    Reserved24 : byte;
    Reserved25 : byte;
    Reserved26 : byte;
    Reserved27 : byte;
    Reserved28 : byte;
    Reserved29 : byte;
  end;

  tBytePointer = pointer to byte;

var
  prodRow : tProdRow;


procedure dumpProdRow;
var
  p : pointer to byte;
  i : word;
begin
  p := tBytePointer(@prodRow);
  for i := 0 to sizeof(tProdRow) do
    p^++ := readProductionRow(i);
  endfor;
end;


begin
  dumpProdRow;
  loop
  endloop;
end.
Attachments
XMEGA und READPRODUCTIONROW Probleme
Filename: prodRow.png
Filesize: 28 KB
Title:
Download counter: 192
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 16.07.2020 - 23:16  ·  #5
Hallo Thomas,

Asche auf mein Haupt. Ein Calibrate der ADCs muss doch passieren.
Dies geschieht jedoch automatisch nach dem Import von ADCA/ADCB.
Ich hatte das doch ganz vergessen. Ist auch schon wieder Jahre her.
Der User braucht sich deshalb nicht darum zu kümmern.
Ähnliches gilt auch für das USB und andere.......
Sorry für mein Blödsinn weiter oben.

Warum Thorsten daran rumschraubt ist mir trotzdem nicht klar....

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 17.07.2020 - 10:18  ·  #6
Quote by rh

Hallo Thomas,

Asche auf mein Haupt. Ein Calibrate der ADCs muss doch passieren.
Dies geschieht jedoch automatisch nach dem Import von ADCA/ADCB.
Ich hatte das doch ganz vergessen. Ist auch schon wieder Jahre her.
Der User braucht sich deshalb nicht darum zu kümmern.
Ähnliches gilt auch für das USB und andere.......
Sorry für mein Blödsinn weiter oben.

Warum Thorsten daran rumschraubt ist mir trotzdem nicht klar....

rolf


Hallo rolf,

weil Dein Treiber unter dem XMEGA384C3 noch immer nicht funktioniert. Also muß ich es zu Fuß machen. Leider ;-)

Thorsten
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 17.07.2020 - 14:11  ·  #7
Quote

Der User braucht sich deshalb nicht darum zu kümmern.


Super. Ich freue mich darüber, weil ich den ADC Treiber verwende und mir damals keine Gedanken über Kaliebrierwerte gemacht habe. Den negativen offset, wie im Datenblatt angegeben, habe ich damals berücksichtigt. Diesen muss man manuell handhaben.

Danke Thorsten für den Thread.
Hast du zum Auslesen der roduction row noch Fragen?

Gruß
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 17.07.2020 - 14:55  ·  #8
Quote by Thomas.AC

Quote

Der User braucht sich deshalb nicht darum zu kümmern.


Super. Ich freue mich darüber, weil ich den ADC Treiber verwende und mir damals keine Gedanken über Kaliebrierwerte gemacht habe. Den negativen offset, wie im Datenblatt angegeben, habe ich damals berücksichtigt. Diesen muss man manuell handhaben.

Danke Thorsten für den Thread.
Hast du zum Auslesen der roduction row noch Fragen?

Gruß

Hallo Thomas,

vielen Dank für Deine Informationen. Trotzdem erhalte ich mit der normalen Funktion


Code
 bCalLow:= ReadProductionRow($20);
 bCalHigh:= ReadProductionRow($21);

oder

Code
 bCalLow:= ReadProductionRow(word(ADCACAL0));
  bCalHigh:= ReadProductionRow(word(ADCACAL1));


bei allen meinen XMEGAs 384C3 immer "0" als Rückgabe, aber die Serien haben Abweichungen. Das macht sich bei einer Widerstandsmessung um bis zu 3kOhm bemerkbar. Bei einem Messbereich von 0-32kOhm.

Alle Bauteile sind von den gleichen Rollen, nur die XMEGAs sind hier unterschiedlich.

Ich probiere mal Deinen Code aus, aber nicht im Simulator sondern am echten. Dann mal schauen,
ist vielleicht beim XMEGA384C3 die ADCACAL0/ADCACAL1 auf einer anderen Adresse als der im DSC?

Thorsten
  • 1
  • 2
  • 3
  • 4
  • Page 1 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: 16 · Cache Hits: 15   142   157 · Page-Gen-Time: 0.041316s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI