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!
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 | }
|
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.