Forum: Mikrocontroller und Digitale Elektronik Atmega32 SMB360 Bits setzen


von Marian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Forum!

Hat sich von euch schonmal jemand mit dem SMB360 auseinandergesetzt?
Den einzigen den ich gefunden habe ist dieser hier:
http://www.mikrocontroller.net/forum/read-1-316495.html#new

Leider hilft mir das nicht weiter. Ich möchte mit meinem Atmega32
einige Bits vom meinem Beschleunigungssensor setzen. Genauer gesagt das
Bit 7 im Register 25h. Der Christoph hat das auch gemacht und bei ihm
scheint es auch funktioniert zu haben, nur leider bei mir nicht. Ich
habe die gleiche Funktion wie er benutzt und zwar diese hier:
void smb360_write_bit( char adress,char data )
{
  // /CS des SMB360 auf Low ziehen
  PORTB &= (0<<PB0);
  spi_putc (adress);
  spi_putc (data);
  // /CS Leitung wieder freigeben
  PORTB |= (1<<PB0);
}
Die spi_putc Funktion ist die Standard funktion die jeder zum senden
über den SPI Bus nutzt. Zum testen ob das Bit gesetzt wurde, lese ich
das entsprechende Register aus(05h). Leider bleibt bei mir das Bit7
immer 0.
Langsam weiß ich nicht mehr weiter. Das auslesen von Registern
funktionert eigentlich auch aber wieso klappt dann das setzen eines
Bits nicht? Die Funktion rufe ich folgendermaßen auf:
smb360_write_bit(0x25,(1<<7));
Laut Datenblatt muss ich 1 Read/Write Bit und 7Adressbits +8Datenbits
senden.Das R/W Bit muss zum schreiben des EEproms 0 sein, was ich auch
beachte. Ich habe auch schon getestet ob es funktioniert, wenn ich die
20 ms Zugriffszeit beachte, was leider auch kein Erfolg brachte. Mehr
Informationen kann ich dem Datenblatt leider nicht entnehmen, weshalb
ich jetzt hier nachfrage, ob mir jemand bei meinem Problem helfen.

Ich würde mich über eine Antwort sehr freuen.

Danke und Gruß,
Marian

von Rahul (Gast)


Lesenswert?

>PORTB &= (0<<PB0);

das wird nur insgesamt ne 0...

Es müsste "PORTB &= ~(1<<PB0);" heissen.

Daran wird es aber nicht unbedingt liegen...

von Marian (Gast)


Lesenswert?

Danke für deine Info aber es liegt wirklich nicht daran. Das hat mir
schonmal jemand gesagt, habe auch nur vergessen es endlich mal zu
ändern.

von Dirk D. (dirkd)


Lesenswert?

Wahrscheinlich liegt es nicht daran, aber Du solltest den Parameter für
data als unsigned char deklarieren und nicht als char wenn Du den
ganzen Zahlenbereich (0 - 255) abdecken willst. Das selbe gilt für
adress.

Hast Du alles korrekt verbunden?

Kannst Du mal Deinen kompletten Code posten?

von Marian (Gast)


Lesenswert?

Da fällt mir gerade noch was ein. Auf dieser Seite:
http://www.kreatives-chaos.com/index.php?seite=mcp2515_reg
wird ja auch erklärt wie man per SPI Register liest und schreibt.
Einmal macht er das so wie ich und dann gibt es noch diese
Möglichkeit:
"Einzelne Bits setzen/löschen". Dort nutzt er noch eine Bitmaske aber
verweißt auch darauf, dass es nicht bei allen geht(Laut Datenblatt).
Jetzt meine Frage: Woher weiß ich, was ich machen muss? Ein ganzen
Register beschreiben oder nur ein Bit setzen in ner Maske. Das mit der
Maske habe ich natürlich auch schon getestet aber leider ohne Erfolg.

Ganz schön komisch diese Angelegenheit.

von Marian (Gast)


Angehängte Dateien:

Lesenswert?

Also die Hardware ist korrekt verbunden, sonst könnte ich ja auch keine
Register auslesen oder?
Ich habe meinen kompletten TestCode mal in den Anhang gestellt. Er ist
noch im Testmodus, deshalb nicht wundern wenn etwas komisch aussieht.

von Dirk D. (dirkd)


Lesenswert?

Zum Thema "Einzelne Bits setzen/löschen"

Dies hat nix mit SPI zu tun und betrifft Dich nicht.

Das ist eine Funktion des dort angesprochenen CAN-Controllers.

Deine smb360_read_register Funktion sieht nicht korrekt aus.

Du willst einen Latch lesen. Laut Datenblatt genügt dann ein Cycle

Also
- CS low
- SPI_putc(adresse)
- data = spi_putc(Dummy)
- CS High

Reduzier mal Dein Programm darauf, daß Du versuchst den Operation-Mode
umzustellen und anschließend den Wert auszulesen.

von Marian (Gast)


Lesenswert?

Aber ich muss doch beide Register auslesen. In einem steht das Highbyte
und in dem anderen das Lowbyte, welche ich dann zusammenfüge zu meinem
10 bit Beschleunigungswert. Und im Datenblatt steht auch, dass ich für
ein komplettes Auslesen des Beschleunigungswertes 2 Cycles benötige.
Oder habe ich mich verlesen?

von Dirk D. (dirkd)


Lesenswert?

Wir waren doch jetzt gerade beim Konfigurieren, oder etwa nicht?

Aber auch zum Auslesen der Beschleunigung ist das meines Erachtens
falsch. Du mußt dann 2 mal read register aufrufen. 1x mit der
HighByte-Adresse und einmal mit der Low-Byte Adresse. (Es gilt das 3
Bild "SPI Acceleration/Temperature Read cycle description".

von Marian (Gast)


Lesenswert?

Ja wir waren beim konfigurieren aber du hast ja meine read_register
funktion erwähnt, weshalb ich das ansprach. Das mit dem getrennten
auslesen hatte ich auch schon durch, bleibt im Ergebniss gleich. Im
Prinzip lese ich ja mit meiner Funktion auch 2 mal hintereinander die
Register aus.

von Dirk D. (dirkd)


Lesenswert?

Machen denn die ausgelesenen Beschleunigungswerte einen Sinn?

Wenn nicht solltest erst einmal versuchen zu konfigurieren und dann
Daten auszulesen.

Sprich: Schritt für Schritt überprüfen, daß alles funktioniert wie
erwartet.

In Deinem Fall:

2g/10g Mode umstellen und Register auslesen. Erst weitermachen wenn es
funktioniert.
> Im Prinzip lese ich ja mit meiner Funktion auch 2 mal
> hintereinander die Register aus

Nein. Du hast kein CS High dazwischen.

von Marian (Gast)


Angehängte Dateien:

Lesenswert?

Ok ich habe jetzt erstmal die Ausleseroutine so umgeschrieben wie du es
meinst aber wie ich schon sagte am Ergebniss ändert sich nichts.
Ich habe diese Routine mal in den Anhang gestellt um dir zu zeigen wie
ich es gemacht habe.
hast du mittlerweile ne Idee wieso das Bitsetzen einfach nicht
funktionieren will?

von Marian (Gast)


Lesenswert?

Hallo Dirk,

hast du dich in der Zwischenzeit zufällig nochmal mit meinem Problem
beschäftigt? Ich weiß einfach nicht mehr weiter und weiß auch nicht, wo
ich jetzt noch nach einer Lösung suchen kann. Das muss doch irgendwie
gehen. Gibt es im Datanblatt etwas, was ich nicht sehe oder übersehe?
Könntest du mir vielleicht ein Beispiel geben, wie du denn das
Bitsetzen realisieren würdest? Oder irgendjemand anderes?

Bin völlig am verzweifeln :(

Gruß,

Marian

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.