mikrocontroller.net

Forum: Compiler & IDEs SRF10 an ATMega16


Autor: Andy aus Tirol (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe ... (uwegw)
Datum:
Angehängte Dateien:

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

Autor: Oliver (Gast)
Datum:

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

Oliver

Autor: Andy aus Tirol (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy aus Tirol (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy aus Tirol (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...hier die hex..

Autor: Andy aus Tirol (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy aus Tirol (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

// Testprogrmm SRF10 am ATMega16
// Crystal: 16.000Mhz
// Software: winAVR, AVR Studio4,GCC


#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/twi.h>

unsigned int Firmware;
char Puffer [10];
double D;
int H, L;

#define SRF10_ADR 0xE0
 


void read_Firmware(void)
{
 i2c_start_wait(SRF10_ADR+TW_WRITE);     // set device address and write mode
 i2c_write(0x00);
 i2c_stop();                        // write address = 0
 i2c_rep_start(SRF10_ADR+TW_READ);       // set device address and read mode
 Firmware = i2c_readNak();
 i2c_stop();

 //Ausgabe
 sendUART(utoa(Firmware, Puffer, 10));
 sendUART(" ; ");
}



void Messung(void)
{
//Verstärkung setzen,sende START Condition, Verstärkungsregister wählen, beschreiben mit 7
 i2c_start(SRF10_ADR + TW_WRITE);
 i2c_write(0x01);
 i2c_write(0x07);
 i2c_stop();
 
 //Reichweite setzen, sende START Condition, Reichweitenregister wählen, beschreiben für 1m
 i2c_start_wait(SRF10_ADR + TW_WRITE);
 i2c_write(0x02);
 i2c_write(0x18);
 i2c_stop(); 

 //Messung starten, sende START Condition, Befehlsregister wählen, messen in cm
 i2c_start_wait(SRF10_ADR + TW_WRITE);
 i2c_write(0x00);
 i2c_write(0x51);
 i2c_stop();

 //warten
 Delay_ms(200);

 //Daten auslesen, sende START Condition, Leseregister wählen
 i2c_start(SRF10_ADR + TW_WRITE);
 i2c_write(0x02);               

 //wechseln in Lesemodus, high byte lesen, low byte lesen, Berechnung Distance
 i2c_start_wait(SRF10_ADR+TW_READ);
 H = i2c_readAck();
 L = i2c_readNak();
 
 D = (H << 8) + L;
 
 //Ausgabe UART
 sendUART(utoa(D, Puffer, 10));
}

void main (void)
{ ....
}

Ich bin jeden Tipp sehr dankbar.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.