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
>PORTB &= (0<<PB0);
das wird nur insgesamt ne 0...
Es müsste "PORTB &= ~(1<<PB0);" heissen.
Daran wird es aber nicht unbedingt liegen...
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.
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?
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.
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.
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.
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?
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".
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.