Hallo
Ich möchte einen LM75 Auswerten und Temperatur über terminal ausgeben nur scheiter das ein wenig.

2 pullup widerstände 10K von SDA, SCL jeweils auf +5V. Die, A0, A1, A2 jeweils direkt auf GND
und einen 100nF an VCC und GND. Ein gesetzt Wirt ein ATmega644 mit 8MHz auf einem STK500

Das Programm.:

MAIN

Code:
#include <avr/io.h> 
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>
#include "uart.h"
#include "i2c.h"

int main (void) {

USART_Init( UBRR_VAL ) ;


uart_puts ("\033[2J");

uart_puts ("\033[32m");


uart_puts ("Hallo Welt\r\n")  ;

uart_putc ( 0x01);

uart_puts ("\r\nHallo Welt 2 ")  ;

_delay_ms(10000);




TWI_init(FAKTOR, TEILER);
unsigned int temperatur;
char s[7];

    while(1)
    {

    uart_puts ("\033[2J");

    temperatur = TWI_empf(ADRESSE_R);

    uart_puts ("\r\nTemperatur ")  ;
    uart_puts( utoa( temperatur, s, 10 ) );
    //uart_putc ( temperatur);
    uart_puts (" C \r\n")  ;

    _delay_ms(1000);

    }

}
uart.h

Code:
/* 
  UART-Init: 
Berechnung des Wertes für das Baudratenregister 
aus Taktrate und gewünschter Baudrate
*/
 
#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 





void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = 3<<UCSZ00;
}

/* ATmega16 */
int uart_putc(unsigned char c)
{
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR0 = c;                      /* sende Zeichen */
    return 0;
}
 
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

void uart_cls (void)
{
int x;

    for(x=0;x <= 20;x++ )
    {   
        uart_puts ("\r\n")  ;
        
    }
}
i2c.h

Code:

#define TAKT 8000000UL 
#define ADRESSE_R 0b10010001 //Lesen 
#define ADRESSE_W 0b10010000 //Schreiben
#define FAKTOR 32
#define TEILER 1

void TWI_init(unsigned char faktor, unsigned char teiler)
{
TWBR = faktor;
TWSR = teiler;
}

void TWI_send(unsigned char adres, unsigned char daten)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWDR = adres;
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWDR = daten;
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

unsigned int TWI_empf(unsigned char adres)
{
unsigned char dat1, dat2;
unsigned int daten;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWDR = adres;
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
dat1 = TWDR ;
TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);

TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
dat2 = TWDR ;

loop_until_bit_is_set(TWCR, TWINT);
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);

daten = dat1 | (dat2 << 8);

return daten;
}
Terminal Ausgabe


Code:
Hallo Welt

Hallo Welt 2

Temperatur 12568 C
Temperatur 65303 C
Temperatur 65303 C
Temperatur 12568 C
Temperatur 12568 C
Temperatur 65303 C
Temperatur 12568 C
Temperatur 65303 C
Temperatur 65303 C
Temperatur 12568 C
Temperatur 12568 C
Temperatur 65303 C
Ich möchte das er mir so ein wert "26.5C" anzeigt.
Was mach ich falsch?

Danke

by Ferdinand