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

Thema: LM75 Auswerten und Temperatur über terminal ausgeben?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    230

    LM75 Auswerten und Temperatur über terminal ausgeben?

    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
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    04.02.2005
    Beiträge
    76
    Es geht nur um die Ausgabe? Hast du es schon mal mit dtostrf(); probiert? Kenn mich damit nicht so aus, aber die Werte müssten doch irgendwie in °C umgerechnet werden, oder nicht?
    mfg
    mfg crowdy

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Das Beispiel ist zwar mit Bascom, aber man sieht, wie der LM75 gestrickt ist

    http://www.rn-wissen.de/index.php/Se...ur-Sensor_LM75
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    230
    hi

    ich habs verstanden.

    nur wen ich das 1. beit als char sende dan kommt so was "Temperatur -> C" und kein zahlen wert ?
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    230
    Hi

    Hier habe ich mein Ergebnis:


    "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);
    }
    
    
     char dat1, dat2;
    
     char TWI_empf(unsigned char adres)
    {
    
    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);
    
    return dat1;
    }
    und die 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);
    char temperatur;
    char einer;
    char zehner;
    char c = 248;
    
        while(1)
        {
    
        uart_puts ("\033[2J");
    
        temperatur = TWI_empf(ADRESSE_R);
        einer = ( temperatur % 10 ) + 48;
        zehner = ( temperatur / 10 ) + 48;
    
        
        if (dat2 >= 0b10000000)
        {
        uart_puts ("\r\nTemperatur ")  ;
        uart_putc (zehner);
        uart_putc (einer);
        uart_puts (",5 ");
        uart_putc (c);
        uart_puts ("C \r\n")  ;
        
        }
    
        else
        {
        uart_puts ("\r\nTemperatur ")  ;
        uart_putc (zehner);
        uart_putc (einer);
        uart_puts (",0 ");
        uart_putc (c);
        uart_puts ("C \r\n")  ;
        
        }
        _delay_ms(1000);
    
        }
    }
    Das Problem war das mein terminal Ales in ascii interpretiert hat also auch die werte die von dem LM75 kommen man muste diesen wert erst um Rechnen so das Er dem ascii Code entspricht und ich auch mein gewünschten dezimal werte bekomme.

    Das geht so auf http://www.torsten-horn.de/techdocs/ascii.htm kan man erkennen das Stele 48 mit 0 beginnt und stelle 57 mit 9 endet, also musste ich meinen wert erst mal unterteilen um die einer zu erhalten teilt man durch 10 und merkt sich den Rest das geht mit "%10" Dan verschiebt man den wert um 48 stellen nach hinten also +48 und erhält das gewünschte ascii Zeichen, um die zehner zu erhalten, teilt man das ganze durch /10 und verschiebt das Ergebnis um 48 stellen also wider +48 jetzt nur noch nacheinander ausgeben und fertig.

    THX

    by Ferdinand
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.01.2012
    Beiträge
    15
    Hallo,

    ich weiß der Thread ist schon sehr alt.
    Habe deinen code für mein Projekt übernommen, dazu ne frage, gibt es eine Möglichkeit auch die Kommastelle anzuzeigen?

Ähnliche Themen

  1. Antworten: 75
    Letzter Beitrag: 12.12.2010, 22:34
  2. Antworten: 44
    Letzter Beitrag: 12.12.2010, 14:55
  3. Antworten: 13
    Letzter Beitrag: 21.11.2010, 19:41
  4. Daten von RN-Control über USB-ISP auf Terminal ausgeben
    Von ensacom im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 3
    Letzter Beitrag: 24.01.2009, 21:36
  5. Beispielprogramm: Mit RN-Control und LM75 Temperatur messen
    Von Frank im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 20
    Letzter Beitrag: 11.04.2007, 16:11

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress