Forum: Mikrocontroller und Digitale Elektronik Array auf PIN Register schieben


von Tim (Gast)


Lesenswert?

Hallo,

ich hab einen bool Array der 15 Elemente hat und jetzt möchte ich das 
Element 0-7 auf PINB geschoben wird und Element 8-15 auf PINC.

also
1
bool testArray [15]
2
3
int main(void)
4
{
5
 PINB = testArray[0],testArray[1],testArray[2],...
6
 PINC = testArray[8],testArray[9],testArray[10],...
7
}

Tim

von Walter S. (avatar)


Lesenswert?

Ich empfehle ein C-Buch um Grundlagen zu lernen, am besten erst Mal am 
PC.

von Hmm (Gast)


Lesenswert?

Mach doch!

von mr. mo (Gast)


Lesenswert?

Schön.

Warum nimmst du bool Arrays? Ein Bitmuster auf PIN geht doch auch und 
ist nichts anderes als dein bool Array nur zusammengesetzt.

Falls du da AVRs nutzt solltest du anstatt PINx lieber PORTx benutzen 
falls du das auf einem Port ausgeben willst.

von Tim (Gast)


Lesenswert?

Danke für die schnelle Antwort

mr. mo schrieb:
> Falls du da AVRs nutzt solltest du anstatt PINx lieber PORTx benutzen
>
> falls du das auf einem Port ausgeben willst.
Hab ich gemacht :D

mr. mo schrieb:
> Warum nimmst du bool Arrays? Ein Bitmuster auf PIN geht doch auch und
>
> ist nichts anderes als dein bool Array nur zusammengesetzt.
Weil ich sonst später bei der USB-Übertragung Probleme bekomme.

Hmm schrieb:
> Mach doch!

Ja, hab ich gemacht aber er setzt nur Bit0 die restlichen Bits ignoriert 
er!?

von Dirk B. (devnull)


Lesenswert?

Hallo,

wenn man das Problem wirklich so angehen will, wie wäre es mit etwas in 
der Art:
1
PORTB = (array[0]<<0) | (array[1]<<1) | (array[2]<<2) | (array[3] << 3) |
2
        (array[4]<<4) | (array[5]<<5) | (array[6]<<6) | (array[7] << 7);

Wie das für PORTC aussieht, darfst Du Dir selbst ausdenken :-)

Für ein eigenes Programm würde ich mir das in eine Funktion packen, die 
einen Teil des Arrays in ein Byte packt und zurück gibt:
1
uint8_t array_range_to_byte(bool* array, size_t at_index);

Man müsste noch Fehlerbehandlung und Plausibilitätsprüfung betrachten: 
Liegt at_index im Array? Was passiert, wenn ab at_index weniger als 8 
Elemente vorhanden sind? Akzeptiert die Funktion besser nur Vielfache 
von 8 (minus 1) als Index? Wie erhält der Aufrufer einen Fehler 
rückgemeldet? Der Rückgabewert der Funktion ist ja schon in Benutzung . 
Hmm, würde doch noch ein wenig anders aussehen ;-) Aber mal als Ansatz, 
wenn das oben mal funktioniert...

Ansonsten schließe ich mich meinen Vorrednern an:

Walter S. schrieb:
> Ich empfehle ein C-Buch um Grundlagen zu lernen

mr. mo schrieb:
> Warum nimmst du bool Arrays?


Viele Grüsse,
Dirk

von Dirk B. (devnull)


Lesenswert?

Tim schrieb:
> Weil ich sonst später bei der USB-Übertragung Probleme bekomme.

Und wenn Du das erklärst, kann man Dir sicher weiter helfen :-)

von Rolf Magnus (Gast)


Lesenswert?

Tim schrieb:
> mr. mo schrieb:
>> Warum nimmst du bool Arrays? Ein Bitmuster auf PIN geht doch auch und
>>
>> ist nichts anderes als dein bool Array nur zusammengesetzt.
> Weil ich sonst später bei der USB-Übertragung Probleme bekomme.

Ich verstehe nicht den Zusammenhang zwischen einem bool-Array und einer 
USB-Übertragung.
Außerdem hat dieses Array natürlich einen recht großen Overhead.

> Hmm schrieb:
>> Mach doch!
>
> Ja, hab ich gemacht aber er setzt nur Bit0 die restlichen Bits ignoriert
> er!?

Ein bool hat ja auch nur ein genutztes Bit, und der Komma-Operator macht 
was völlig anderes, als du denkst.

von Georg G. (df2au)


Lesenswert?

Zwei Fragen:
- Warum hat das Array 15 Elemente? Wäre 16 nicht angemessener?
- Warum definierst du das Array nicht als union mit alternativ 16 Bits 
und 2 uint8_t? Dann sparst du dir die Bitschieberei komplett.

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.