Hallo liebe Community,
meine Frage ist im Grunde sehr einfach mit einer switch-case loop
lösbar, ich würde es aber gerne eleganter implementieren, weil das
sicher geht:
Ich habe auf meinem µC (SAM4S) ein paralleles 4Bit Interface
eingerichtet: 4 Pins, nicht auf dem selben port, also z.B: PA7, PA8,
PC1, PC2 sollen möglichst einfach den eingegebenen (hexa-)dezimalen
funktionswert 0-15 bzw F abbilden.
Lägen die jetzt alle auf dem selben Port wäre das ja 1 zu 1 durch die
Bitmaske machbar. Nun frage ich mich aber, wie ich das (ähnlich
unkompliziert) hinbekomme ohne für jede Zahl einen case schreiben zu
müssen...?
Das selbe gilt dann auch fürs lesen an anderer Stelle (wenn ein Slave
die selben pins als Eingänge nutzt).
Fällt da jemandem auf die Schnelle ein Tip ein?
Beste Grüße
Peter schrieb:> ich würde es aber gerne eleganter implementieren
Definiere Eleganz!?
Für den einen ist eine Sprung-LookUp Tabelle elegant für den anderen
dagegen "Obfuscated Code".
>> solange die Bits der Port unterschiedlich sind, kannst das so machen.> Sonst musst halt gucken das du die Pins irgendwie noch verschiebst.
Das sieht so elegant aus wie ein Elefant beim Klöppeln.
https://de.wikipedia.org/wiki/Kl%C3%B6ppeln
Hallo zusammen,
wenn die Bits zusammen liegen, was sie sollten damit es effizient ist,
reicht lesen, verodern und schreiben...
Am Beispiel von Port B, Bits 4-7, val ist der dezimale Wert:
1
uint8_tval=14;
2
uint8_ttmp_bits=PINB;
3
4
tmp_bits|=(val<<4);
5
6
PORTB=tmp_bits;
Wenn in dem Beispiel die Bits 0-3 gesetzt werden müssten, dann wird das
Shiften weggelassen.
Viele Grüße!
Sven
funktioniert auch gut, gerade getestet. Wie Effizient das jetzt ist kann
ich nicht abschätzen, weil ich nicht weiß was der AVR Studio Compiler
aus den ASF IOPORT Funktionen macht, aber momentan bin ich glücklich.
Danke für eure Hilfe!