TL;DR
Runterscrollen und Punkt 4/5 bei den Problemen lesen: sind 4,5V auf der 3,3V Schiene normal/erklärbar und kann ich 4 Kondensatoren parallel schalten/macht das in meinem Fall Sinn?
Die lange Version:
Also mein Ziel ist es zwei Sensorchips (ADNS 9500) auf einer Platine über SPI zum Laufen zu kriegen. Dafür habe ich mir selbst eine Platine geätzt und die notwendigen Kondensatoren aufgelötet. Das ganze hat mit einem Chip auf einem Breadboard funktioniert.
siehe hier: https://www.computerbase.de/forum/t...rstuetzung-beim-lesen-von-schaltplan.1391804/
Auf der Platine geht es mit 2 Chips allerdings nicht.
das ist der Schaltplan für einen der Chips:
Die Hauptänderung zur Breadboardvariante ist, dass ich alle 5V, 3,3V und GND zusammengehängt habe (logisch, hab am Arduino ja auch nur einmal 5,5V bzw einmal 3,3V).
Softwaremäßig habe ich mir eine eigene SPI.begin() Methode geschrieben, da die integrierte Methode nur einen SS Pin unterstützt und ich die Klasse "arduino_pins.h" nicht ändern wollte. Meine Methode sieht so aus:
Geändert habe ich nur die Bezeichnung der SS Pins: PIN_NCS_L/PIN_NCS_R (L steht für links und R für rechts). Außerdem habe ich den MISO Pin gleich auf INPUT geschaltet. Das hätte ich so oder so machen müssen. Also warum nicht gleich in der mySPIBegin Methode. Die anderen SPI Methoden verwende ich aus der original SPI Klasse.
Aber was macht
SPCR |= _BV(MSTR);
SPCR |= _BV(SPE);
eigentlich?
Ein Schreibversuch sieht bei mir zb so aus:
Was bis jetzt geht:
1. Firmware auf beide Chips spielen
2. Versions/Revisionsnummern von beiden Chips auslesen
Das weist darauf hin, dass meine SPI Methoden funktionieren.
Was nicht geht:
1. Sinnvolle Werte aus den DeltaX/DeltaY Registern auslesen. Das Auslesen habe ich genauso schon bei einem Chip auf dem Breadboard gemacht. Also gehe ich davon aus, dass zumindest die richtigen Werte ausgelesen werden und diese Werte vom Sensor einfach falsch geliefert werden.
Wo das Problem liegen könnte:
1. Codefehler: Am ehesten im SPI. Aber das bezweifle ich irgendwo weil ich Register ja normal auslesen kann. In den DeltaX und DeltaY Registern stehen einfach nur falsche Werte (meist in der Gegend von 0). Bzw zeigt der Sensor überhaup Bewegungen an, wenn keine exisiteren und umgekehrt.
2. Platinenedesignfehler: Ich habs zwar 10 mal überprüft, kann aber trotzdem nicht ausschließen, dass ich mich wo geirrt habe. Dagegen spricht folgendes: Der Laser hat seine 3V Spannung und wird auch nicht vom Laser_NEN deaktiviert. Laser_NEN sperrt den Mosfet bei High ist aber LOW. (zwar nicht bei 0 aber innerhalb der Spezifikationen). Außerdem zeigt mir das Motionbyte keinen Fehler beim Laser an.
3. Kaputte Bauteile oder schlechte Lötstellen: Wie gesagt, Firmwareupload funktioniert, Register Auslesen funktioniert auch. Außerdem hab ich die Lötstellen mehrmals überprüft. (Die Kondensatoren kann ich ja leider nicht einfach überprüfen)
4. Wenn ich die Spannung zwischen 3,3V Pin am Arduino und GND messe komme ich auf 4,5 Volt. Warum? Das sollte nicht so sein und ist auch nur so wenn ich meine Platine angeschlossen habe. Wenn ich mit dem Multimeter messe ob der 3,3V Pin und der 5V Pin verbunden sind piepst das Messgerät nicht, zeigt aber einen Wert von ca 1000 an. Was auch immer das für eine Einheit ist... Beim Messgerät habe ich jedenfalls die Einstellung mit der Diode gewählt.
5. Am Breadboard habe ich die 5V bzw 3,3V Schiene jeweils mit zwei Kondensatoren an GND gesteckt. (1 mal Tantal, 1 mal Ceramicmultilayer: siehe Schaltplan). Da ich zwei Chips habe hängen jetzt zwischen 5V/3,3V und GND jeweils 4 Kondensatoren parelell. (2 mal Tantal, 2 mal Ceramicmultilayer). Kann das ein Problem sein?
Mehr fällt mir dazu im Moment nicht ein. Nur langsam weiß ich nicht mehr was ich noch überprüfen könnte. Irgendwelche Ideen was ich noch testen könnte bzw worans liegen kann?
thx im Vorraus!
Runterscrollen und Punkt 4/5 bei den Problemen lesen: sind 4,5V auf der 3,3V Schiene normal/erklärbar und kann ich 4 Kondensatoren parallel schalten/macht das in meinem Fall Sinn?
Die lange Version:
Also mein Ziel ist es zwei Sensorchips (ADNS 9500) auf einer Platine über SPI zum Laufen zu kriegen. Dafür habe ich mir selbst eine Platine geätzt und die notwendigen Kondensatoren aufgelötet. Das ganze hat mit einem Chip auf einem Breadboard funktioniert.
siehe hier: https://www.computerbase.de/forum/t...rstuetzung-beim-lesen-von-schaltplan.1391804/
Auf der Platine geht es mit 2 Chips allerdings nicht.
das ist der Schaltplan für einen der Chips:
Die Hauptänderung zur Breadboardvariante ist, dass ich alle 5V, 3,3V und GND zusammengehängt habe (logisch, hab am Arduino ja auch nur einmal 5,5V bzw einmal 3,3V).
Softwaremäßig habe ich mir eine eigene SPI.begin() Methode geschrieben, da die integrierte Methode nur einen SS Pin unterstützt und ich die Klasse "arduino_pins.h" nicht ändern wollte. Meine Methode sieht so aus:
Code:
void mySPIBegin() {
// Set SS to high so a connected chip will be "deselected" by default
digitalWrite(PIN_NCS_L, HIGH);
digitalWrite(PIN_NCS_R, HIGH);
// When the SS pin is set as OUTPUT, it can be used as
// a general purpose output port (it doesn't influence
// SPI operations).
pinMode(PIN_NCS_L, OUTPUT);
pinMode(PIN_NCS_R, OUTPUT);
// Warning: if the SS pin ever becomes a LOW INPUT then SPI
// automatically switches to Slave, so the data direction of
// the SS pin MUST be kept as OUTPUT.
SPCR |= _BV(MSTR);
SPCR |= _BV(SPE);
// Set direction register for SCK and MOSI pin.
// MISO pin automatically overrides to INPUT.
// By doing this AFTER enabling SPI, we avoid accidentally
// clocking in a single bit since the lines go directly
// from "input" to SPI control.
// http://code.google.com/p/arduino/issues/detail?id=888
pinMode(PIN_SCLK, OUTPUT);
pinMode(PIN_MOSI, OUTPUT);
pinMode(PIN_MISO, INPUT);
}
Geändert habe ich nur die Bezeichnung der SS Pins: PIN_NCS_L/PIN_NCS_R (L steht für links und R für rechts). Außerdem habe ich den MISO Pin gleich auf INPUT geschaltet. Das hätte ich so oder so machen müssen. Also warum nicht gleich in der mySPIBegin Methode. Die anderen SPI Methoden verwende ich aus der original SPI Klasse.
Aber was macht
SPCR |= _BV(MSTR);
SPCR |= _BV(SPE);
eigentlich?
Ein Schreibversuch sieht bei mir zb so aus:
Code:
digitalWrite(PIN_NCS_L, HIGH);
digitalWrite(PIN_NCS_R, LOW);
//send adress of the register, with MSBit = 1 to indicate it's a write
SPI.transfer(reg_addr | 0x80 );
//sent data
SPI.transfer(data);
delayMicroseconds(20); // tSCLK-NCS for write operation
digitalWrite(PIN_NCS_L, HIGH);
digitalWrite(PIN_NCS_R, HIGH);
delayMicroseconds(100); // tSWW/tSWR (=120us) minus tSCLK-NCS. Could be shortened, but is looks
like a safe lower bound
Was bis jetzt geht:
1. Firmware auf beide Chips spielen
2. Versions/Revisionsnummern von beiden Chips auslesen
Das weist darauf hin, dass meine SPI Methoden funktionieren.
Was nicht geht:
1. Sinnvolle Werte aus den DeltaX/DeltaY Registern auslesen. Das Auslesen habe ich genauso schon bei einem Chip auf dem Breadboard gemacht. Also gehe ich davon aus, dass zumindest die richtigen Werte ausgelesen werden und diese Werte vom Sensor einfach falsch geliefert werden.
Wo das Problem liegen könnte:
1. Codefehler: Am ehesten im SPI. Aber das bezweifle ich irgendwo weil ich Register ja normal auslesen kann. In den DeltaX und DeltaY Registern stehen einfach nur falsche Werte (meist in der Gegend von 0). Bzw zeigt der Sensor überhaup Bewegungen an, wenn keine exisiteren und umgekehrt.
2. Platinenedesignfehler: Ich habs zwar 10 mal überprüft, kann aber trotzdem nicht ausschließen, dass ich mich wo geirrt habe. Dagegen spricht folgendes: Der Laser hat seine 3V Spannung und wird auch nicht vom Laser_NEN deaktiviert. Laser_NEN sperrt den Mosfet bei High ist aber LOW. (zwar nicht bei 0 aber innerhalb der Spezifikationen). Außerdem zeigt mir das Motionbyte keinen Fehler beim Laser an.
3. Kaputte Bauteile oder schlechte Lötstellen: Wie gesagt, Firmwareupload funktioniert, Register Auslesen funktioniert auch. Außerdem hab ich die Lötstellen mehrmals überprüft. (Die Kondensatoren kann ich ja leider nicht einfach überprüfen)
4. Wenn ich die Spannung zwischen 3,3V Pin am Arduino und GND messe komme ich auf 4,5 Volt. Warum? Das sollte nicht so sein und ist auch nur so wenn ich meine Platine angeschlossen habe. Wenn ich mit dem Multimeter messe ob der 3,3V Pin und der 5V Pin verbunden sind piepst das Messgerät nicht, zeigt aber einen Wert von ca 1000 an. Was auch immer das für eine Einheit ist... Beim Messgerät habe ich jedenfalls die Einstellung mit der Diode gewählt.
5. Am Breadboard habe ich die 5V bzw 3,3V Schiene jeweils mit zwei Kondensatoren an GND gesteckt. (1 mal Tantal, 1 mal Ceramicmultilayer: siehe Schaltplan). Da ich zwei Chips habe hängen jetzt zwischen 5V/3,3V und GND jeweils 4 Kondensatoren parelell. (2 mal Tantal, 2 mal Ceramicmultilayer). Kann das ein Problem sein?
Mehr fällt mir dazu im Moment nicht ein. Nur langsam weiß ich nicht mehr was ich noch überprüfen könnte. Irgendwelche Ideen was ich noch testen könnte bzw worans liegen kann?
thx im Vorraus!
Zuletzt bearbeitet: