Forum: Mikrocontroller und Digitale Elektronik 16 bit Datenrückgabe - aber nur 8 bit Register


von Bert R. (berti08)


Lesenswert?

Hallo zusammen,

ich benutze einen ATMega 128, an dem unter anderem ein Sensor per SPI 
angebunden ist. Nun bekomme ich vom Sensor Daten gesendet, die 16 Bit 
lang sind, der µC aber nur 8 Bit Register hat.

Wie kann ich dieses Problem lösen? Ich benutze die Programmiersprache C 
und zerbreche mir da schon lange den Kopf drüber. Wäre schön, wenn mir 
jemand helfen könnte. Bin noch ein relativer Anfänger, aber mich hat das 
"µC-Fieber" voll erwischt...Danke schon mal im Voraus!

Viele Grüße,

Bernd

von Gast (Gast)


Lesenswert?

Nimm doch einfach 2 dieser 8-Bit Register zusammen, schon hast du dein 
16Bit Register.

von (prx) A. K. (prx)


Lesenswert?

Lass das mal die Sorge des Compilers sein. Der weiss ganz gut wie man 
mehrere 8-Bit Register dazu einspannt um u.U. sogar 64-Bit Daten zu 
verarbeiten.

von Lukas R. (eckoe17)


Lesenswert?

Ist nur ne Idee...

Wie wärs wenn du den 16 Bit Wert in ne Analogspannung umwandelst und 
dann mit dem ADC einliest?

Lukas

von Bertram S. (bschall)


Lesenswert?

1
uint8_t highbyte, lowbyte;
2
uint16_t result;
3
4
highbyte = SPI_get(...);
5
lowbyte = SPI_get(...);
6
7
result = (highbyte << 8) | lowbyte;

von Matthias (Gast)


Lesenswert?

Sowas kenne ich irgendwo her... ;-)

Eine mutige Entscheidung wäre es, wenn Du einen USART im SPI Modus 
betreibst.
Da das Teil einen FiFo hat, kannste Damit 2 Dummy Bytes zum Lesen in das
TX-Schieberegister und das TX-Datenregister schaufeln.

Einziger Wehrmutstropfen ist, dass man den USART nicht sagen kann, dass 
er einen RX-IRQ erst beim 2 Zeichen im FiFo auslösen soll. Aber mit dm 
TXC IRQ könnte evtl. gehen.

Die einzige alternative wäre ein uC (z.B. PIC24/dsPIC) mit nem SPI der
16-bit Transfer unterstützt. Ich persönlich bin allerdings kein Fan von 
den
PICs...

von Bernd (Gast)


Lesenswert?

Hallo nochmal,

die Idee mit uint8_t highbyte usw. ist sehr gut. Der Sensor sendet ja 
die 16 Bit am Stück. Wie kann ich dem µC sagen, in welches Register er 
schreiben soll, so dass ich sofort mein highbyte und lowbyte zuordnen 
kann?

Das wäre noch das einzige Problem was ich habe...

Danke für Eure Hilfe. Ich hoffe, ich kann demnächst auch mal helfen.

Viele Grüße,
Bernd

von Karl H. (kbuchegg)


Lesenswert?

Bernd schrieb:
> Hallo nochmal,
>
> die Idee mit uint8_t highbyte usw. ist sehr gut. Der Sensor sendet ja
> die 16 Bit am Stück. Wie kann ich dem µC sagen, in welches Register er
> schreiben soll, so dass ich sofort mein highbyte und lowbyte zuordnen
> kann?

Gar nicht.
Die Daten kommen immer im selben Register an.
Du holst sie dir von dort und speicherst sie selbst in Variablen ab.
Wenn du dann beide Bytes hast, setzt du sie wieder zusammen.

Bertram hat doch oben gezeigt, wies geht.
Jetzt musst du nur noch die Funktion SPI_get schreiben, die ein Byte an 
der SPI Schnittstelle empfängt.

von Gastino G. (gastino)


Lesenswert?

Ich hänge mich auch mal rein, weil ich vor derselben Fragestellung 
stehe.

Die Lösung, einfach zweimal ein Byte zu schreiben bzw. zu lesen, 
erscheint mir zu einfach gedacht. Der Slave erwartet (zumindest in 
meinem Fall) ein 16 Bit-Datenwort ohne Unterbrechung und sendet ein 
solches auch an den Master.
Wartet man nun bei Senden oder Empfangen der beiden Bytes jeweils auf 
das SPIF-Flag, bevor das nächste Byte in SPSR geschrieben oder aus SPSR 
gelesen wird, gibt es doch mit Sicherheit eine Pause, oder?

von Peter (Gast)


Lesenswert?

Wenn es diese Pause gibt (ich weiss jetzt nicht, ob der SPI bei AVR's 
auch doppelt gepuffert ist), ist das egal!

Der Slave liest die ankommenden Signale zusammen mit dem Taktsignal aus 
und schiebt seine Werte auch "im Takt" raus. In der Sendepause macht 
auch das Taktsignal eine Pause und bleibt im Ruhezustand.

So lange die CS-Leitung während der Übertragung beider Bytes auf LOW 
bleibt,  musst Du Dir keine Gedanken über diese kurze Pause zwischen 
beiden Bytes machen, weil Du in der Zeit auch keine Takte an den Slave 
weitergibst!

von Gastino G. (gastino)


Lesenswert?

Ja, das klingt logisch, das hatte ich gar nicht bedacht... :)

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.