-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: SRF02 I2C C-Quellcode (RN-Control)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24

    SRF02 I2C C-Quellcode (RN-Control)

    Anzeige

    Guten Abend.

    Ich bastel derzeit an der Kollisionserkennung meines Roboters (Basis:RN-Control) und habe mir dafür einen SRF02 bestellt. Das Ganze hängt bereits an dem I2C Bus. Wenn ich das Netzteil anschließe und das Board mit Strom versorge, dann leuchtet die rote LED am SRF02 kurz auf.

    Mein Problem:
    Ich Suche nun seit mehreren Tagen nach einem vernünftigen Quellcode in der Programmiersprache C, an dem ich mich orientieren kann. Der Hersteller liefert leider nur Bascom und hier im Forum gibt es zwar viele Beispiele, jedoch sind die dann immer gleich so komplex, dass ich kaum was verstehe und es selbst kaum testen kann. Ich habe natürlich schon vieles ausprobiert, es tut sich jedoch leider nichts. Nicht einmal die Lampe vom SRF02 leuchtet noch einmal auf. Sie leuchtet nicht einmal mit einem klick auf den "Resetknopf" auf dem Board auf. Erst wenn ich die Stromversorgung wegnehme und wieder anschließe gibts ein kurzes aufleuchten.
    Ich habe gelesen, dass es vielleicht an den Pull-up Widerständen liegen kann, aber die sind bei einem RN-Control doch schon integriert.

    Hat jemand ein Beispiel, an dem sich Anfänger wie ich, die in C programmieren, orientieren können?
    Das wär echt super!

    lG Tobi

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24
    Soo.. nach langer Recherche bin ich gerade auf folgendes gestoßen:

    http://www.rn-wissen.de/index.php/SRF08_mit_avr-gcc


    Dort ist ein Beispiel in C, wie man einen SRF08 ansteuert. Ob das auch bei mir funktioniert, werde ich in den nächsten Tagen feststellen.

    mfg Tobi

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.04.2010
    Ort
    Wien
    Beiträge
    119
    Blog-Einträge
    4
    hast du es schon geschafft?
    ich möchte mir auch einen srf02 zulegen,
    bin aber noch unsicher ob analoge auswertung nicht vielleicht einfacher wäre,
    da ich keine Ahnung von I2C habe
    und ebenfalls keine passenden Beispiele in C finde


    mfg michi
    Infos zu meinen Projekten gibts auf meiner Homepage: http://langeder.org/

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24
    HI, ich habe zwar den I2C Bus ansteuern können, habe aber immer noch einige Probleme mit der Ansteuerung der SRF02.

    programm hab ich hier her:
    http://www.rn-wissen.de/index.php/SRF08_mit_avr-gcc

    w
    erde in Kürze den Bus ausmessen, vielleicht liegt es an den Pullup-Widerständen...


    mfg tobi

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.04.2010
    Ort
    Wien
    Beiträge
    119
    Blog-Einträge
    4
    die internen Pull-Ups sind zu hoch, falls du die verwendest,
    du musst unbedingt 2k2 extern anschließen.

    edit: du musst auch die Adresse ändern (#define SRF08_adress 0xE0), die müsste im Datenblatt stehen.


    mfg michi
    Geändert von miicchhii (21.07.2011 um 21:30 Uhr)
    Infos zu meinen Projekten gibts auf meiner Homepage: http://langeder.org/

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24
    ja die verwende ich.. Sind zu hoch? shit.. okay dann ist das die erste Sache dich ich machen werde.
    vielen dank!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24
    edit: du musst auch die Adresse ändern (#define SRF08_adress 0xE0), die müsste im Datenblatt stehen.
    Im Datenblatt steht folgendes:
    "Die Standard-Hausnummer vom SRF02 ist Hex 0xE0"

    dann muss ich ja alles so lassen, wie es ist, richtig?

    Ich werde jetzt gleich die Pullups einlöten

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.04.2010
    Ort
    Wien
    Beiträge
    119
    Blog-Einträge
    4
    Ja, ich denke so müsste es dann eh passen,
    ich weiß auch nur was ich lese,
    so ein teil leg ich mir demnächst auch zu,
    was für Sensoren verwendest du sonst noch auf deinem bot?

    PS: schon eingelötet bzw getestet?

    Mfg michi
    Geändert von miicchhii (23.07.2011 um 12:36 Uhr)
    Infos zu meinen Projekten gibts auf meiner Homepage: http://langeder.org/

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24
    hi.. ich habe soeben 2x 10k zwischen 5V und SDA sowie SCL eingelötet. ohne Erfolg
    Habe 10k genommen, weil ich kein 2,2 da hatte und es auch in einem anderen Thread gelesen hatte.
    Es kann doch nicht daran liegen oder?

    Ich habe bisher folgendes gemacht:
    1. Einen anderen SRF02 ausprobiert.
    2. Pullup wiederstände eingelötet
    3. viele Änderungen im Code

    Ich benutze bisher nur diesen einen SRF02 Sensor.

    Folgenden Code:

    Hauptprogramm:
    Code:
    //#include <stdlib.h> 
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "rncontrol.h"
    #include "SRF08.h"
    
    
    
    
    
    
    
    
    /*### Variablen ###*/
    //char wort[5];	//Zahlen (Integer und Float) müssen vor der Ausgabe per RS232 in ASCII-Zeichen konvertiert werden, für die ein Speicher benötigt wird.
    //const float referenzspannung = 0.0048828125;	//Referenzwert zur Multiplikation mit den Werten der Analogports (0...1023), um auf die Voltzahl zu kommen (0...5). Ergibt sich aus 5/1024.
    //uint16_t analog; //Variable für jeweils an einem Analogport gemessenen Wert, um nicht für eine Ausgabe mehrere Messungen durchführen zu müssen.
    
    
    
    
    /*### Hauptschleife ###*/
    int main(void)
    {
    	//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
    	//DDRA |= 0x00;	//00000000 -> alle Analogports als Eingänge
    	//DDRB |= 0x03;	//00000011 -> PORTB.0 und PORTB.1 sind Kanäle des rechten Motors
    	//DDRC |= 0xFF;	//11111111 -> PORTC.6 und PORTC.7 sind Kanäle des linken Motors, Rest sind LEDs für Lauflicht
    	//DDRD |= 0xB0;	//10110000 -> PORTD.4 ist PWM-Kanal des linken Motors, PORTD.5 des rechten
    	
    	//Initialisierungen
    	//setportcon(0); setportcon(1); setportcon(2); setportcon(3); setportcon(4); setportcon(5); //LEDs ausschalten
    	setportdoff(7);	//Speaker aus
    	//init_timer1();	//Initialisierung Timer für PWM
    	init_USART();	//USART konfigurieren
    	//SFIOR &= ~(1<<PUD);     // Pull-UP enable (nicht unbedingt nötig, aber zur Klarheit!)
            //PORTA |= (1<<PA7);    // internen Pull-Up an PA7 aktivieren 
    
    
    
    
    	//timer1 für 10ms-Interrupt starten
    	TIMSK |=(1<<OCIE1A); //ctc interrupt
    	TCCR1B |=(1<<CS12) | (1<<CS10); //Prescaler 1024
    	TCCR1B |=(1<<WGM12);	//Clear Timer on Compare Match Modus
    	OCR1A = 0x009C; 	//Compare auf 10ms bei 8MHz setzen
    
    
    	sendUSART("---------------------------------------------Start 1\r\n");
    
    
        sei();
        start_SRF08_automessung(); //Messung beginnen
        uint16_t messwert; 
        while(1)
        {
        messwert=get_SRF08_distance();
        sendUSART("Messerwert empfangen!\n");
        }
    
    
    }
    
    
    
    
    ISR(TIMER1_COMPA_vect) //wird alle 10ms aufgerufen
    {
    sendUSART("Timer Startet\n");
    	SRF08_task(); 
    }

    twimaster.c
    Code:
    unsigned char i2c_start(unsigned char address){
        uint8_t   twst;
    
    
    	// send START condition
    	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    sendUSART("Hier wird noch ausgeführt!\n");
    	// wait until transmission completed
    	while(!(TWCR & (1<<TWINT)));
    sendUSART("Hier leider nicht mehr!\n");
    	// check value of TWI Status Register. Mask prescaler bits.
    	twst = TW_STATUS & 0xF8;
    	if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
    
    
    	// send device address
    	TWDR = address;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    
    
    	// wail until transmission completed and ACK/NACK has been received
    	while(!(TWCR & (1<<TWINT)));
    
    
    	// check value of TWI Status Register. Mask prescaler bits.
    	twst = TW_STATUS & 0xF8;
    	if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ){
    	 return 1;
    }
    	return 0;
    
    
    }/* i2c_start */
    Folgende Ausgabe über RS232:
    Code:
     ---------------------------------------------Start 1Timer Startet
    Hier wird noch ausgeführt!

    Wenn ich das Programm starte, initialisiert er den Timer, welcher DIREKT den SRF08_task(); Befehl startet ohne dass vorher I2C initialisiert wurde. So steht es in dem Programm bei RN-Wissen.
    Wenn ich das veränder, also die Initialisierung des I2C der Initialisierung des Timers vorziehe, funktionierts aber auch nicht.

    Grob gesagt, bleibt er an folgender Stelle im twimaster.c hängen:
    Code:
    // wait until transmission completed
    	while(!(TWCR & (1<<TWINT)));

    Vielen Dank für eure Hilfe!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2007
    Beiträge
    24
    Achja: und folgende Frequenzen:




    /* define CPU frequency in Mhz here if not defined in Makefile */
    #ifndef F_CPU
    #define F_CPU 8000000UL
    #endif


    /* I2C clock in Hz */
    #define SCL_CLOCK 100000L

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. LDR Quellcode
    Von Jada im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 03.06.2010, 20:26
  2. Errors im Quellcode
    Von Kieselstein im Forum Asuro
    Antworten: 16
    Letzter Beitrag: 17.05.2008, 18:33
  3. Srf02 an C-control Mega 128
    Von Tenorm im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 02.03.2008, 00:20
  4. Antworten: 0
    Letzter Beitrag: 19.01.2008, 15:09
  5. Suche C-Control Quellcode für Roboter Navigation
    Von HiTech im Forum Software, Algorithmen und KI
    Antworten: 41
    Letzter Beitrag: 16.01.2004, 19:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •