SREG beim ATMega88

(Firma: guloshop.de) #3109181
Lesenswert?

Matthias Sch. schrieb:
> Kleiner Tipp: Die Mega48/88/168/328 haben zwei Register (GPIOR1 und
> GPIOR2) die du als generelle Register für Flags o.ä. benutzen kannst.

Die Register hätte ich auch schon wieder fast vergessen. :-)

Werden die drei GPIOR eigentlich von Compilern für irgendwelche Zwecke 
genutzt, oder kann man sie als User bedenkenlos verwenden, um 
irgendwelche Daten zu speichern? Schneller als Stack-Zugriffe sind "in" 
und "out" ja allemal.
Gast #3109217
Lesenswert?

Markus Weber schrieb:
> Werden die drei GPIOR eigentlich von Compilern für irgendwelche Zwecke
> genutzt

AVR_gcc: Nein, werden sie nicht, solange du sie nicht explizit zuweist, 
zB. durch

#define gflags GPIOR0

Ich würde auch immer mit GPIOR0 loslegen, weil das eine Adresse < 0x20 
hat (bei Mega48/88/168/328).

Damit kann der Compiler SBI, CBI, SBIS, und SBIC verwenden. Reduziert 
Codegröße.
(Firma: matzetronics) #3109837
Lesenswert?

katastrophenheinz schrieb:
> Ich würde auch immer mit GPIOR0 loslegen, weil das eine Adresse < 0x20
> hat (bei Mega48/88/168/328).

Hehehe, und ich habe GPIOR0 vergessen. Sind also wirklich insgesamt 3 
von den Dingern:
0x1E GPIOR0 bit addressierbar
0x2A GPIOR1
0x2B GPIOR2

Jetzt wirds aber spannend. Wie legt man denn nun eine Variable da rein?
1
register volatile uint8_t mFlags asm("GPIOR0");
scheint jedenfalls nicht zu klappen.
IAR nimmt etwas wie
1
register volatile uint8_t mFlags @0x1e;
aber das geht ja bei AVR GCC nicht.
(Firma: matzetronics) #3109856
Lesenswert?

A. K. schrieb:
> Zeitumstellungsgeschädigt? Hatte katstrophenheinz doch geschrieben:
> #define mFlags GPIOR0

Das habe ich auch gelesen. Also etwas genauer: Die Frage ist, wie 
erkläre ich ein typedef oder ne union, um tatsächlich einzelne Flags 
darin anzusprechen.

Nehmen wir z.B. an, ich habe so etwas:
1
typedef struct motorFlags
2
{
3
  uint8_t motorStopped : 1;     //! Is motor stopped?
4
  uint8_t motorSynchronized: 1; //! Is motor synchronized? 
5
  uint8_t actualDirection : 2;  //! The actual direction of rotation.
6
  uint8_t desiredDirection : 1; //! The desired direction of rotation.
7
  uint8_t driveWaveform : 2;    //! The current waveform that should be produced.
8
} mFlags_t;
9
// Variable sieht dann so aus:
10
register volatile mFlags_t fastFlags asm("r9"); // direkt im Register
Wie packe ich so etwas nun in GPIOR0?

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