mikrocontroller.net

Forum: Compiler & IDEs avr gcc -sensor on SPI - Problem


Autor: Zmarzly Daria (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Kann mir bitte jemand erklären wieso will der Sensor nicht mit dem
Prozessor reden? ich benutze den Atmega128 und winAvr Compiler.
Ich habe einen ganz einfachen Programm geschrieben wo ich den Sensor
aktiviert habe, er soll mir nun seinen Status Register zurück an das
Spi senden. Der Prozessor soll immer ein Master sein.
Mein Problem ist, dass ich nicht weiß, ob ich die Schnittstelle
überhaupt richtig anspreche und dann ob ich auch richtig reagiere. Ich
habe bis jetzt keine Interupt Routinen benutzt, da ich nun alles
manuell ablesen will.
Danke für baldige Antwort
Daria

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Zmarzly,

so kann es nicht gehen. Dein mega128 muss JEDEN Transfer starten mit
einem Write auf SPDR. Auch wenn er "nur" ein Byte empfangen will.
Jeder Transfer über SPI sendet UND empfängt gleichzeitig ein Byte.

Dein Problem liegt in readSensor:
Dort wird SPDR nur gelesen, ein SPI-Transfer wird also garnicht
gestartet!

Stefan

Autor: Zmarzly Daria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was soll ich denn da rein schreiben? soll es was sinnvolles sein, z.B
die Commando für den Sensor dass er jetzt senden soll?
Daria

Autor: Zmarzly Daria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Jeder Transfer über SPI sendet UND empfängt gleichzeitig ein Byte"
also ich habe nicht wirklich verstanden, ich habe nur einen Register
zur Verfügung, den SPDR, und ich muss den Slave aktivieren sowohl beim
senden als auch beim empfangen, bis jetzt verhält sich das ganze so,
dass ich schreibe etwas in den Register, empfange aber das selbe, als
ob der Transfer tatsächlich nicht gestartet hätte...

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Sensor hast Du denn am SPI?

Ein korrekter SPI-Transfer sieht so aus:

* Sendedaten in SPDR schreiben
  (das startet automatisch die Übertragung bzw. die SPI-Clock)
* warten, bis SPIF = 1 wird
* Empfangsdaten aus SPDR lesen


Deine Read-Sensor-Routine sollte also so aussehen:

unsigned char readSensor(void){
  CLEARBIT(PORTC,PC3);        /* enable sensor*/
  SPDR = DUMMY;               /* irgendwas in SPDR schreiben */
  while(!(SPSR & (1<<SPIF)))  /* wait for transmission complete*/
  SETBIT(PORTC,PC3);          /* disaable sensor*/
  return SPDR;                /* wichtig: return ganz am Schluss! */
}

Das Return UNBEDINGT ganz am Schluss: bei Dir wird SETBIT(PORTC,PC3)
gar nie ausgeführt!

Stefan

Autor: Zmarzly Daria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich versuche es.
Vielen Dank :)
Daria

Autor: Zmarzly Daria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also,
ich habe den Sender modifiziert, der Sensor liefert leider immer ein 0
Wert zurück, egal wie ich im auch initialisiere. Ich benutze den KXP74
Beschleunigungs- Sensor. Ich habe auf dem Board noch einen Speicher
(AT45DB041B)4Mbit von Atmel, den ich über Spi ansprechen sollte. Der
Speicher verhält sich genau so wie der Sensor, d.h. reagiert irgenwie
nicht, deshalb denke ich, dass es an meinem Programm liegt.
Gibt es denn noch ein Paar Tips mehr?
Danke
Daria

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal das Datenblatt angeschaut.

Du musst:

* CS low schalten
* Befehl zum Start der Konvertierung geben (z.B. 0 für x-axis)
* warten auf SPIF = 1
* min. 40us warten
* Dummy-Byte senden (egal welcher Wert)
* warten auf SPIF = 1
* MSB-Datenbyte aus SPDR auslesen
* Dummy-Byte senden
* warten auf SPIF = 1
* LSB-Datenbyte aus SPDR auslesen
* jetzt erst (!!!) CS wieder high schalten

Während der ganzen Aktion: CS = low!

Gruß, Stefan

Autor: zmarzly daria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank für die Tips, ich werde sie am Dienstag gleich ausprobieren.
Ich habe den CS mehrmals ein und ausgeschaltet und hatte mehrere
funktionen aufgerufen um mit dem Sensor zu kommunizieren, deshalb hat
es wahrscheinlich nicht funktioniert.
 nochmal Danke
Grüße Daria

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.