- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: Temperatur wert wird nicht aktualisiert.

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230

    Temperatur wert wird nicht aktualisiert.

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi, ich habe ein Problem mit meinem Programm, und zwar sollte die Temperatur angezeigt werden die über I²C von einem lm75 abgefragt wird und auf einem LCD ausgegeben wird, das klappt aber nur ein Mal, und zwar beim Einschalten oder beim Reset Taste drücken ich verwende ein STK500, nun möchte ich ja die Temperatur laufend aktualisiert haben und nicht erst beim Betätigen des Reset Tasters.

    Was stimmt bei mir nicht?
    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h, i2c.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include "lcd-routines.h"
    #include "i2c.h"
    
    int main(void) //Hauptschleife
    {
        DDRA = 0xff; // Pins sind Ausgang
        PORTA = 0xff; // LED's Aus
        DDRD = 0x00; // Pins sind Eingang
        PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND
        // Initialisierung des LCD
        // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
        // verschwunden sein
        lcd_init();
        TWI_init(FAKTOR, TEILER);
        lcd_string("  LCD Start !!! ");
        _delay_ms(500); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht    
        lcd_clear();
        lcd_home();
        lcd_string(" Taste druecken");         
    
    char temperatur; //Temperaturvariable
    char einer; //Temperaturvariable einer
    char zehner; //Temperaturvariable zehner
                      
        for(;;) //Programmschleife
        {  
    
            temperatur = TWI_empf(ADRESSE_R); //Temperaturvariablen
            einer = ( temperatur % 10 ) + 48;
            zehner = ( temperatur / 10 ) + 48;
              
                if (rest >= 128)
                {
                lcd_setcursor( 0, 2);
                lcd_string("Temperatur ");    
                lcd_data(zehner);
                lcd_data(einer);
                lcd_string(",5C ");
                }
                
                else
                {
                lcd_setcursor( 0, 2);
                lcd_string("Temperatur ");    
                lcd_data(zehner);
                lcd_data(einer);
                lcd_string(",0C ");
                }
          }
    
    
        return(0);
    }
    Im Anhang habe ich noch das komplette Projekt.
    Danke !
    Angehängte Dateien Angehängte Dateien
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  2. #2
    Irgendetwas stimmt da grundsätzlich nicht. Die Variable "rest" existiert in deiner main-Funktion überhaupt nicht und global ist sie auch nicht deklariert. In die Variable "temperatur" bekommst du den Rückgabewert der Funktion TWI_empf vom Datentyp char. Aber die vollständige Temperatur des LM75 ist 11bit groß! Die Umrechnung verstehe ich auch nicht so recht.

    Schau dir das Datenblatt des LM75 genau an und schreibe das Programm neu.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230
    Bitte Lese mein Programm richtig durch befor du mir helfen kannst!

    Danke
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230
    Also, ich habe jetzt festgestellt, wen ich das fusse bit CKDIV8 setze aktualisiert sich der Temperatur wert wie gewünscht außer das die nach Komma stelle nicht mit aktualisiert wird. Da ist wohl doch noch was falsch. Ich habe jetzt mal das Projekt besser in *.c und *.h Dateien gegliedert.

    Mir scheint, dass mein lcd zu langsam ist, wen der Temperatur wert aktualisiert wird, kommt das lcd nicht hinter her.
    Mein LCD ist das "YL 162-90" von Pollin.

    Die besagte Umrechnung ist nötig um ASCII Zeichen auf mein lcd aus zu geben.

    Der Temperatur wert ist insgesamt 9 bit groß das heißt 8 bit (1 byte) für die vor Komma stelle und das 9te bit für die nach Komma stelle (bit 9 = 0 Dan *,0 oder bit 9 = 1 Dan *,5 (das "*" steht für Temperatur wert))

    Die variable "rest" existiert tatsächlich nicht in der main da ich sie global gesetzt habe.

    i2c.h
    Code:
    #define TAKT 8000000UL 
    #define ADRESSE_R 0b10010001 //Lesen 
    #define ADRESSE_W 0b10010000 //Schreiben
    #define FAKTOR 32
    #define TEILER 1
    
    char dat1, rest;
     
    ////////////////////////////////////////////////////////////////////////////////
    // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
     
    #ifndef F_CPU
    #define F_CPU 8000000UL
    #endif
    
    
    
    void TWI_init(unsigned char faktor, unsigned char teiler);
    
    void TWI_send(unsigned char adres, unsigned char daten);
    
    char TWI_empf(unsigned char adres);
    i2c.c
    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include "i2c.h"
     
    ////////////////////////////////////////////////////////////////////////////////
    
    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 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);
    rest = TWDR ;
    
    loop_until_bit_is_set(TWCR, TWINT);
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
    
    return dat1;
    }
    Taster_LCD.c
    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h, i2c.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include "lcd-routines.h"
    #include "i2c.h"
    
    
    
    int main(void) //Hauptschleife
    {
        
        
        DDRA = 0xff; // Pins sind Ausgang
        PORTA = 0xff; // LED's Aus
        DDRD = 0x00; // Pins sind Eingang
        PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND
        // Initialisierung des LCD
        // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
        // verschwunden sein
        lcd_init();
        TWI_init(FAKTOR, TEILER);
        lcd_string("  LCD Start !!! ");
        _delay_ms(500); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht    
        lcd_clear();
        lcd_home();
        lcd_string(" Taste druecken");         
    
    char temperatur; //Temperaturvariable
    char einer; //Temperaturvariable einer
    char zehner; //Temperaturvariable zehner
                      
        for(;;) //Programmschleife
        {  
    
            temperatur = TWI_empf(ADRESSE_R); //Temperaturvariablen
            einer = ( temperatur % 10 ) + 48;
            zehner = ( temperatur / 10 ) + 48;
              
                if (rest >= 128)
                {
                lcd_setcursor( 0, 2);
                lcd_string("Temperatur ");    
                lcd_data(zehner);
                lcd_data(einer);
                lcd_string(",5C ");
                }
                
                else
                {
                lcd_setcursor( 0, 2);
                lcd_string("Temperatur ");    
                lcd_data(zehner);
                lcd_data(einer);
                lcd_string(",0C ");
                }
          }
    
    
        return(0);
    }
    hir das Datenblatt des LM75.
    https://docs.google.com/gview?url=ht...df&chrome=true

    Im Anhang habe ich noch mal das komplette Projekt.

    Danke.
    by Ferdinand.
    Angehängte Dateien Angehängte Dateien
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

Ähnliche Themen

  1. Temperatur anzeige auf dem LCD wird nicht aktualisiert?
    Von Ferdinand im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 16.01.2012, 13:55
  2. LM75 aktualisiert nicht (gelöst)
    Von marc2100 im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.09.2009, 15:04
  3. Antworten: 25
    Letzter Beitrag: 21.08.2008, 22:33
  4. [ERLEDIGT] Suche Temperatur- und ph-Wert
    Von Holger. im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 14.11.2005, 16:17
  5. Temperatur und PH-Wert messen
    Von im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 19.01.2005, 13:13

Berechtigungen

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

Solar Speicher und Akkus Tests