Hallo zusammen, die bisher abgehandelten Beiträge waren leider nicht so hilfreich und etwas weiter zurückliegend, deshalb nun ein neuer... Ich habe Probleme beim Auslesen eines Ultraschallsensor SRF10. Hardware: Mega16, 16 MHZ, am I2C hängt der Sensor. Pullups 10k, I2C Clock 111kHz. Adresse SRF10: 0xE0 Software: WinAVR, AVR Studio 4, twimaster.c und I2Cmaster.h von Peter Fleury (.c Datein sind zwar für SRF08 geschrieben, sollten aber auch für srf10 vom Prinzip her funkionieren.) Problembeschreibung: Nach dem Rüberspielen blinkt der Sensor. Laut Datenblatt tut er dies bei jedem Aussenden eines US Impulses. Dies ist also normal. Über die UART / Hyper Terminal wird stolz der Wert 0 ausgegeben, was nicht sein kann. Verstärkungsfaktoren und Reichweiten x mal ausprobiert. Fragestellungen an die Spezialisten Etwas scheint beim Auslesen nicht richtig zu sein. Wie kann es sein, dass er ständig 0 ausgibt? void srf08_auslesen(void) { if(srf08_ready()) { i2c_start(SRF08_adress+I2C_WRITE); i2c_write(0x01);//Ergebnisregister wählen i2c_rep_start(SRF08_adress+I2C_READ); //SRF08_light= i2c_readAck(); SRF08_messwert = ((i2c_readAck())<<8); //highbyte SRF08_messwert += (i2c_readNak()); //lowbyte i2c_stop(); } } Wie kann ich ausschließen, dass nicht das Modul im Eimer ist? Hat jemand eine hex, die mal probehalber rüberspielen kann, um ein Defekt auszuschließen. Über jeden sinnvollen Beitrag dazu wäre ich sehr dankbar. Danke schon mal für Eure Zeit.
Wenn man genau hinhört, bemerkt man bei jedem Ultraschallimpuls ein Knacken. Daran kann man erkennen, ob überhaupt ein Impulse gesendet wird. Aber das sollte eigentlich der Fall sein, wenn die LED blinkt. Der Code für den SRF08 stammt von mir, und ich habe ihn gerade noch mal getestet. Nachdem ich den Wackelkontakt im Stecker gefunden habe, funktioniert er einwandfrei. Ich habe bloß den Code auf mein Board angepasst, und den gain-Wert erhöht.
Die Fleury-I²C-Rutinen geben Fehlercodes zurück. Hast du die mal ausgewertet? Oliver
Hallo Leute, vielen Dank für schnelle Antwort. Schon, mal den Autor kennenzulerenen... Also ein Knacken am Sensor beim Senden kann ich nicht wahrnehmen. Die Peter Feury Dateien geben bei mir keinerlei Fehlermeldungen, nicht einmal Warnungen. Uwe, ich verwende ja nun NICHT den SRF08, sondern den SRF10. In Deiner srf08_auslesen (void) steht, i2c_write(0x01);//Ergebnisregister Lichtsensor wählen Der SRF10 hat nun keinen Lichtsensor. Heißt dass, dass ich diese Zeile rauskommentieren muss bzw. 0x02 / 0x03 für das Auslesen des Registers für die Entfernung wählen muss? Ich danke Dir für die hex Datei. Ich werde es damit mal testen und ein Feedback geben. Schönen Abend Gruß Andy
Hallo Leute, ich habe die main.hex einmal ausprobiert. Die Kommunikation funktioniert (LED blinkt), aber dennoch wird über die UART permanent der Wert 0 ausgegeben. Für mich ein klares Zeichen, dass das Modul im Eimer ist. Was das Fehlen des Knackens erklärt. (Hört man das wirklich deutlich?) Im Anhang mal meine hex. Wenn Du mal ganz viel Zeit und Lust hast sie auszuprobieren...muss aber net sein. Ich wende mich mal an den Verkäufer des Modules. Mal sehen, was sich machen lässt. Nochmals vielen Dank. Andy
Hallo Leute, der Umtausch des Modules brachte leider nichts. Keine Änderungen, trotz blinkender LED gibt es ständig den Wert Null raus. Deshalb: Hat jemand von euch schon mal das SRF10 zum Laufen bekommen? Wenn ja, könnte ihr mit bitte einen Hinweis geben, ob ihr ähnliche Probleme hattet? Danke Euch Andy
Hallo zusammen, nachdem ich noch mal so einiges versucht habe, das SRF10 zum Laufen zu bekommen, bin ich allmählich betriebsbild. Könntet Ihr bitte einen Blick auf den Quellcode werfen. Das Auslösen der Messung geht, der Sensor blinkt entsprechend. Aber wie lese ich den gemessenen Wert aus? Wo der Fehler beim Auslesen der Daten liegt, kann ich nicht nachvollziehen. Er gibt ständig Null zurück. Auch das Auslesen der Firmware geht nicht. Die I2C Routinen stammen von Peter Fleury. I2c Init, 110kHz CLK, Pullups usw. ist alles in Ordnung. Da stimmt was prinzipelles beim Auslesen nicht.
1 | // Testprogrmm SRF10 am ATMega16
|
2 | // Crystal: 16.000Mhz
|
3 | // Software: winAVR, AVR Studio4,GCC
|
4 | |
5 | |
6 | #include <avr/io.h> |
7 | #include <avr/interrupt.h> |
8 | #include <stdio.h> |
9 | #include <util/twi.h> |
10 | |
11 | unsigned int Firmware; |
12 | char Puffer [10]; |
13 | double D; |
14 | int H, L; |
15 | |
16 | #define SRF10_ADR 0xE0
|
17 | |
18 | |
19 | |
20 | void read_Firmware(void) |
21 | {
|
22 | i2c_start_wait(SRF10_ADR+TW_WRITE); // set device address and write mode |
23 | i2c_write(0x00); |
24 | i2c_stop(); // write address = 0 |
25 | i2c_rep_start(SRF10_ADR+TW_READ); // set device address and read mode |
26 | Firmware = i2c_readNak(); |
27 | i2c_stop(); |
28 | |
29 | //Ausgabe
|
30 | sendUART(utoa(Firmware, Puffer, 10)); |
31 | sendUART(" ; "); |
32 | }
|
33 | |
34 | |
35 | |
36 | void Messung(void) |
37 | {
|
38 | //Verstärkung setzen,sende START Condition, Verstärkungsregister wählen, beschreiben mit 7
|
39 | i2c_start(SRF10_ADR + TW_WRITE); |
40 | i2c_write(0x01); |
41 | i2c_write(0x07); |
42 | i2c_stop(); |
43 | |
44 | //Reichweite setzen, sende START Condition, Reichweitenregister wählen, beschreiben für 1m
|
45 | i2c_start_wait(SRF10_ADR + TW_WRITE); |
46 | i2c_write(0x02); |
47 | i2c_write(0x18); |
48 | i2c_stop(); |
49 | |
50 | //Messung starten, sende START Condition, Befehlsregister wählen, messen in cm
|
51 | i2c_start_wait(SRF10_ADR + TW_WRITE); |
52 | i2c_write(0x00); |
53 | i2c_write(0x51); |
54 | i2c_stop(); |
55 | |
56 | //warten
|
57 | Delay_ms(200); |
58 | |
59 | //Daten auslesen, sende START Condition, Leseregister wählen
|
60 | i2c_start(SRF10_ADR + TW_WRITE); |
61 | i2c_write(0x02); |
62 | |
63 | //wechseln in Lesemodus, high byte lesen, low byte lesen, Berechnung Distance
|
64 | i2c_start_wait(SRF10_ADR+TW_READ); |
65 | H = i2c_readAck(); |
66 | L = i2c_readNak(); |
67 | |
68 | D = (H << 8) + L; |
69 | |
70 | //Ausgabe UART
|
71 | sendUART(utoa(D, Puffer, 10)); |
72 | }
|
73 | |
74 | void main (void) |
75 | { .... |
76 | }
|
Ich bin jeden Tipp sehr dankbar.
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.