Hallo Leute, ich habe gerade die Maus geschlachtet und wollte erstmal nur über die SPI auslesen, ob er den Master erkannt hat. Doch wenn ich den Sensor mit einer Frequenz mit 5mHz anschließe, flackert die LED als. Mit 5Hz flackert es nicht. Doch machen 5Hz für die Übertragung von Daten sinn? Was könnte der Grund dafür sein? Habe ich eine zu hohe Frequenz? Die Frequenz habe ich aus dem Datenblatt.
:
Bearbeitet durch User
Karl F. schrieb: > Doch wenn ich den Sensor mit einer Frequenz mit 5mHz anschließe Gross- und Kleinschreibung ist hier wichtig. Du schreibst 5 milliHertz, also 5 tausendstel Hertz, meinst aber vermutlich 5 Megahertz (5 MHz). Und als was schliesst du das an? Als Taktoszillator? Als SPI Takt? In Quarzform? Als Externer TTL Oszillator?
Danke für die schnelle Antwort. Meinte natürlich 5MHz. :=) Ehm, dass sollte eig. Takt von der SPI sein. Aber irgendwie verwirrt mich das gerade, warum flackert die LED als hin und her? Ich habe doch nicht an Werten verändert?
Als Code habe ich in C# UWP folgendes:
1 | using System; |
2 | using System.Collections.Generic; |
3 | using System.IO; |
4 | using System.Linq; |
5 | using System.Net; |
6 | using System.Threading; |
7 | using System.Threading.Tasks; |
8 | using System.Runtime.InteropServices.WindowsRuntime; |
9 | using Windows.Foundation; |
10 | using Windows.Foundation.Collections; |
11 | using Windows.UI.Xaml; |
12 | using Windows.UI.Xaml.Controls; |
13 | using Windows.UI.Xaml.Controls.Primitives; |
14 | using Windows.UI.Xaml.Data; |
15 | using Windows.UI.Xaml.Input; |
16 | using Windows.UI.Xaml.Media; |
17 | using Windows.UI.Xaml.Navigation; |
18 | using Windows.Devices.Gpio; |
19 | using Windows.Networking.Connectivity; |
20 | using Windows.Devices.Spi; |
21 | using Windows.Devices.Enumeration; |
22 | |
23 | |
24 | namespace LEDSteuerung |
25 | {
|
26 | public sealed partial class MainPage : Page |
27 | {
|
28 | |
29 | private const byte Mouse_ID = 0x00; |
30 | private const byte Mouse_delta_y = 0x04; |
31 | private const byte CS0 = 0; |
32 | |
33 | |
34 | private const string SPI_PORT_NAME = "SPI0"; |
35 | private SpiDevice ADNS5020E; |
36 | |
37 | |
38 | public MainPage() |
39 | {
|
40 | this.InitializeComponent(); |
41 | InitSPI(); |
42 | |
43 | }
|
44 | |
45 | private async void InitSPI() |
46 | {
|
47 | try
|
48 | {
|
49 | var setting_0 = new SpiConnectionSettings(CS0); |
50 | |
51 | setting_0.ClockFrequency = 1000000; |
52 | setting_0.Mode = SpiMode.Mode3; |
53 | |
54 | string aqs = SpiDevice.GetDeviceSelector(); |
55 | var dis = await DeviceInformation.FindAllAsync(aqs); |
56 | ADNS5020E = await SpiDevice.FromIdAsync(dis[0].Id, setting_0); |
57 | |
58 | |
59 | if ( ADNS5020E == null) |
60 | {
|
61 | ID1.Text = string.Format( |
62 | "SPI Controller {0} is currentyl use" + |
63 | "another application. Please ensure that nio other application are using SPI", |
64 | dis[0].Id |
65 | );
|
66 | return; |
67 | }
|
68 | }
|
69 | catch (Exception e) |
70 | {
|
71 | ID1.Text = "Spi faild:" + e.Message; |
72 | return; |
73 | }
|
74 | |
75 | |
76 | byte[] ReadBuf; |
77 | byte[] RegAdressBuf; |
78 | |
79 | ReadBuf = new byte[2 + 1]; |
80 | RegAdressBuf = new byte[1 + 2]; |
81 | RegAdressBuf[0] = Mouse_delta_y; |
82 | ADNS5020E.TransferFullDuplex(RegAdressBuf, ReadBuf); |
83 | Array.Copy(ReadBuf, 1, ReadBuf, 0, 2); |
84 | |
85 | if (!BitConverter.IsLittleEndian) |
86 | {
|
87 | Array.Reverse(ReadBuf, 0, 2); |
88 | }
|
89 | |
90 | Teste.Text=BitConverter.ToInt16(ReadBuf, 0).ToString(); |
91 | |
92 | |
93 | |
94 | |
95 | }
|
96 | |
97 | }
|
98 | }
|
5 MHz sind eindeutig zu viel. Der ADNS kann laut Datenblatt max. 1MHz. Aber wenn ich mir nicht sicher bin, ob überhaupt eine Verbindung aufgebaut wird, würde ich das sicherheitshalber nicht ausreizen. 5Hz sind wirklich sehr/zu langsam. du kannst schon in den xxxKHz Bereich vordringen. Wie hast du den Sensor wo angeschlossen? Ist der Sensor ausgelötet/bzw die Verbindung zum µC auf der Maus getrennt? Hat der ADNS die Minimalbeschaltung? Wenn du einen LA hast, dann beobachte einmal die Kommunikation.
Da ist aber noch irgendeine andere Hardware im Spiel, denn normalerweise kennt ein Windows System ja keine SPI Devices von sich aus. Diese Hardware muss auch erstmal auf sinnvolle Signale abgeklopft werden, bevor man sich mit dem ADNS Sensor beschäftigt. Dazu könnte es u.U. sogar möglich sein, MOSI und MISO der Hardware miteinander zu verbinden und mal was zu senden und gleichzeitig zu empfangen. Wenn das funktioniert, gehts weiter zum Sensor.
:
Bearbeitet durch User
Karl F. schrieb: > ich habe gerade die Maus geschlachtet und wollte erstmal nur über die > SPI auslesen, ob er den Master erkannt hat. Wo und wie angeschlossen und welcher "Master"? Du solltest das Datenblatt des Sensors besorgen und genau(!!) durchlesen und einhalten. Die Dinger sind recht eigen, was das Timing auf dem Bus angeht.
Vielen Dank für die ganzen Antworten. Ich habe die Maus ausgeschlachtet. An der Logik habe ich nichts verändert, lediglich drei Kabel gelötet; SDIO, SCLK und CS. Mit diesen Leitungen gehe ich an dem Controller. Da ich zusammengesetzte SDIO Leitung habe, habe ich erstmal auf dem Controller die MOSI und MiSO Leitung miteinander verbunden und dann die SDIO Leitung in Reihe zu MOSI gelegt. Als Maximale Frequenz sind die 1MHz angesehen. Doch auch mit 1 MHz flackert es. Eine Verbindung sollte theorisch, nach dem Code oben, aufgebaut sein, sonst müsste eine Fehlermeldung kommen, oder? Der Master ist mein u-Controller(Rasberry Pi3) Habe an dem ADNS nichts verändert. Originalschaltung, lediglich nur die drei Leitungen dran gelötet. Was mir aber beim löten aufgefallen ist, das der PIN für CS und Nreset am ADNS zusammengelötet waren.. macht das Sinn?
Matthias S. schrieb: > Da ist aber noch irgendeine andere Hardware im Spiel, denn > normalerweise kennt ein Windows System ja keine SPI Devices von sich > aus. Diese Hardware muss auch erstmal auf sinnvolle Signale abgeklopft > werden, bevor man sich mit dem ADNS Sensor beschäftigt. Dazu könnte es > u.U. sogar möglich sein, MOSI und MISO der Hardware miteinander zu > verbinden und mal was zu senden und gleichzeitig zu empfangen. Wenn das > funktioniert, gehts weiter zum Sensor. Wie meinst du das? Wie kann ich die Hatdware denn testen? Bin in dieser Ebene ziemlich neu, deswegen frage ich so ?
Karl F. schrieb: > An der Logik habe ich nichts verändert Das ist eines deiner Hauptprobleme. Deine Maus besitzt neben dem Sensor noch einen uC, der Steuerungsaufgaben übernimmt und nur die Mausbewegungen deinem Computer vmtl. über USB mitteilt. Wenn der weiterhin in Betrieb ist, brauchst du dich nicht wundern, wenn nichts funktioniert. Karl F. schrieb: > auf dem Controller die MOSI und MiSO Leitung miteinander > verbunden und dann die SDIO Leitung in Reihe zu MOSI gelegt Mosi und Miso zu verbinden ist schon mal richtig. Das ergibt SDIO. Was meinst du mit "in Reihe gelegt"? Karl F. schrieb: > Doch auch mit 1 MHz flackert es Warscheinlich stört dein Raspi die Kommunikation zwischen dem "Maus-uC" und dem Sensor. Ich gehe davon aus, dass du den Sensor auslesen möchtest. Dabei ist es ersteinmal egal, ob es blinkt oder leuchtet, er besitzt nämlich eine Stromsparfunktion, die die LED nur bei Bedarf einschaltet. Du benötigst dafür einen funktionierenden Treiber, der die SPI Schnittstelle/IO-Pins des SBCs richtig ansteuert. Das Timing kannst du dem Datenblatt des Adns 5020 entnehmen. Eine Ui zur Anzeige der Daten ist auch nötig. Dann versuche zuerst einmal ein Register mit bekanntem Inhalt (siehe Datenblatt) bei einer Busfrequenz von zB. 100KHz auslesen. Ob Windows UWP dafür geeignet ist, bezweifle ich. Tipps: Lese das Datenblatt!! Befasse dich mit der Spi-Schnittstelle des Raspis.
Karl F. schrieb: > An der Logik habe ich nichts verändert, lediglich drei Kabel gelötet; > SDIO, SCLK und CS. Mit diesen Leitungen gehe ich an dem Controller. Das kann nicht funktionieren, denn diese Leitungen führen ja schon Signale. Du erzeugst da eine Buskollision. Dabei kommt nichts sinnvolles raus.
Mein Gott, was soll das ganze werden? Linux und SPI schreit schon mal aus Erfahrung nach Problemen, besonders bei echtzeitrelevanten Sachen wie Maussensoren. Also die Sache mit dem Raspi schon mal der falsche Ansatz, abgesehen vom Aufwand, einen SPI-Treiber mit garantiertem Timing hinzukriegen, da musst du dich mit RT-Erweiterungen beschäftigen. Keep it simple, fang mit einem uC an. Ich habe für vernünftige Positionserkennung damals einen DSP-Hybriden eingesetzt. Was ist deine Zielanwendung?
Sollte ich eher auf ein Arduino umsteigen um das zu lösen? Das Problem beim Arduino war, dass es keinen integrierte Ethneret Anschluss gab. Dafür gibt es nur einen Shield, was mir aber die SPI Pins wegnimmt. Und ein weiteres Problem ist, ich habe nicht nur eine Maus, sondern 3 Mäuse. Diese drei Mäuse brauchen jeweils eine SS Leitung. Das Arduino hat aber nur einen. Generell zu meinem Projekt: Ich will die Delta_Y Daten von drei Mäusen auslesen und in einem Server erstmal speichern. Dafür habe ich mir die ADNS5020 ausgesucht, weil es eine SDIO Leitung hat. Hatte mich direkt für Windows entschieden, da ich mit Linux kaum Ahnung hatte. Jetzt die Frage, welchen Controller sollte ich am besten für dieses Projekt nutzen? Komme ich mit dem Raspberry Pi nicht weit? Würde mich um Tipps freuen.. PS: Ich habe erweiterte Kenntnisse in Programmierung ( C/C++ ). Kann mich aber mit Python oder C# auch anfreunden.
Karl F. schrieb: > Das Problem beim Arduino war, dass es keinen integrierte Ethneret > Anschluss gab Du kannst ja deine Sensoren mit dem Arduino/AVR auslesen und die Daten dann über TWI oder UART weitergeben. Karl F. schrieb: > Diese drei Mäuse brauchen jeweils eine SS Leitung. Das > Arduino hat aber nur einen Beim AVR muss man die SS Leitung(en) manuell bedienen. Dabei ist es theoretisch möglich alle freien IO-Pins als SS Leitungen zu benutzen und zig Slaves anzuschliessen. Karl F. schrieb: > welchen Controller sollte ich am besten für dieses > Projekt nutzen? Prinzipiell ist es Egal, aber wenn du schon Erfahrung mit halbwegs aktuellen µCs hast, dann nim den, den du kennst. Wenn du einen Arduino rumliegen hast, bietet es sich an den AVR darauf (der Atmega 328 @16-20 MHz ist ausreichend und auf vielen Arduino-Boards) zu nutzen. AVRs sind auch nicht sehr komplex. Von den Arduino Librarys kann man nur abraten, die Besitzen nämlich viel overhead. Zur Nutzung der Standardlibs gibt es hier im Forum ein sehr gutes Tutorial. Es müsste möglich sein diese Libs auch in die Arduino "IDE" einzubinden. Ansonsten nim das Atmel Studio und einen vernünftigen, externen Programmer. Mit am meisten Dampf haben die 32Bit ARM Cortex M. Die spielen aber auch von der Komplexität her in einer ganz anderen Liga. Jeder wird dir auf diese Frage etwas anderes empfehlen. Kaufe dir auf jeden Fall einen Logic Analyser, ein Saleae-Clone für 12€ reicht ersteinmal aus. Sowas ist gerade zum Debuggen von Bussystemen äußerst hilfreich. Karl F. schrieb: > Ich habe erweiterte Kenntnisse in Programmierung ( C/C++ ) Das erleichtert dir den Einstieg in die Welt der µCs enorm, denn was anderes benötigst du dafür nicht.
Moin, Karl F. schrieb: > Sollte ich eher auf ein Arduino umsteigen um das zu lösen? > Wenn du nur mal die HW evaluieren willst: Ja, warum nicht. Wenn es eine robuste industrielle Anwendung werden soll: Vergiss es. > Das Problem beim Arduino war, dass es keinen integrierte Ethneret > Anschluss gab. Dafür gibt es nur einen Shield, was mir aber die SPI Pins > wegnimmt. Und ein weiteres Problem ist, ich habe nicht nur eine Maus, > sondern 3 Mäuse. Diese drei Mäuse brauchen jeweils eine SS Leitung. Das > Arduino hat aber nur einen. > Wozu brauchst du drei Mäuse? > Generell zu meinem Projekt: Ich will die Delta_Y Daten von drei Mäusen > auslesen und in einem Server erstmal speichern. Dafür habe ich mir die > ADNS5020 ausgesucht, weil es eine SDIO Leitung hat. Hatte mich direkt > für Windows entschieden, da ich mit Linux kaum Ahnung hatte. > Vergiss mal Windows/Linux, und schau, dass du den Sensor mal so nackt angesteuert kriegst. Tauchen dann noch genügend Probleme auf...je nach deiner Anwendung. > Jetzt die Frage, welchen Controller sollte ich am besten für dieses > Projekt nutzen? Komme ich mit dem Raspberry Pi nicht weit? Würde mich um > Tipps freuen.. > Das kann dir keiner richtig sagen, wenn du nicht mit Fakten/Anforderungen zur Zielanwendung rausrückst. Wenn du eine saubere Positionserkennung in X/Y/Z hinkriegen willst: Die richtig kniffligen Sachen kommen noch. Genau deswegen hatten wir damals dafür ein DSP-Framework entwickelt (Timing ist alles). Und dann musst du die richtigen Sensoren nehmen... Für industrielle Anwendung würde ich nach der Uebernahme von Avago durch Broadcom komplett von den ADNS absehen, das hat damals schon in Gefrickel ausgeartet, und mit handelsüblichen Global-Shutter-Sensoren kriegt man das gleiche besser hin und hat noch mehr Möglichkeiten (Rotation, ...)
InFo schrieb: > Mit am meisten Dampf haben die 32Bit ARM Cortex M. Die spielen aber auch > von der Komplexität her in einer ganz anderen Liga. Es würde nur dann einen Sinn haben, wenn man unbedingt viele Hardware SPI Schnittstellen braucht. M.W. hat der grösste ATMega nur 2, wovon eines auch zur Programmierung belegt wird. Das man Bitbanging machen kann, also einfach Pins im Programm wackelt, kann man dem TE vermutlich jetzt noch nicht aufdrücken, so kann das dann natürlich jeder AVR mit ausreichend Portpins. Man kann auch jedem Sensor seinen eigenen AVR spendieren, muss sich dann aber überlegen, wie man die Daten zusammenführt.
:
Bearbeitet durch User
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.