@p_mork
Meine Funktion sieht genauso aus. Troztdem danke!

@Dirk
1 u 2. Software-Probleme habe ich nicht ausgeschlossen, halte sie aber für unwahrscheinlich, da Werte ankommen. (Siehe aber Code weiter unten)
3. Weiss nicht, woraus du schliesst, dass ich die Anleitung nicht gelesen habe, das hab ich mehrmals ausführlich gemacht (ohne das wende ich mich nie ans Forum).
4. Ich will keine PWM benutzen, es ist nur als Kontrolle dafür gedacht, ob im Compass-Modul was falsch ist, oder die Kommunikation nicht funktioniert. Mir ist es bewusst, dass PWM ungenau ist, es sollte aber auswertbare Werte liefern, die das Problem vielleicht eingrenzt.
5. Pullup Widerstände sind am Bus installiert.

Also nocheimal der Problemablauf:

1. Ohne vorherige Kalibrierung (=Werkseinstellung) konnte ich nur Werte zw. 128 u. 255 mit I2C lesen
2. Das nach der Kalibrierung nur 82 angekommen ist, war ein Softwarefehler gestern. Weiterhin ist Problem 1 erhalten: Werte kommen nur zwischen 128 und 255.

Code:

Code:
#include "uart.h" //aus RN-Wissen AVR-GCC Tutorial
#include "i2cmaster.h" //I2C lib von Peter Fleuy
#include <util/delay.h>
#include <stdlib.h>

#ifndef F_CPU
#define F_CPU 4000000
#endif


#define BAUDRATE 9600
#define CMPS03 0xc0

unsigned char read_compass(unsigned char regadress);
void uart_puts (const char *s);
static inline uint8_t uart_getc_wait();



int main (void){
	uint8_t twidata;
	char s[3];
	uint8_t i;
	uart_init();
	i2c_init();
	twidata='I';
	uart_putc(twidata); //Abschluss der Initialisation wird mit einem I in HyperTerminal bestätigt

	while(1){
		twidata='R';
		if(twidata==uart_getc_wait()){ //wenn R ankommt, wird über I2C ein Wert gelesen
		twidata=read_compass(1);
		utoa(twidata,s,10);          //uint -->char Umwandlung
		uart_puts(s);                  //senden per UART
		uart_putc(10);
		uart_putc(13);
		i=0;
		while(i!=10){
		_delay_ms(200);
		i++;}
		}
	}


	return 0;
}


void uart_init()
{
    /*uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
 
    UBRRH = (uint8_t) (ubrr>>8);
    UBRRL = (uint8_t) (ubrr);*/

	UBRRL = 25;
 
    // UART Receiver und Transmitter anschalten 
    // Data mode 8N1, asynchron 
    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

    // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) 
    do
    {
        UDR;
    }
    while (UCSRA & (1 << RXC));
}


unsigned char read_compass(unsigned char regadress){
		unsigned char twidata;
		i2c_start(CMPS03+I2C_WRITE);
		i2c_write(regadress);
		i2c_rep_start(CMPS03+I2C_READ);
		//i2c_write(0xFF);
		twidata=i2c_readNak();
		i2c_stop();
		return twidata;
	}


void uart_puts (const char *s)
{
    do
    {
        uart_putc (*s);
    }
    while (*s++);
}
Vielen Dank nocheinmal für die Mühe.

MfG

pongi