Forum: Mikrocontroller und Digitale Elektronik Pinzuordnung in Array speichern


von starwatcher (Gast)


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!

von nixversteh (Gast)


Lesenswert?

Ich würde es ohne Array machen, z.B. so:
1
switch(x) {
2
    case 5: ... ;
3
    case F: ... ;
4
     .
5
     .
6
     .
7
    default: break;
8
    }

von wjunky (Gast)


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...

von starwatcher (Gast)


Lesenswert?

Danke für Eure Antworten.

Das hilft mir schonmal weiter.

von Stephan R. (wanderer)


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.

von Peter D. (peda)


Lesenswert?

Hier mal Funktionen, um ein Bit in einem Byte-Array zu setzen, löschen, 
wechseln oder testen:

http://home.tiscali.de/peterd/appl/soft/setibit/setibit.c51


Peter

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.