Forum: Compiler & IDEs SRF10 an ATMega16


von Andy aus Tirol (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Uwe .. (uwegw)


Lesenswert?

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.

von Uwe .. (uwegw)


Angehängte Dateien:

Lesenswert?

Im Anhang die hex, Ausgabe über Uart mit 9600 Baud, 16MHz Takt.

von Oliver (Gast)


Lesenswert?

Die Fleury-I²C-Rutinen geben Fehlercodes zurück. Hast du die mal 
ausgewertet?

Oliver

von Andy aus Tirol (Gast)


Lesenswert?

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

von Andy aus Tirol (Gast)


Lesenswert?

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

von Andy aus Tirol (Gast)


Angehängte Dateien:

Lesenswert?

...hier die hex..

von Andy aus Tirol (Gast)


Lesenswert?

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

von Andy aus Tirol (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.