Forum: Mikrocontroller und Digitale Elektronik LM75 Funktion - Problem mit Strukturpointer - ATMega32


von Manuel K. (manuelkn)


Lesenswert?

Hallo,

bin gerade mit einem kleinen Projekt beschäftigt, bei welchem das 
auslesen und anzeigen diverser Temperaturen eine Teilaufgabe ist.

Habe es schon geschafft die Temperatur vom LM75 auszulesen und 
anzuzeigen, allerdings wollte ich den vorhandenen Code etwas umändern 
und für zukünftige Projekte komfortabler schreiben.

Habe hierfür eine Header und Code Datei erstellt.
1
/******************************************************************************
2
* File: lm75.h                                            Date: 30.11.2015    *
3
*                                                                             *
4
* Version: 01                                                                 *
5
******************************************************************************/
6
7
8
#include <avr/io.h>
9
#include <stdint.h>
10
#include <stdlib.h>
11
#include "i2cmaster.h"
12
#include "lcd.h"
13
14
#define LM75R 0b10010100                                    /* write address - RoomTemp */
15
#define LM75W 0b10010010                                    /* write address - WaterTemp */
16
17
18
19
/* buffers */
20
21
char BufferR[9];                                            /* Buffer for room value converting */
22
char BufferW[9];                                            /* Buffer for water value converting */
23
24
25
26
/* structures */
27
28
29
struct str_temp
30
31
    {
32
        int8_t  tempH;
33
        uint8_t tempL;
34
    }room, water;
35
36
37
38
/* LM75 functions */
39
40
41
void read_roomtemp(struct str_temp* room);                  /* read the room temperature */
42
43
void read_watertemp(struct str_temp* water);                /* read the water temperature */
44
45
void show_roomtemp(struct str_temp* room);                  /* display the room temperature */
46
47
void show_watertemp(struct str_temp* water);                /* display the water temperature */
1
/******************************************************************************
2
* File: lm75.c                                            Date: 30.11.2015    *
3
*                                                                             *
4
* Version: 01                                                                 *
5
*******************************************************************************
6
*                                                                             *
7
* Author:                                                                     *
8
* Controller: ATmega32                                                        *
9
* Description:                                                                *
10
*                                                                             *
11
*******************************************************************************
12
* Changes:                                                                    *
13
*                                                                             *
14
******************************************************************************/
15
16
17
#include "lm75.h"
18
19
20
21
/* LM75 functions */
22
23
24
void read_roomtemp(struct str_temp* room)
25
26
    {
27
        i2c_start(LM75R+I2C_READ);
28
        room->tempH = i2c_readAck;
29
        room->tempL = i2c_readNak;
30
        i2c_stop();
31
    }
32
33
34
void read_watertemp(struct str_temp* water)
35
36
    {
37
        i2c_start(LM75W+I2C_READ);
38
        water->tempH = i2c_readAck;
39
        water->tempL = i2c_readNak;
40
        i2c_stop();
41
    }
42
43
44
void show_roomtemp(struct str_temp* room)
45
46
    {
47
        lcd_puts("+");
48
        itoa(room->tempH, BufferR, 10);
49
        lcd_puts(BufferR);
50
        lcd_puts(".");
51
52
        if(room->tempL >= 128)
53
            {
54
                lcd_puts("5");
55
            }
56
57
        else
58
            {
59
                lcd_puts("0");
60
            }
61
62
        lcd_putc(0b11011111);
63
        lcd_puts("C");
64
    }
65
66
67
void show_watertemp(struct str_temp* water)
68
69
    {
70
        lcd_puts("+");
71
        itoa(water->tempH, BufferW, 10);
72
        lcd_puts(BufferW);
73
        lcd_puts(".");
74
75
        if(water->tempL >= 128)
76
            {
77
                lcd_puts("5");
78
            }
79
        
80
        else        
81
            {
82
                lcd_puts("0");
83
            }
84
85
        lcd_putc(0b11011111);
86
        lcd_puts("C");
87
    }

Wenn ich das ganze nun aber compiliere, werden mir 4 Warnungen 
ausgegeben:

../lm75.c:XX: warning: assignment makes integer from pointer without a 
cast

Diese Warnungen werden an den Stellen generiert, wo ich versuche die 
Werte vom LM75 mittels Strukturpointer abzuspeichern.

Konnte im Netz zwar diverse Dinge finden, hat mir allerdings nicht 
wirklich geholfen.
Hoffe hier kann mir eventuell jemand helfen. Finde den Fehler leider 
nicht selber.

Liebe Grüße
Manuel

von da1l6 (Gast)


Lesenswert?

Hallo
1
water->tempH = i2c_readAck;
Hier weißt du einen funktionspointer zu.

Du willst aber vermutlich die funktion aufrufen:
1
water->tempH = i2c_readAck();


Ansonten:
1
struct str_temp
2
3
    {
4
        int8_t  tempH;
5
        uint8_t tempL;
6
    }room, water;
Yuk! Besser so:
1
typedef struct {
2
        int8_t  tempH;
3
        uint8_t tempL;
4
} temp_t;
5
6
temp_t room;
7
temp_t water;
 (persönliche Meinung)

da1l6

von nicht"Gast" (Gast)


Lesenswert?

Moin,


markier doch mal die Zeilen genau, wo dein Fehler angezeigt wird.

Was für eine I2C Bibliothek benutzt du denn und welche typen sind 
i2c_radAck und i2c_readNack. die klingen eher nach Funktionen. Du hast 
also wahrscheinlich die Klammern vergessen.


OT. du solltest dein Design noch mal überdenken. Du hast 4 Funktionen, 
von denen jeweils 2 zu 95% das gleiche machen ;)

grüße

von nicht"Gast" (Gast)


Lesenswert?

verdammt. Um die Uhrzeit brauch ich einfach zu lange zum Tippen ^^

von Manuel K. (manuelkn)


Lesenswert?

Guten Morgen!

Oh man.. klar. Die Klammern haben gefehlt. Vielen Dank für die Hilfe.
Habe die Zeile jetzt schon Tage lang angeschaut, aber bin nie darauf 
gekommen, dass die Klammern fehlen. Habe das Problem ständig wo anders 
gesucht.

Kannst du deine Meinung, bzw. den Vorschlag mit dem typedef bei der 
Struktur noch kurz etwas erläutern? Was ist der Vorteil darin?
Wäre sehr nett! :-)

Danke euch beiden.

Das mit den "doppelten" Funktion stimmt. Wüsste allerdings nicht direkt, 
wie man das vereinfachen könnte?
Oder einfach beim Funktionsaufruf mittels der Pointerübergabe zwischen 
den struct's auswählen? Wäre so realisierbar oder?

Liebe Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.