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
Nimm doch einfach 2 dieser 8-Bit Register zusammen, schon hast du dein 16Bit Register.
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.
Ist nur ne Idee... Wie wärs wenn du den 16 Bit Wert in ne Analogspannung umwandelst und dann mit dem ADC einliest? Lukas
1 | uint8_t highbyte, lowbyte; |
2 | uint16_t result; |
3 | |
4 | highbyte = SPI_get(...); |
5 | lowbyte = SPI_get(...); |
6 | |
7 | result = (highbyte << 8) | lowbyte; |
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...
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
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.
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.