Hallo zusammen,
ich möchte gerne in einem Array verschiedene DDRs hinterlegen, weiß aber
nicht genau, wie ich das ganze hinbekommen kann. Ich stelle mir die
Struktur wie folgt vor:
1
constXXXXddr_array[]={DDRB,DDRB,DDRC,DDRD,DDRB};
2
constXXXXport_array[]={DDRB,DDRB,DDRC,DDRD,DDRB};
3
constuint8_tbit_array[]={1,2,2,2,5};
Kann mir sagen, welchen Typ ich statt XXXX eintragen muss und ob das
überhaupt möglich ist?
Ziel ist, in einer schleife verschiedene Bits an oder aus zu schalten,
z.B.
port_array[i] |= (1 << bitarray[i]);
in der iom8.h bin ich über diese Zeile gestolpert, die mich aber auch
nicht weitergebracht haben:
In C kann man keine Variablen an feste Adressen legen, wie du es
vorhast (in C++ sehr wohl).
Du kannst aber statt eines Feldes mit den Registern ein Feld
mit Zeigern auf die Register anlegen, und dann über diese
Zeiger zugreifen:
PINx, DDRx und PORTx sind reine Adressen, die im I/O-Bereich des AVR
liegen.
Also brauchst du als Datentyp theroretisch einen Zeiger auf nen
8bit-Wert, also uint8_t*
Bin mir aber grad nicht sicher, alle Versuche auf eigene Gefahr :-)
Vielen Dank für die Antwort!
ICh denke, ich werde mich mit dem Adressen Array zufrieden geben, das
scheint mir für meine Anwendung die beste Lösung zu sein.
C++ habe ich zwar auch mal zu Unizeiten ein wenig gelernt, aber da sind
die Grundlagen noch weiter weg, als in C :-)
Schönen Abend noch,
Martin
Martin schrieb:> Kann mir sagen, welchen Typ ich statt XXXX eintragen muss und ob das> überhaupt möglich ist?
schau doch einfach nach wie DDRA definiert ist und übernimm den typ.
da steht _SFR_IO8
jetzt such das Makro, und so weiter. Irgend wann steht da auch mal ein
Datentyp dran
auf jeden Fall darf das volatile nicht vergessen werden.
Abgesehen davon: wozu soll das gut sein?
Martin schrieb:> ICh denke, ich werde mich mit dem Adressen Array zufrieden geben, das> scheint mir für meine Anwendung die beste Lösung zu sein.
Wenn du schon so etwas machst, dann solltest du in deinem C-Buch über
Strukuren nachlesen
1
structportBit{
2
volatileuint8_t*ddr_register;
3
volatileuint8_t*port_register;
4
uint8_tpin;
5
};
und dir dann daraus die Arrays (oder Variablen) bauen
Sonst ist erstens das Pointerziel anstatt des Pointers "const", und
zweitens kann einem ohne das "volatile" der Optimizer da böse Streiche
spielen.
Andreas
Vielen Dank für eure weiteren Antworten.
Besonders der Kommentar von Karl Heinz hat mich noch mal weitergebracht.
Im Hinterkopf gab es wohl noch so etwas wie strukturen, warum ich in
diesem Zusammenhang nicht drauf gekommen bin, ist mir noch schleierhaft.
Dann füge ich noch mal einen DimValue hinzu und habe alles, was ich für
eine LED benötige zusammen :-)
Schönen Abend,
Martin