Spi 11 bit

Gast #446992
Lesenswert?

Hallo zusammen. zuerst muß ich mal sagen das ich noch nie einen MyC 
programmiert habe. ergo habe ich keinen ahnung.
 ich muß mit meinem Atmega 64 einen neigungssensor auslesen, dessen 
datenwort 11bit lang ist. ich will das ganze in c programmieren.
ich habe mir das so überlegt:

1) SPDR mit befehl für auslesen laden und senden. (keine daten vom 
sensor erwartet)
2) laden des SPDR mit einem dummybyte und senden.empfangen des msb vom 
11 bit datenwort (ir darf nicht auslösen)
3) Clk pausieren oder verlangsamen.
4) speichern des SPDR im speicher
5) laden des dummybytes in SPDR
6) senden vom dummybyte und empfangen der letzten 3 daten vom Sensor.
   nach 3 takten die übertragung beenden.

ist das so wie ich mir das vorgestellt habe möglich oder muß ich das 
anders machen


danke für eure hilfe
Gast #447057
Lesenswert?

Hi!
Schon fast richtig:
Du musst bevor du Daten ins SPDR schreibst den Chip Select Pin deines 
Neigungssenors auf low ziehen. Auf welchen Pin du diesen am AVR legst 
ist dir überlassen.
Damit sparst du dir dann den 3.) Punkt die Clk anhalten, da dass der AVR 
automatisch macht, sobald das SPDR Register vollständig geshiftet ist, 
sprich 8 Bits gesendet (und empfangen) wurden.
Nach Punkt 6 einfach den CS Pin wieder auf high und fertig ist das 
ganze.

Ciao

Fasti
Gast #448564
Lesenswert?

habe mir das jetzt so gedacht:

int read_x_channel(void)
{
char x1;
int x3, xGes;
char x2;

 PORTB = (0 << PB0);                   //SS auf low setzen
 SPDR = 0x10;                          //Befehl read X-Channel in SPDR
 while(!(SPSR & (1<<SPIF)));        //Warten bis Empfangsende
 x1 = SPDR;                  //Wert x1 aus DR wird gespeichert
 x3 = x1<<3;               //x1 wird um 3 verschoben
 SPDR = 0x0c;               //Dummybyte
 while(!(SPSR & (1<<SPIF)));           //s.o.
 x2 = SPDR;                   //Wert x2 aus DR wird gespeichert
 x2 = x2 >> 5;               //x2 wird korregiert/ Verschieben um 5 
Stellen
                          //aus xyz00000 wird 00000xyz
 xGes = x3 + x2;             //Endwert wird berechnet
 PORTB = (1 << PB0);                   //SS auf high setzen

 return (xGes);               //Endwert wird zurück gegeben

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren