Forum: Mikrocontroller und Digitale Elektronik HTU21D und ATmega328P


von Sef C. (sefco)


Angehängte Dateien:

Lesenswert?

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
1
PRR0 |= PRTWI;
 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!

: Verschoben durch Moderator
von foobar (Gast)


Lesenswert?

Der Rückgabewert von HTU21D_ReadTemperature ist ein Status.  Die 
Temperatur steht in der (per Referenz) übergebenen Variable.

Also, statt
1
   uart_send_text(convertFloatToAscii(HTU21D_ReadTemperature(&temperature)));
dies
1
   if (HTU21D_ReadTemperature(&temperature) == HTU21D_SUCCESS)
2
      uart_send_text(convertFloatToAscii(temperature));
3
   else
4
      uart_send_text("???");

von Sef C. (sefco)


Lesenswert?

foobar schrieb:
> Der Rückgabewert von HTU21D_ReadTemperature ist ein Status.  Die
> Temperatur steht in der (per Referenz) übergebenen Variable.

Vielen Dank...dämlicher Fehler. Und schon klappt es!
Dann hoffe ich dem Forum wenigstens einen Mehrwert durch die 
Dokumentation und die Funktionsbestätigung dieser Library geliefert zu 
haben xD

Luftfeuchtigkeit und Temperatur passen erstaunlich gut zu meiner 
Referenz-Wetterstation. Gekauft bei Amazon zum Sparkurs vermutlich in 
der Bootleg-Variante:
https://www.amazon.de/gp/product/B08RDJF62M/ref=ppx_yo_dt_b_asin_title_o02_s01?ie=UTF8&psc=1

von aaa (Gast)


Lesenswert?

Sef C. schrieb:
> #define STATUS_LED_TOGGLE PORT_STATUS_LED ^= (1<<PIN_STATUS_LED);

Das ; sollte schon mal ein Problem sein.

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.