- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: I²C und Kompass CMPS03 auslesen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119

    I²C und Kompass CMPS03 auslesen

    Anzeige

    Praxistest und DIY Projekte
    Hallo, hat jemand nen Beispiel in C für das auslesen des Kompass-Moduls ?
    Ich bin noch Umsteiger von Bascom auf C ...

    Danke

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.12.2004
    Alter
    39
    Beiträge
    287
    Nimm eine normale I2C Routine die Adressen und befehle stehen sicher im Kompassmodul Datenblatt.

    mfg
    The future is closer then you think!

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Gib mir mal deine Mail in meine Post, dann schicke ich dir einen Schwung Win-Avr-c-Programme. Die funktionieren Alle. Vom Compass über I2c-EEProm bis zur UART und LCD. Musst nur das Make-File selber erstellen und natürlich bei einigen die ASM.S-programme mit anbinden inder Make.

    Castle

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    Hallo, ich hab mir nun aus verschiedenen Qullen etwas zusammen gebastelt und benutze die twimaster.c (eingebunden über Makefile)
    also so sieht nun meine Methode zum lesen des CMPS03 über I2C aus:
    Code:
    int read_compass()
    {  
    	int data;
    	
    	i2c_start(0xc0); 	// start the I2C bus
    	i2c_write(0xc1); 	// device address of the compass
    	i2c_write(1);		  // memory address first part
    	
    	i2c_start(0xc0);	// restart
    	i2c_write(0xc1);	// device address, reading in this case
    
    	data=i2c_readAck();	// read 1 byte 
    	
    	i2c_stop();			// stopp 
    	
    	return data; 		// return the number of direction 
    }
    so weit so gut, doch ich bekomme immer den wert "193", ich weiß aber leider nicht warum !!!

    Kann mir jemand helfen ?

    Danke

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Nach dem zweiten Start, bei dem du die Addresse 0xc1 statt 0xc0 verwenden musst, da du lesen willst und nicht schreiben, musst du gleich lesen und nicht erst nochmal was schreiben. Generell kann es nicht funktionieren, dass man ohne restart zwischen Senden und Empfangen wechselt.
    Und der Wert, den du erhältst(193) entspricht genau den 0xc1, die du vor dem lesen sendest. Daher steht der Wert noch im Register TWDR, das du dann nach dem Senden wieder ausliest.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    so und hier noch mal die Methode aber jetzt funktioniert es :
    Code:
    int read_compass()
    {  
    	int data;	
    
    	i2c_start(0xc0); 	// start the I2C bus	
    	i2c_write(0xc1); 	// device address of the compass	
    	i2c_write(1);		// memory address first part	
    	i2c_stop();	
    
    	i2c_start(0xc1);		// restart			
    	data =  i2c_readAck();	// read 1 byte 
    	data += i2c_readNak();	// read 1 byte 	
    	i2c_stop();			// stopp 	
    
    	return data; 		// return the number of direction 
    }
    Vielen Dank an Pascal !!!

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    ich Suche noch nach einer routine für das cmps03modul.

    wie sieht deine programmsammlung aus für dieses ausgabe.

    castle

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    Was sucht du denn genau ???

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    eine routine (programm)von winavr-c um das compassmodul cmps03 auszulesen.

    Castle

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    Hallo, um den Kompass auszulesen benutze ich folgenden Code:
    Code:
    int read_compass()
    { 
       int data;   
    
       i2c_start(0xc0);    // start the I2C bus   
       i2c_write(0xc1);    // device address of the compass   
       i2c_write(1);      // memory address first part   
       i2c_stop();   
    
       i2c_start(0xc1);      // restart         
       data =  i2c_readAck();   // read 1 byte
       data += i2c_readNak();   // read 1 byte    
       i2c_stop();         // stopp    
    
       return data;       // return the number of direction
    }
    Der war ja schon weiter oben zu sehen, und damit das ganze noch funktioniert, musst du die TWI.h (avr/include) und die twi_cmps.h/.c einbinden. (googlen oder mal ne Mail an mich, hab den Link leider nicht mehr)... so und dann sollte es funktionieren ....
    Viel Erfolg!!!

Berechtigungen

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

Solar Speicher und Akkus Tests