Forum: Mikrocontroller und Digitale Elektronik Spi 11 bit


von b00N (Gast)


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

von Fasti (Gast)


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

von b00N (Gast)


Lesenswert?

danke für deine antwort. werde mal ein wenig coden und den code dann mal 
reinstellen.

von b00N (Gast)


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

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

und um welchen Sensor handelt es sich?

von b00N (Gast)


Lesenswert?

was hier noch fehlt is der y-port. es handelt sich um einen 
neigungssensor von vti.arbeitet wie ein airbagsensor. ca

von peter (Gast)


Lesenswert?

Hat das Funktioniert ?

Ich habe hier einen SCA100 und es sieht mit diesem Programm nach einer 
Datenkollision am MISO-Kanal aus.

Beschaltung dürfte stimmen, MISO auf MOSI und umgekehrt

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.