[AVR] Pins über Array ansteuern

OP #542341
Lesenswert?
• ▲
▼
Hallo,

wir haben zur Zeit das Problem, dass wir in unserem Code dynamisch auf 
Pins zugreifen können müssen.
So wie es jetzt ist überprüfen wir mit nem relativ großen switch-case 
den anzusteuernden Index und greifen dann von Hand auf Port* und DDR* zu 
was den Code unnötig aufbläht.
Um das zu optimieren bräuchten wir ein Array in dem die IO-Adressen der 
Ports stehen, so dass man über einen Index die Adresse auslesen kann und 
dann auf der Adresse die Daten ausgeben kann.
Die Port*-Defines bekommen wir irgendwie nicht so in einem Array 
gespeichert, dass wir danach auf die Ports zugreifen können. Gibt es da 
irgendwelche Tricks über Pointer/Dereferenzierung oder müssen wir die 
kompletten Adressen für alle Controller von Hand in eine Liste 
eintragen?

Grüße,
Chris
#542371
Lesenswert?
• ▲
▼
Da die gängige Methode mit gcc einen Port in eine Funktion
hinein zu übergeben darin besteht, einen Pointer an die
Funktion zu übergeben
1
  void foo( uint8_t* Port )
2
  {
3
    *Port = ( 1 << 5 );    // setze Bit 5 an welchem Port auch immer
4
  }
5

6
  int main()
7
  {
8
    foo( &PORTB );
9
  }

müsste das eigentlich auch mit einem Array aus Pointern klappen.
Ich kanns hier nicht ausprobieren, aber irgendwas in der Art:
1
  int main()
2
  {
3
    uint8_t* Ddrs[]  = { &DDRB,  &DDRC,  &DDRD };
4
    uint8_t* Ports[] = { &PORTB, &PORTC, &PORTD };
5

6
    Ddrs[1] = 0xFF;    // DDRC auf Output schalten
7
    Ports[1] = 0xFF;   // PORTC komplett auf 1
8
  }

Wie gesagt: Ich kanns hier nicht testen.
Was habt ihr denn so ausprobiert?
OP #542679
Lesenswert?
• ▲
▼
Karl heinz Buchegger wrote:
>
1
>   int main()
2
>   {
3
>     uint8_t* Ddrs[]  = { &DDRB,  &DDRC,  &DDRD };
4
>     uint8_t* Ports[] = { &PORTB, &PORTC, &PORTD };
5
> 
6
>     Ddrs[1] = 0xFF;    // DDRC auf Output schalten
7
>     Ports[1] = 0xFF;   // PORTC komplett auf 1
8
>   }
9
>

//EDIT:
Ignoriert das hier, volatile vergessen ;)

OLD
Haben das jetzt mal so probiert (nur die Arrays global statt lokal) und 
da gibt der Compiler folgenden Fehler zurück:
"../main.c:9: warning: initialization discards qualifiers from pointer 
target type"

Hat da jemand eine Idee?

Ansonsten müsste beim Zugriff doch noch ein * vor das Ddrs[1] / 
Ports[1]?

Gruß,
Chris
#542689
Lesenswert?
• ▲
▼
Christian Illy wrote:
> Karl heinz Buchegger wrote:
>>
1
>>   int main()
2
>>   {
3
>>     uint8_t* Ddrs[]  = { &DDRB,  &DDRC,  &DDRD };
4
>>     uint8_t* Ports[] = { &PORTB, &PORTC, &PORTD };
5
>> 
6
>>     Ddrs[1] = 0xFF;    // DDRC auf Output schalten
7
>>     Ports[1] = 0xFF;   // PORTC komplett auf 1
8
>>   }
9
>>
>
> Haben das jetzt mal so probiert (nur die Arrays global statt lokal) und
> da gibt der Compiler folgenden Fehler zurück:
> "../main.c:9: warning: initialization discards qualifiers from pointer
> target type"
>
> Hat da jemand eine Idee?

Das ist das volatile das ich vergessen habe:

  volatile uint8_t* Ddrs[] = { &DDRB, &DDRC, &DDRD };

Ditto für das andere Array

> Ansonsten müsste beim Zugriff doch noch ein * vor das Ddrs[1] /
> Ports[1]?
Ja, klar. Ist im Eifer des Gefechts passiert.
Sorry

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.