Guten Abend,
ich versuche einen HTU21D (Datenblatt im Anhang) per Arduino Mini
(ATmega328P) ans laufen zu bekommen. Meine IDE ist das Microchip Studio.
SCL geht an A5 (PC5) und SCA geht an A4 (PC4). Die externen Pullups habe
ich auf dem Board hinzugefügt (10k). Betriebsspannung ist für alle
Komponenten +3V3 und die CPU Frequenz beträgt 8 MHz.
Ich möchte gerne Temperatur/Luftfeuchtigkeit per UART (19200 Baud)
ausgeben.
Als Library habe ich mir diese hier rausgesucht:
https://github.com/misaz/HTU21DLibrary/tree/master/examples/AVR_01_Basic/AVR_01_Basic
Der Link verweist auf die AVR Variante des Codes.
Meine main.c sieht so aus:
1 | #define DDR_STATUS_LED DDRB
|
2 | #define PORT_STATUS_LED PORTB
|
3 | #define PIN_STATUS_LED 5
|
4 | #define STATUS_LED_ON PORT_STATUS_LED |= (1<<PIN_STATUS_LED)
|
5 | #define STATUS_LED_OFF PORT_STATUS_LED &= ~(1<<PIN_STATUS_LED)
|
6 | #define STATUS_LED_TOGGLE PORT_STATUS_LED ^= (1<<PIN_STATUS_LED);
|
7 |
|
8 | #include <avr/io.h>
|
9 | #include <util/delay.h>
|
10 | #include "uart.h"
|
11 | #include "stdlib.h"
|
12 | #include "htu21d.h"
|
13 |
|
14 | void init_gpio()
|
15 | {
|
16 | // Init Status LED
|
17 | STATUS_LED_OFF;
|
18 | DDR_STATUS_LED |= (1<<PIN_STATUS_LED);
|
19 | }
|
20 |
|
21 | void heartbeat()
|
22 | {
|
23 | STATUS_LED_ON;
|
24 | _delay_ms(100);
|
25 | STATUS_LED_OFF;
|
26 | _delay_ms(100);
|
27 | STATUS_LED_ON;
|
28 | _delay_ms(100);
|
29 | STATUS_LED_OFF;
|
30 | _delay_ms(100);
|
31 | }
|
32 |
|
33 | int main(void)
|
34 | {
|
35 | init_gpio();
|
36 | //init_interrupt();
|
37 |
|
38 | uart_init();
|
39 |
|
40 | //Variables
|
41 | float temperature = 0;
|
42 | float humidity = 0;
|
43 | uint8_t res = 0;
|
44 |
|
45 | HTU21D_Init();
|
46 |
|
47 | while (1)
|
48 | {
|
49 | uart_send_text("\r\n______________________________________\r\n");
|
50 | uart_send_text("ATMEGA328P ready.");
|
51 | uart_send_text("\r\n");
|
52 |
|
53 |
|
54 | uart_send_text("\r\n______________________________________\r\n");
|
55 | uart_send_text("T = ");
|
56 | uart_send_text(convertFloatToAscii(HTU21D_ReadTemperature(&temperature)));
|
57 | uart_send_text(" degree");
|
58 | uart_send_text("\r\n______________________________________\r\n");
|
59 |
|
60 | _delay_ms(2000);
|
61 | heartbeat();
|
62 | }
|
63 | }
|
Damit sich der Code überhaupt kompilieren lässt muss ich in der
HTU21D_PlatformSpecific.c
auskommentieren, da das Register beim ATmega328P PRR heißt und darüber
hinaus, wenn ich das richtig sehe, das Setzen von PRTWI die Hardware
abschalten würde.
Im Anhang findet man das Verhalten auf der SCL Leitung (Channel 0) und
SCA Leitung (Channel 1). Es wird scheinbar kommuniziert (nur 3 Byte),
aber die UART Ausgabe ergibt T = 0.00. Ich erkenne die Adresse des
HTU21D (0x40 = 0b11100011), nicht auf der Leitung.
Aufgrund der Diskrepanz alleine mit PRR traue ich der Library nicht,
obwohl auf den ersten Blick die TWI Nutzung gut aussieht.
Hat jemand eine Idee was falsch läuft?
Schönen Dank!