Hallo,
wie einige wissen, beschäftige ich mich Zurzeit mit I2C. Das
Grundprinzip scheine ich verstanden zu haben.
Da ich mit MCP23017 weniger Glück hatte, habe ich mich mit dem DS1631
beschäftigt.
Ich habe zur Zeit Probleme mit der Datenverarbeitung.
Habe die MSB Bytes und LSB Bytes ausgelesen. Die MSB Bytes müsste ich
nur auf das Vorzeichen prüfen.
Wie gehe ich mit dem LSB Byte um? Beim LSB Byte geht es ja um die
Nachkommastellen.
Im Grunde müsste ich die Bits, die gesetzt sind überprüfen und diese
dann mit dem MSB Bytes verrechnen, aber ich komme nicht klar wie.
1 | void DS1631_Temperatur_Read(void)
|
2 | {
|
3 | uint8_t temp_MSB;
|
4 | uint8_t temp_LSB;
|
5 |
|
6 | I2C_Startbit();
|
7 | I2C_Slave_RW(I2C_Schreiben);
|
8 | I2C_Send_Data(Temperatur_Ablesen);
|
9 | I2C_Startbit();
|
10 | I2C_Slave_RW(I2C_Lesen);
|
11 | temp_MSB=I2C_Receive_Data();
|
12 | temp_LSB=I2C_Receive_Data();
|
13 | I2C_Stopbit();
|
14 |
|
15 | //USART_Transmit_Strings("Die Temperatur betraegt\n");
|
16 | USART_Transmit(temp_MSB);
|
17 | //USART_Transmit_Strings(" °C");
|
18 |
|
19 | }
|
Dann habe ich noch ein merkwürdiges Problem. Die Funktion
lasse ich in einer While(1) schleife laufen. Leider wird mir nur eine
Temperatur ausgegeben. Danach hört die Schleife auf.
Das konnte ich durch eine Diode überprüfen. Der Code sieht wie folg aus.
1 | #include <avr/io.h>
|
2 | #include "DS1631.h"
|
3 | #include "USART.h"
|
4 | #include "I2C.h"
|
5 | #include <util/delay.h>
|
6 |
|
7 |
|
8 | int main(void)
|
9 | {
|
10 | DDRB=0x00;
|
11 | PORTB=0x01;
|
12 |
|
13 | USART_Init(MYUBRR);
|
14 | I2C_Init();
|
15 | DS1631_Config(0x0C);
|
16 | DS1631_Start_Convert();
|
17 | while(1)
|
18 | {
|
19 | DS1631_Temperatur_Read(); //Temp auslesen
|
20 | PORTB^=PORTB; //LED toggeln
|
21 | _delay_ms(2000); //ca 2sekunden warten
|
22 | }
|
23 |
|
24 |
|
25 | }
|