www.mikrocontroller.net

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


Autor: Bert R. (berti08)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas R. (eckoe17)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bertram S. (bschall)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t highbyte, lowbyte;
uint16_t result;

highbyte = SPI_get(...);
lowbyte = SPI_get(...);

result = (highbyte << 8) | lowbyte;

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gastino G. (gastino)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Gastino G. (gastino)
Datum:

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

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.