mikrocontroller.net

Forum: Compiler & IDEs 7bit Array in 8bit Array konvertieren?


Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich habe folgendes Problem:

Ich habe 16 7Bit werte in einem  uint8 Array (also nur werte zwischen 
0...127).
Jetzt möchte ich diese Werte über die HW SPI des Mega32 senden.
Da mein Slave ein TLC5923 ist und nur 112bit empfangen kann, muss ich 
meine Daten in irgendeiner weise aufbereiten, damit ich aus meinen 16 
7bit werten 14 8bit Werte erzeuge um diese dann senden zu können.

Vieleicht hier gleich ein paar definitionen.

uint8 array_7bit [15];
uint8 array_8bit [13];

Wie sollte ich das am besten lösen?
Ich dachte an Bit-Shift, aber klappt das über Bytes in einem Array?

Gruß

Julien

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Julien (Gast)

>Da mein Slave ein TLC5923 ist und nur 112bit empfangen kann, muss ich

Die Entwickler dieser IC-Reihe sollte man erstmal schlagen. Wie dämlich 
muss man sein, um die Daten NICHT byteweise zu organisieren?!? Eine 
Handvoll FlipFlops mit einem Flächenverbrauch von 1um^2 hätte das 
Problem gelöst. Naja.

>meine Daten in irgendeiner weise aufbereiten, damit ich aus meinen 16
>7bit werten 14 8bit Werte erzeuge um diese dann senden zu können.

>Wie sollte ich das am besten lösen?

Entweder mit einer Ausgbe per Soft-SPI, siehe [[AVR-Tutorial: 
Schieberegister]].

>Ich dachte an Bit-Shift,

Oder eben so, allerdings ist das am Ende langsamr und aufwändiger als 
Soft-SPI.

> aber klappt das über Bytes in einem Array?

Muss man "zu Fuss" in Schleifen programmieren, siehe 
Bitmanipulation.

MFG
Falk

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich dachte an Bit-Shift, aber klappt das über Bytes in einem Array?

Ja, kein Problem, wenn man die einzelnen Elemente anfässt.

Quasi so:

array_8bit[0] = array_7bit[0] | (array_7bit[1] << 7);
array_8bit[1] = (array_7bit[1] >> 1) | (array_7bit[2] << 6);
so in etwa müsste es gehen.
Das kann man bestimmt in eine Schleife packen...

Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk

ja an Soft-SPI hatte ich auch gedacht, aber fande es schade die doch 
harwareseitige SPI nicht zu nutzen.
Gibt es für GCC bereits optimierte SOFT-SPI Routinen oder Bibliotheken?
in den Tutorial ist meines Wissen nur Assembler-Code niedergeschrieben.
Ich nutze aber C.


@STK500-Besitzer
Das mit der Schleife klingt auch brauchbar wenn es insgesamt schon 
dämlich ist  112 Bit so aufzubereiten.
Jetzt gilt es dann zu überlegen wie diese Schleife realisierbar ist.


Ist es eigentlich dann auch möglich ein komplettes Array zu senden mit 
MSB first?

Julien

Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zur Konvertierung nochmal.

Ich habe jetzt mal mich hingesetzt und das schieben aufgezeichnet.
Könnte das so funktionieren?
for(i = 0;i<7;i++)
{                         
    array_8bit[i] = (array_7bit[i] >> (i));                        
    array_8bit[i] |= (array_7bit[i+1] << (7-i));
}
for(i = 0;i<7;i++)
{                         
    array_8bit[i+7] = (array_7bit[i+8] >> (i));                        
    array_8bit[i+7] |= (array_7bit[i+9] << (7-i));
}            

Julien

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Julien (Gast)

>Gibt es für GCC bereits optimierte SOFT-SPI Routinen oder Bibliotheken?

AFAIK nein.

>in den Tutorial ist meines Wissen nur Assembler-Code niedergeschrieben.
>Ich nutze aber C.

Kann man auch relativ schnell hinscheiben.

>Ist es eigentlich dann auch möglich ein komplettes Array zu senden mit
>MSB first?

Sicher, ist doch einstellbar.

MFG
Falk

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Könnte das so funktionieren?

Nein, für MSB-First müsste in den Schleifen eher sowas stehen:
    array_8bit[i] = (array_7bit[i] << (i+1));                        
    array_8bit[i] |= (array_7bit[i+1] >> (7-i));

Und es gibt noch eine "Kleinigkeit":
Deine Arrays sind zu klein.

> damit ich aus meinen 16 7bit werten 14 8bit Werte erzeuge ...
> Vieleicht hier gleich ein paar definitionen.
> uint8 array_7bit [15];
> uint8 array_8bit [13];

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan

ups jetzt wo du es sagst. Ja die Array-Größe muss ich dann anpassen.
Aber es ist richtig dass ich die schleife ja 2 mal machen muss oder?

@Falk

ich werde es zuerst einmal mit der Hardware-SPI und der Schleife 
versuchen, wenn das nicht glückt mach ich es in Software.

Danke schon mal

Autor: Julien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah ...
PC vom Bruder und schwups anderer Name noch drin.

dieser Post war aber trotzdem von mir
Gruß
Julien

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julien wrote:

> Aber es ist richtig dass ich die schleife ja 2 mal machen muss oder?

Wäre das Einfachste.

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.