Forum: Compiler & IDEs XMEGA64A3U - Prodsig-Bytes lesen


von wendelsberg (Gast)


Angehängte Dateien:

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

von Stefan (Gast)


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));

von Stefan (Gast)


Lesenswert?

ups ... bevor hier wieder die Post ab geht ...

typedef   unsigned char       tByte;

von N. G. (newgeneration) Benutzerseite


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

N. G. schrieb:
> warum muss isch jeder eigenen Datentypen definieren

Vermutlich, damit man sie zur Belustigung mit anderen mischen kann:


Stefan schrieb:
> tByte           ReadCalibration       (unsigned char index ) {

> typedef   unsigned char       tByte;


Ich liebe so etwas.

von Stefan (Gast)


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?

von wendelsberg (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.