Hanna
Sourcecode Batteriemanagementsystem
temp_mcp9843.c
gehe zur Dokumentation dieser Datei
1 
14 #include <stdio.h>
15 #include <stdint.h>
16 #include <avr/io.h>
17 #include <avr/interrupt.h>
18 #include <stdbool.h>
19 
20 //#include "com74HC595.h"
21 #include "twi_master_driver.h"
22 #include "temp_mcp9843.h"
23 #include "BMS-Basic.h"
24 
25 //#include "ad7997.h"
26 
28 
29 int temp[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
30 bool tcrit_flag[8] = { false, false, false, false, false, false, false, false };
31 bool tupper_flag[8] = { false, false, false, false, false, false, false, false };
32 bool tlower_flag[8] = { false, false, false, false, false, false, false, false };
33 
34 //uint8_t sendRegData[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
35 
44 void reset_Event_MCP9843 ( unsigned char Sensor_nummer )
45 {
46  // CONFIG Register
47  sendRegData[0] = MCP9843_CONFIG_REG;
48  sendRegData[1] = MCP9843_CONF_HYST_30_MSB_bm;
49  sendRegData[2] = MCP9843_CONF_RESET_EVENT_LSB_bm;
50  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | Sensor_nummer), &sendRegData[0], 3 );
51 }
52 
64 void MCP9843_config ( unsigned char Sensor_nummer )
65 {
66  // CONFIG Register
67  sendRegData[0] = MCP9843_CONFIG_REG;
68  sendRegData[1] = MCP9843_CONF_HYST_30_MSB_bm;
69  sendRegData[2] = MCP9843_CONF_INIT_TCRIT_LSB_bm;
70  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | Sensor_nummer), &sendRegData[0], 3 );
71 
72  // RESOLUTION Register
73  sendRegData[0] = MCP9843_RESOLUTION_REG;
74  sendRegData[1] = MCP9843_RES_MED_bm;
75  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | Sensor_nummer), &sendRegData[0], 2 );
76 
77  // Temperaturlimits
78  sendRegData[0] = MCP9843_TUPPER_REG;
79  sendRegData[1] = MCP9843_TUPPER_MSB;
80  sendRegData[2] = MCP9843_TUPPER_LSB;
81  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | Sensor_nummer), &sendRegData[0], 3 );
82 
83  sendRegData[0] = MCP9843_TLOWER_REG;
84  sendRegData[1] = MCP9843_TLOWER_MSB;
85  sendRegData[2] = MCP9843_TLOWER_LSB;
86  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | Sensor_nummer), &sendRegData[0], 3 );
87 
88  sendRegData[0] = MCP9843_TCRIT_REG;
89  sendRegData[1] = MCP9843_TCRIT_MSB;
90  sendRegData[2] = MCP9843_TCRIT_LSB;
91  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | Sensor_nummer), &sendRegData[0], 3 );
92 }
93 
101 {
102  TWI_MasterInit ( &twi_TEMP_RTC, &TWI_TEMPERATUR, TWI_MASTER_INTLVL_LO_gc, TWI_BAUDSETTING );
103 
104 // Temperaturevent
105 // cli();
106 // PORTE.DIRCLR = PIN2_bm; // Pin als Eingang
107 // PORTE.INT0MASK = PIN2_bm; // in der Iterruptmaske 0 Pin 2 freigeben
108 // PORTE.PIN2CTRL = PORT_OPC_WIREDORPULL_gc | PORT_ISC_RISING_gc; // Pin 2 PullUp aktivieren, steigende Flanke aktivieren
109 // PORTE.INTCTRL = PORT_INT0LVL_HI_gc; // Interrupt HiLevel für PORTE und INT0MASK freigeben
110 //
111 // Interrupt enable
112 // PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm; // enable interrupt levels
113 // sei(); // enable all interrupts
114 
115 
116  // Alle Sensoren konfigurieren, Parameter einstellen
117  for ( int i = 0; i <= 7; i++ )
118  {
119  MCP9843_config ( i );
120  }
121 
122 }
123 
154 int mcp9843_calculate_value ( uint16_t bitcode )
155 {
156 
157  // Zweier-Komplement berechnen
158 
159  if ( bitcode & MCP9843_TEMPERATURE_SGN_bm ) // Vorzeichen-Bit wird isoliert; Wenn != 0 ist die Zahle negativ
160  {
161  bitcode -= 1; // 1 abziehen
162  bitcode = ~bitcode; // und invertieren, um den korrekten Betrag der negativen Zahl zu berechnen
163  bitcode &= MCP9843_TEMPERATURE_FLT_bm; // Bitcode auf gültige Stellen reduzieren
164  return -1 * MCP9843_BASE_VALUE * bitcode;
165  }
166  else
167  {
168  return MCP9843_BASE_VALUE * bitcode;
169  }
170 
171 }
172 
185 void mcp9843_get_data ( void )
186 {
187  uint16_t reg_temp = 0;
188 
189  for ( int sensor_nr = 0; sensor_nr < 8; sensor_nr++ )
190  {
191  // Einlesen der aktuellen Temperatur
192  sendRegData[0] = MCP9843_TEMP_REG;
193  TWI_MasterWrite ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | sensor_nr), &sendRegData[0], 1 );
194  TWI_MasterRead ( &twi_TEMP_RTC, ( MCP9843_BASE_ADDR | sensor_nr), 2 );
195  reg_temp = ((uint8_t) twi_TEMP_RTC.readData[0]) << 8 | (uint8_t) twi_TEMP_RTC.readData[1];
196 
197  // Temperaturflags zurücksetzen
198  tcrit_flag[sensor_nr] = false;
199  tupper_flag[sensor_nr] = false;
200  tlower_flag[sensor_nr] = false;
201 
202  // Neue Temperaturflags ermitteln
203  if ( reg_temp & MCP9843_TEMP_GT_TCRIT_bm ) tcrit_flag[sensor_nr] = true;
204  if ( reg_temp & MCP9843_TEMP_GT_TUPPER_bm ) tupper_flag[sensor_nr] = true;
205  if ( reg_temp & MCP9843_TEMP_LT_TLOWER_bm ) tlower_flag[sensor_nr] = true;
206 
207  // Berechnung der Temperatur aus den Rohdaten
208  temp[sensor_nr] = mcp9843_calculate_value ( reg_temp & MCP9843_TEMPERATURE_FLT_bm );
209  }
210 
211 }
212 
217 /*
218  ISR(PORTE_INT0_vect)
219  {
220 
221  }
222  */
223 
228 ISR(TWIE_TWIM_vect)
229 {
230  TWI_MasterInterruptHandler ( &twi_TEMP_RTC );
231 }
232 
#define MCP9843_CONF_HYST_30_MSB_bm
bit 10-9 10 = 3.0°C
Definition: temp_mcp9843.h:88
Konstanten, Filter und Commands für den Temperatursensor MCP 9843.
ISR(TWIE_TWIM_vect)
Event-PIN der Temperatursensoren wird per ISR PORTE_INT0_vect überwacht.
Definition: temp_mcp9843.c:228
void mcp9843_get_data(void)
Die Daten des Temperatursensors werden ausgelesen.
Definition: temp_mcp9843.c:185
#define MCP9843_TCRIT_MSB
32°C
Definition: temp_mcp9843.h:126
#define MCP9843_TLOWER_LSB
0°C
Definition: temp_mcp9843.h:131
#define MCP9843_TEMP_GT_TUPPER_bm
Bit 14 zeigt, ob die Temperatur über der Obergrenze TUpper liegt.
Definition: temp_mcp9843.h:144
void TWI_MasterInit(TWI_Master_t *twi, TWI_t *module, TWI_MASTER_INTLVL_t intLevel, uint8_t baudRateRegisterSetting)
Initialise the TWI module.
#define MCP9843_BASE_VALUE
The LSB value (bit 0) is 0.0625 °C. Temperature (°C) = Temperature_code * 0.0625. ...
Definition: temp_mcp9843.h:136
int mcp9843_calculate_value(uint16_t bitcode)
Messwert berechnen und Zweier-Komplement-Berechnung starten.
Definition: temp_mcp9843.c:154
register8_t readData[TWIM_READ_BUFFER_SIZE]
#define MCP9843_CONF_INIT_TCRIT_LSB_bm
Bit0 und Bit 2 = 1 Initialisierung: Keine Locks; Events nur Tcrit; Event Active Low; Event Interrupt...
Definition: temp_mcp9843.h:82
#define MCP9843_TEMPERATURE_SGN_bm
Bit 12 ist das Vorzeichenbit.
Definition: temp_mcp9843.h:142
#define MCP9843_TEMP_REG
Registeradresse.
Definition: temp_mcp9843.h:71
void MCP9843_init()
Einstellungen des µC für die Arbeit mit MCP9843.
Definition: temp_mcp9843.c:100
Standard Header Datei, Definition der Batteriekonstanten und Grenzwerte.
TWI_Master_t twi_TEMP_RTC
TWI (I2C) Mastervariable, steuert die Register und speichert Daten.
Definition: temp_mcp9843.c:27
#define MCP9843_TCRIT_LSB
32°C
Definition: temp_mcp9843.h:127
XMEGA TWI master driver header file.
#define MCP9843_TCRIT_REG
Registeradresse.
Definition: temp_mcp9843.h:70
#define MCP9843_BASE_ADDR
Basisadresse für I2C-Bus (7bit, ohne W/R)
Definition: temp_mcp9843.h:40
#define MCP9843_TUPPER_REG
Registeradresse.
Definition: temp_mcp9843.h:68
#define MCP9843_TLOWER_MSB
0°C
Definition: temp_mcp9843.h:130
#define MCP9843_RESOLUTION_REG
Registeradresse.
Definition: temp_mcp9843.h:74
#define MCP9843_RES_MED_bm
10 = LSB = 0.125 °C (tCONV = 130 ms typical)
Definition: temp_mcp9843.h:94
#define MCP9843_TEMP_GT_TCRIT_bm
Bit 15 zeigt, ob die Temperatur über der kritischen Temperatur liegt.
Definition: temp_mcp9843.h:143
#define MCP9843_TEMP_LT_TLOWER_bm
Bit 13 zeigt, ob die Temperatur unter der Untergrenze TLower liegt.
Definition: temp_mcp9843.h:145
void TWI_MasterInterruptHandler(TWI_Master_t *twi)
Common TWI master interrupt service routine.
#define MCP9843_CONFIG_REG
Registeradresse.
Definition: temp_mcp9843.h:67
#define MCP9843_TUPPER_LSB
30°C
Definition: temp_mcp9843.h:129
bool TWI_MasterWrite(TWI_Master_t *twi, uint8_t address, uint8_t *writeData, uint8_t bytesToWrite)
TWI write transaction.
TWI master driver struct.
#define MCP9843_TEMPERATURE_FLT_bm
Temperatur ist ein 13bit-Wert,.
Definition: temp_mcp9843.h:141
bool TWI_MasterRead(TWI_Master_t *twi, uint8_t address, uint8_t bytesToRead)
TWI read transaction.
void MCP9843_config(unsigned char Sensor_nummer)
Standardeinstellungen des Sensors einstellen.
Definition: temp_mcp9843.c:64
void reset_Event_MCP9843(unsigned char Sensor_nummer)
Der Event Pin am MCP9843 muss manuell zurückgesetzt werden.
Definition: temp_mcp9843.c:44
#define MCP9843_TUPPER_MSB
30°C
Definition: temp_mcp9843.h:128
#define MCP9843_TLOWER_REG
Registeradresse.
Definition: temp_mcp9843.h:69