XMEGA64A3U - Prodsig-Bytes lesen

Gast #5294293
Lesenswert?

Beim Lesen der Bytes zur Korrektur des internen Temperatursensors bin 
ich auf etwas fuer mich Unerklaerliches gestossen. Nach dem Umschalten 
des NVM-Controllers soll mit
1
  dummy0 = pgm_read_byte( 0x2e );
das Byte 0x2e gelesen werden, das erzeugt richtig (0x2e = 46d):
1
  ldi r30,lo8(46)
2
  ldi r31,0
3
/* #APP */
4
 ;  31 "read_prodsig.c" 1
5
  lpm r30, Z

Dagegen erzeugt
1
  dummy2 = pgm_read_byte( PRODSIGNATURES_TEMPSENSE0 );
(in iox64a3u.h: #define PRODSIGNATURES_TEMPSENSE0  _SFR_MEM8(0x002E))
zum Lesen desselben Bytes falsch
1
  in r30,0x2e
2
  ldi r31,0
3
/* #APP */
4
 ;  40 "read_prodsig.c" 1
5
  lpm r30, Z
und gibt dann fuer beliebige Adressen im Bereich Prodsignatures immer 
0x0b zurueck.
Kompiliert wird mit
1
avr-gcc -save-temps -c -Os -mmcu=atxmega64a3u read_prodsig.c

Was mache ich eventuell falsch?

wendelsberg
Angehängte Dateien:
Gast #5294329
Lesenswert?

tByte           ReadCalibration       (unsigned char index ) {
tByte result;

NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
result  = pgm_read_byte (index);
NVM_CMD = NVM_CMD_NO_OPERATION_gc;
return result;
}

ReadCalibration (offsetof(NVM_PROD_SIGNATURES_t,TEMPSENSE0));
ReadCalibration (offsetof(NVM_PROD_SIGNATURES_t,TEMPSENSE1));
Persönliche Seite #5294576
Lesenswert?

Hallo,

was machst du da mit _SFR_MEM8()?

Damit werden eigentlich Register im internen Adressraum beschrieben.
Also so was wie
1
#define PORTL _SFR_MEM8(0x42)
was dann auf
1
(*(volatile uint8_t*)0x42)
abgebildet wird.

Somit hast du dir das gebastelt:
1
dummy2 = pgm_read_byte(PRODSIGNATURES_TEMPSENSE0);
2
=> pgm_read_byte(_SFR_MEM8(0x002E))
3
=> pgm_read_byte(*(volatile uint8_t*)0x002E);
Damit liest du zuerst das Register an der Stelle 0x2E, also eben 
PRODSIGNATURES_TEMPSENSE0 aus und übergibst dessen aktuellen Wert (und 
eben nicht die Adresse) an die Funktion pgm_read_byte().

Was du wahrscheinlich willst dürfte sein:
1
pgm_read_byte(&PRODSIGNATURES_TEMPSENSE0);

Ich hoffe ich habe dein Anliegen richtig verstanden ;-)

Mit freundlichen Grüßen,
N.G.

PS: warum muss isch jeder eigenen Datentypen definieren, anstatt die aus 
<stdint.h> zu nehmen?
Gast #5294659
Lesenswert?

Stefan schrieb:
> ups ... bevor hier wieder die Post ab geht ...

N. G. schrieb:
> PS: warum muss isch jeder eigenen Datentypen definieren, anstatt die aus
> <stdint.h> zu nehmen?

Vielleicht weil man es sich nicht aussuchen kann, vielleicht weil man 
damit etwas ausrdücken kann, vielleicht nur aus Spaß.
Die neue Generation benutzt ja bevorzugt auto oder var.

Rufus Τ. F. schrieb:
> Vermutlich, damit man sie zur Belustigung mit anderen mischen kann:
> Ich liebe so etwas.

Aber Du weißt nicht!
Von der neuen Generation erwarte man ja nix anderes.
Aber ... Auch Du mein Freund rufus?
Gast #5295189
Lesenswert?

N. G. schrieb:
> was machst du da mit _SFR_MEM8()?

Das
1
#define PRODSIGNATURES_TEMPSENSE0 _SFR_MEM8(0x002E)
 stammt, wie geschrieben aus der iox64a3u.h, die mit dem Paket avr-libc 
installiert wurde, in diesem Fall mit der 
avr-libc_1%3a1.8.0+Atmel3.5.0-1_all.deb.
Wobei es sich mir nicht erschliesst, warum das dort nicht mit
1
#define PRODSIGNATURES_TEMPSENSE0 0x2e
 definiert wird.

N. G. schrieb:
> Was du wahrscheinlich willst dürfte
> sein:pgm_read_byte(&PRODSIGNATURES_TEMPSENSE0);
Ja, das war mein Fehler. Danke.

N. G. schrieb:
> PS: warum muss isch jeder eigenen Datentypen definieren, anstatt die aus
> <stdint.h> zu nehmen?
Mach ich nicht, ich schwoere! s.o. ;-)

wendelsberg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren