mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pinzuordnung in Array speichern


Autor: starwatcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: nixversteh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es ohne Array machen, z.B. so:
switch(x) {
    case 5: ... ;
    case F: ... ;
     .
     .
     .
    default: break;
    }

Autor: wjunky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: starwatcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Antworten.

Das hilft mir schonmal weiter.

Autor: Stephan R. (wanderer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.