Pinzuordnung in Array speichern

Gast #879004
Lesenswert?
• ▲
▼
Hallo,
ich will meinen Mikrokontroller (ATMEGA32) dazu bringen, dass er z.B. 
wenn der Inhalt der Variable x z.B. eine 5 ist P1.0 Schaltet, bei einem 
F dann z.B. P2.3 und so weiter.
Ich könnte nun hingehen und das ganze mit if-Abfragen machen, das ist 
aber bei 30 Zuständen für x ein wenig umständlich.

Da ich die Pinzuordnung auch bei Bedarf einfach ändern möchte, will ich 
diese Zuordnungen irgendwie in einem Array oder ähnlichem speichern, 
also z.B. so
5 -> P1.0
F -> P2.3
...

hab Ihr eine Idee wir das realisieren kann??

Im Voraus schonmal vielen Dank für Ere Hilfe!
Gast #879048
Lesenswert?
• ▲
▼
benutzte indirect load / store mit x,y,z register (aus sicht des 
assemblers)

du brauchst dann keine tabelle sondern nur eine liste:
der wert gibt den index an, an dem in der liste die adresse des pins 
steht der geschrieben werden soll. das ganze würde dann irgendwie so 
aussehen:

x = woherAuchImmerDeinWertKommt();
addr = addressListe[x];
pin = addressListe[x+1];
v = ioreg[addr]
v |= pin; //pin ist maske (z.B. 0x40 für bit 6); pin set
v &= ~pin; //pin clear
ioreg[addr] = v;

wenn du nur ports damit ansteuern willst, brauchst du nur 2 bits für den 
port und 3 bits für das bit. dann kannst du addr und pin in einem byte 
speichern.

wenn sich das ganze allerdings nicht dynamisch ändern soll, würde ich 
vorschlagen das über #defines zu machen...
#880191
Lesenswert?
• ▲
▼
Da halte ich den Array tatsächlich für die bessere Lösung als 
switch-case. Letzteres erzeugt jede Menge Overhead in Programmgröße und 
Laufzeit (speziell Pipeline Hazards - wir sind hier ja auf RISC ;)) 
durch bedingte Sprünge.
Ersteres hat eine feste, kurze Laufzeit (Adressierung, Laden, fertig) 
und die Werte können notfalls auch einfach auf den EEPROM ausgelagert 
werden - könnte je nach Anwendung einige Vorteile bieten.

Auf switch-case würde ich nur zurückgreifen, wenn wenig cases 
berücksichtig werden müssen, dann würde nämlich für die Arrayumsetzung 
viel Speicher umsonst reserviert werden und der Code würde bei der 
switch-case Umsetzung nicht allzu sehr wachsen.

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