- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 1 von 1

Thema: HMC5883L auslesen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355

    HMC5883L per I2C auslesen

    Anzeige

    Praxistest und DIY Projekte
    Hallo RN-Gemeinde!

    Habe hier einen HMC5883L und möchte diesen über I2C auslesen. Ich verwende dazu die I2C-Lib von P. Fleury.

    Mein Code sieht folgendermaßen aus:
    Code:
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    
    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include "twimaster.c"
    
    #define HMC5883L 0x1E // device address
    
    int16_t raw_x = 0;    
    int16_t raw_y = 0;
    int16_t raw_z = 0;
    
    char buffer[10];
    
    void init_HMC5883L(void){
        
        sendUSART("Initializing HMC5883L...");
        
        
        i2c_start(HMC5883L+I2C_WRITE); 
        i2c_write(0x00); // set pointer to CRA
        i2c_write(0x70); // write 0x70 to CRA
        i2c_stop();
            
        i2c_start(HMC5883L+I2C_WRITE); 
        i2c_write(0x01); // set pointer to CRB
        i2c_write(0xA0); 
        i2c_stop();
            
        i2c_start(HMC5883L+I2C_WRITE); 
        i2c_write(0x02); // set pointer to measurement mode
        i2c_write(0x00); // continous measurement
        i2c_stop();
        
        sendUSART("Done!");
    }
    
    void getHeading(void){
        
        i2c_start_wait(HMC5883L+I2C_WRITE);
        i2c_write(0x06);
        i2c_stop();
        
        i2c_rep_start(HMC5883L+I2C_READ); 
    
        raw_x = (raw_x << 8) | i2c_readAck();
        raw_x |= i2c_readAck();
        
        raw_z = (raw_z << 8) | i2c_readAck();
        raw_z |= i2c_readAck();
        
        raw_y = (raw_y << 8) | i2c_readAck();
        raw_y |= i2c_readNak();
        
        i2c_stop();
        
        i2c_rep_start(HMC5883L+I2C_WRITE);
        i2c_write(0x03);
        i2c_stop();
    }
    
    void init_USART(void)
    {
        UCSRB |= (1<<TXEN);    //UART TX (Transmit - senden) einschalten
        UCSRC |= (1<<URSEL)|(3<<UCSZ0);    //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)
        UBRRH = 0;                //Highbyte ist 0
        UBRRL = 103;    //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!
    }
    
    void sendchar(unsigned char c)
    {
        while(!(UCSRA & (1<<UDRE))) //Warten, bis Senden möglich ist
        {
        }
        
        UDR = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle
    }
    
    void sendUSART(char *s) //*s funktiniert wie eine Art Array - auch bei einem String werden die Zeichen (char) einzeln ausgelesen - und hier dann auf die Sendeschnittstelle übertragen
    {
        while(*s)
        {
        sendchar(*s);
        s++;
        }
    }
    
    int main(void){
        
        init_USART();
        i2c_init();
        init_HMC5883L();
        
        
        while(1){
        
            getHeading();
            
            itoa(raw_x, buffer, 10);
            sendUSART("Raw X: ");
            sendUSART(buffer);
            sendchar('\n');
            
            itoa(raw_y, buffer, 10);
            sendUSART("Raw Y: ");
            sendUSART(buffer);
            sendchar('\n');
            
            itoa(raw_z, buffer, 10);
            sendUSART("Raw Z: ");
            sendUSART(buffer);
            sendchar('\n');
            
            _delay_ms(67);
            
        }
    }
    Wenn ich nun in mein Terminal schaue, bekomme ich nur das "Initializing HMC5883L..." ein "Done!" wird nicht gesendet, er bleibt also aus irgendeinem Grund in der Funktion init_HMC5883L hängen und ich sehe nicht warum.

    Nun ist es auch so, dass ich noch nicht sonderlich viel mit I2C gemacht habe aber ich würde schon gerne wissen, was ich falsch mache, da ich auch andere Sensoren/Bausteine über I2C ansteuern möchte.

    MfG und einen guten Rutsch!

    Torrentula
    Geändert von Torrentula (31.12.2011 um 11:49 Uhr)
    MfG Torrentula

Ähnliche Themen

  1. Kompass HMC5883L spinnt
    Von Torrentula im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 24.10.2011, 09:04
  2. LDR an ADC auslesen, RP6
    Von eckiii im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 19.04.2009, 18:18
  3. 3x ADC auslesen
    Von JeyBee im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 24.03.2009, 09:01
  4. ID3 Tag auslesen ?
    Von 2A im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 24.08.2008, 17:36
  5. i²c auslesen
    Von it03 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 26.04.2006, 09:23

Berechtigungen

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

LiFePO4 Speicher Test