Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC LTC2418


von Jens K. (mister232)


Lesenswert?

Hallo Leute,

versuche gerade die Kommunikation mit dem ADC LTC2418 über SPI in 
Betrieb zu nehmen. Es gibt einig Beispielprogramme im Internet, doch 
leider will es nicht so recht klappen. Hier meine Funktionen für den 
Zugriff auf den ADC:
1
// Bibliographies to be included
2
#include <math.h>
3
#include <avr/io.h>
4
#include "high_acc_ADC.h"
5
#include "main.h"
6
#include <util/delay.h>
7
#include "user_com.h"
8
#include <stdio.h>
9
10
// Global defines for the SPI-Interface
11
#define SPI_CS_LOW PORTB &= ~(1<<PB0)
12
#define SPI_CS_HIGH PORTB |= (1<<PB0)
13
14
15
// Global variable for the ADC LSB
16
float LTC2418_lsb = 5 / pow(2,24); // 5V / 2^24
17
18
19
// Structure written by LT, which contains variables for the ADC result evaluation
20
typedef struct
21
{
22
  int32_t LT_int32;  // 32-bit signed integer to be converted to four bytes
23
  uint32_t LT_uint32;  // 32-bit unsigned integer to be converted to four bytes
24
  uint8_t LT_byte[4];  // 4 bytes (unsigned 8-bit integers) to be converted to a 32-bit signed or unsigned integer
25
}LT_union_int32_4bytes;
26
27
28
// Functions in this file
29
uint8_t wait_for_eoc(void);
30
uint32_t LTC2418_read(uint8_t channel);
31
void init_SPI(void);
32
void lt_spi_transfer_block(uint8_t *tx, uint8_t *rx, uint8_t length);
33
float LT_code_to_voltage(int32_t adc_code, float LTC2418_lsb);
34
35
36
// Function to initialize the microcontroller`s SPI-Interface
37
void init_SPI(void)
38
{
39
  DDRB |= (1<<PB0) | (1<<PB2); // Set CS and MOSI pin as output
40
41
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); // SPI master mode, prescaler 8MHz/16 = 500kHz, SPI enable
42
}
43
44
45
// ************************************************ Functions from LT (modified for control unit) **********************************************************************
46
47
48
// Function, which triggers an ADC-Conversion. It gets an ADC channel and returns the actual voltage value at this channel
49
int16_t adc_conversion(uint8_t channel)
50
{
51
  // Local variable
52
  uint32_t adc_val = 0;
53
54
  
55
  // Check if ADC conversion is done
56
  if(wait_for_eoc())
57
  {
58
    debug_message("Error reading EOC!\n\r");
59
  }
60
  
61
  
62
  // A ADC conversion works as follows: The ADC value is read together with the next channel to read from. So the first conversion contains the result of the selected channel, set in the previous conversion.
63
  // Therefore the first value is read and gets thrown away. With this conversion the right channel gets selected for the next and finial conversion
64
  LTC2418_read(channel);
65
  
66
  // Check if ADC conversion is done
67
  if(wait_for_eoc())
68
  {
69
    debug_message("Error reading EOC!\n\r");
70
  }
71
  
72
  adc_val = LTC2418_read(channel); // Get ADC value previous from selected channel
73
  
74
  return LT_code_to_voltage(adc_val, LTC2418_lsb); // Convert the ADC value into a voltage value and return it
75
}
76
77
78
// Function to wait for conversion done by using the EOC-Bit: 1 = Conversion ongoing, 0 = Conversion done
79
uint8_t wait_for_eoc(void)
80
{
81
  // Local variable timer count for MISO
82
  uint16_t timer_count = 0;
83
  
84
  
85
  SPI_CS_LOW;                  // 1.) SPI-CS is pulled low
86
  while (1)                  // 2.) Wait for SDO (MISO) to go low
87
  {
88
    if (!(PINB & (1<<PINB3)))        // 3) If SDO is low, break loop
89
    {
90
      break;
91
    }
92
    
93
    if (timer_count++ > 1000)          // If timeout is reached, return 1 (failure)
94
    {
95
      SPI_CS_HIGH;            // Pull SPI-CS high
96
      return(1);
97
    }
98
    else
99
    _delay_ms(1);              // Wait for next loop
100
  }
101
  
102
  return(0);
103
}
104
105
106
// Function to read an ADC value from a selected channel
107
uint32_t LTC2418_read(uint8_t channel)
108
{
109
  // Local variables
110
  LT_union_int32_4bytes data, command;
111
  
112
  
113
  // Set channel selection to the data-byte
114
  command.LT_byte[3] = channel;
115
  command.LT_byte[2] = 0;
116
  command.LT_byte[1] = 0;
117
  command.LT_byte[0] = 0;
118
    
119
  
120
  // Data-byte transmission
121
  SPI_CS_LOW;                              // 1.) SPI-CS is pulled low
122
  lt_spi_transfer_block(command.LT_byte, data.LT_byte, (uint8_t)4);  // 2) Transfer 4 data-bytes
123
  SPI_CS_HIGH;                            // 3) Pull SPI-CS high
124
125
126
  return data.LT_int32; // Return raw ADC value
127
}
128
129
130
// Function, which reads and sends a byte array
131
void lt_spi_transfer_block(uint8_t *tx, uint8_t *rx, uint8_t length)
132
{
133
  // Local counting variable
134
  int8_t cnt;
135
136
137
  SPI_CS_LOW;                    // 1.) SPI-CS is pulled low
138
139
  for (cnt = (length - 1); cnt >= 0; cnt--)      // 2) Read and send byte array
140
  {
141
    SPDR = tx[cnt];                // Write data-byte
142
    
143
    while(!(SPSR & (1<<SPIF)));          // Wait until data is transmitted
144
    
145
    rx[cnt] = SPDR;                // Read data-byte
146
  }
147
148
  SPI_CS_HIGH;                  // 3) Pull SPI-CS high
149
}
150
151
152
// Function, which calculates the LTC2418 input bipolar voltage
153
float LT_code_to_voltage(int32_t adc_code, float LTC2418_lsb)
154
{
155
  // Local variable for the ADC voltage
156
  float adc_voltage;
157
  
158
  
159
  adc_code = adc_code >> 6;              // 1) Bit-shift ADC code to the right 6 bits
160
  adc_code -= 8388608;                // 2) Convert ADC code from offset binary to binary
161
  adc_voltage=(float)adc_code * (LTC2418_lsb);    // 3) Calculate voltage from ADC code and lsb.
162
  
163
  return(adc_voltage);                // Return the ADC voltage value
164
}

Mit dem Logic-Analyzer sehe ich, das über MOSI zwar Daten rausgehen, 
aber über MISO nichts reinkommt. CS toggelt auch wie gewollt, aber die 
Clock-Leitung bleibt low. Nach dem ersten start, funktioniert die 
Kommunikation einmal kurz, es werden allerdings falsche Daten 
ausgetauscht (aber zumindest tut sich auf allen Leitung was). Danach ist 
dann auf Clock Ruhe.

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Ja, die Clockleitung macht nichts, weshalb sollte sie denn ?
Sie wurde nicht als Ausgang beschaltet :

void init_SPI(void)
{
  DDRB |= (1<<PB0) | (1<<PB2); // Set CS and MOSI pin as output

  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); // SPI master mode, prescaler 
8MHz/16 = 500kHz, SPI enable
}

: Bearbeitet durch User
von Jens K. (mister232)


Lesenswert?

Super, jetzt klappts! Danke

von Arc N. (arc)


Lesenswert?

Was wird in channel an LTC2418_read übergeben? Nur die Kanalnummer?
Falls da nichts weiter drinsteht sind die oberen Bits Nullen und der LTC 
wird nichts weiter tun...
1
#define LTC2418_CH_MAGIC 0b10000000
2
#define LTC2418_CH_MASK 0b00000111
3
#define LTC2418_CH_SGL 0b00010000
4
#define LTC2418_CH_ODD_SIGN 0b00001000
5
#define LTC2418_CH_UPDATE_ENABLE 0b00100000
6
7
z.B.  
8
  command.LT_byte[3] = LTC2418_CH_MAGIC | LTC2418_CH_UPDATE_ENABLE | channel & LTC2418_CH_MASK);

von Jens K. (mister232)


Angehängte Dateien:

Lesenswert?

Ich übergeben:
1
#define CH0 0xB0
2
#define CH1 0xB8
3
#define CH2 0xB1
4
#define CH3 0xB9
5
#define CH4 0xB2
6
#define CH5 0xBA
7
#define CH6 0xB3
8
#define CH7 0xBB
9
#define CH8 0xB4
10
#define CH9 0xBC
11
#define CH10 0xB5
12
#define CH11 0xBD
13
#define CH12 0xB6
14
#define CH13 0xBE
15
#define CH14 0xB7
16
#define CH15 0xBF

Ich habe mal das Ergebnis am LA in den Anhang gepackt. Leider klappt die 
Umrechnung des Ergebnisses in den Spannungswert noch nicht. Eigentlich 
sollte er an dem Pin VCC messen, da dieser mit der 
Referenzspannungsquelle verbunden ist. Klappt scheinbar noch nicht.
Hier noch mein überarbeiteter Code:
1
// Bibliographies to be included
2
#include <math.h>
3
#include <avr/io.h>
4
#include "high_acc_ADC.h"
5
#include "main.h"
6
#include <util/delay.h>
7
#include "user_com.h"
8
#include <stdio.h>
9
10
// Global defines for the SPI-Interface
11
#define SPI_CS_LOW PORTB &= ~(1<<PB0)
12
#define SPI_CS_HIGH PORTB |= (1<<PB0)
13
14
15
// Global variable for the ADC LSB
16
float LTC2418_lsb = 5.0 / pow(2,24); // 5V / 2^24
17
18
19
// Structure written by LT, which contains variables for the ADC result evaluation
20
typedef struct
21
{
22
  int32_t LT_int32;  // 32-bit signed integer to be converted to four bytes
23
  uint32_t LT_uint32;  // 32-bit unsigned integer to be converted to four bytes
24
  uint8_t LT_byte[4];  // 4 bytes (unsigned 8-bit integers) to be converted to a 32-bit signed or unsigned integer
25
}LT_union_int32_4bytes;
26
27
28
// Functions in this file
29
uint8_t wait_for_eoc(void);
30
uint32_t LTC2418_read(uint8_t channel);
31
void init_SPI(void);
32
void lt_spi_transfer_block(uint8_t *tx, uint8_t *rx, uint8_t length);
33
float LT_code_to_voltage(int32_t adc_code, float LTC2418_lsb);
34
35
36
// Function to initialize the microcontroller`s SPI-Interface
37
void init_SPI(void)
38
{
39
  DDRB |= (1<<PB0) | (1<<PB2) | (1<<PB1); // Set CS, SCK and MOSI pin as output
40
41
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); // SPI master mode, prescaler 8MHz/16 = 500kHz, SPI enable
42
}
43
44
45
// ************************************************ Functions from LT (modified for control unit) **********************************************************************
46
47
48
// Function, which triggers an ADC-Conversion. It gets an ADC channel and returns the actual voltage value at this channel
49
int16_t adc_conversion(uint8_t channel)
50
{
51
  // Local variable
52
  uint32_t adc_val = 0;
53
54
  
55
  // Check if ADC conversion is done
56
  if(wait_for_eoc())
57
  {
58
    debug_message("Error reading EOC!\n\r");
59
  }
60
  
61
  
62
  // A ADC conversion works as follows: The ADC value is read together with the next channel to read from. So the first conversion contains the result of the selected channel, set in the previous conversion.
63
  // Therefore the first value is read and gets thrown away. With this conversion the right channel gets selected for the next and finial conversion
64
  LTC2418_read(channel);
65
  
66
  // Check if ADC conversion is done
67
  if(wait_for_eoc())
68
  {
69
    debug_message("Error reading EOC!\n\r");
70
  }
71
  
72
  adc_val = LTC2418_read(channel); // Get ADC value previous from selected channel
73
  
74
  return LT_code_to_voltage(adc_val, LTC2418_lsb); // Convert the ADC value into a voltage value and return it
75
}
76
77
78
// Function to wait for conversion done by using the EOC-Bit: 1 = Conversion ongoing, 0 = Conversion done
79
uint8_t wait_for_eoc(void)
80
{
81
  // Local variable timer count for MISO
82
  uint16_t timer_count = 0;
83
  
84
  
85
  SPI_CS_LOW;                  // 1.) SPI-CS is pulled low
86
  _delay_us(100);
87
  while (1)                  // 2.) Wait for SDO (MISO) to go low
88
  {
89
    if (!(PINB & (1<<PINB3)))        // 3) If SDO is low, break loop
90
    {
91
      SPI_CS_HIGH;
92
      break;
93
    }
94
    /*
95
    if (timer_count++ > 1000)          // If timeout is reached, return 1 (failure)
96
    {
97
      SPI_CS_HIGH;            // Pull SPI-CS high
98
      return(1);
99
    }*/
100
//     else
101
//     _delay_ms(1);              // Wait for next loop
102
  }
103
  
104
  return(0);
105
}
106
107
108
// Function to read an ADC value from a selected channel
109
uint32_t LTC2418_read(uint8_t channel)
110
{
111
  // Local variables
112
  LT_union_int32_4bytes data, command;
113
  
114
  
115
  // Set channel selection to the data-byte
116
  command.LT_byte[3] = channel;
117
  command.LT_byte[2] = 0;
118
  command.LT_byte[1] = 0;
119
  command.LT_byte[0] = 0;
120
    
121
  
122
  // Data-byte transmission
123
  SPI_CS_LOW;                              // 1.) SPI-CS is pulled low
124
  
125
  lt_spi_transfer_block(command.LT_byte, data.LT_byte, 4);  // 2) Transfer 4 data-bytes
126
  
127
  SPI_CS_HIGH;                            // 3) Pull SPI-CS high
128
129
130
  return data.LT_int32; // Return raw ADC value
131
}
132
133
134
// Function, which reads and sends a byte array
135
void lt_spi_transfer_block(uint8_t *tx, uint8_t *rx, uint8_t length)
136
{
137
  // Local counting variable
138
  int8_t cnt;
139
140
141
  SPI_CS_LOW;                    // 1.) SPI-CS is pulled low
142
143
  for (cnt = (length - 1); cnt >= 0; cnt--)      // 2) Read and send byte array
144
  {
145
    SPDR = tx[cnt];                // Write data-byte
146
    
147
    while(!(SPSR & (1<<SPIF)));          // Wait until data is transmitted
148
    
149
    rx[cnt] = SPDR;                // Read data-byte
150
  }
151
152
  SPI_CS_HIGH;                  // 3) Pull SPI-CS high
153
}
154
155
156
// Function, which calculates the LTC2418 input bipolar voltage
157
float LT_code_to_voltage(int32_t adc_code, float LTC2418_lsb)
158
{
159
  // Local variable for the ADC voltage
160
  float adc_voltage;
161
  
162
  
163
  adc_code = adc_code >> 6;              // 1) Bit-shift ADC code to the right 6 bits (remove last 6 bits with address, sign and sgl)
164
  adc_code -= 8388608;                // 2) Convert ADC code from offset binary to binary
165
  adc_voltage = (float) adc_code * (LTC2418_lsb);    // 3) Calculate voltage from ADC code and lsb.
166
  
167
  return(adc_voltage);                // Return the ADC voltage value
168
}

von Arc N. (arc)


Lesenswert?

Jens K. schrieb:
> Ich übergeben: ...

Sollte passen

> Ich habe mal das Ergebnis am LA in den Anhang gepackt. Leider klappt die
> Umrechnung des Ergebnisses in den Spannungswert noch nicht. Eigentlich
> sollte er an dem Pin VCC messen, da dieser mit der
> Referenzspannungsquelle verbunden ist. Klappt scheinbar noch nicht.
> Hier noch mein überarbeiteter Code:

Das sollte auch nicht funktionieren, da der LTC nur differentielle 
Signale (In+ - In-) von -0.5 VRef bis 0.5 VRef messen kann. Alles 
darüber/darunter sollte zu entsprechenden Fehlerbits im Ausgabewort 
führen.

von Jens K. (mister232)


Lesenswert?

Der LTC2418 kann doch differentiell und single-ended, je nach SGL-Bit

von Arc N. (arc)


Lesenswert?

Jens K. schrieb:
> Der LTC2418 kann doch differentiell und single-ended, je nach SGL-Bit

Jein... Der misst immer differentiell. Entweder zw. zwei Eingängen oder 
zw. einem Eingang und COM. Am zulässigen Bereich (IN+ - IN-) ändert sich 
dadurch nichts.

: Bearbeitet durch User
von Jens K. (mister232)


Lesenswert?

Das heißt ich kann wircklich nur bis 0.5*Vref messen? .... Sch***

von Jens K. (mister232)


Lesenswert?

Gibt es einen Typen mit gleichem Pinning wie dem LTC2418, welcher eine 
Messung bis Vref erlaubt?

von Arc N. (arc)


Lesenswert?

Jens K. schrieb:
> Das heißt ich kann wircklich nur bis 0.5*Vref messen? .... Sch***

Kommt drauf an... COM oder den jeweiligen IN- auf Vref/2 statt GND 
(relativ niederohmig, siehe Datenblatt), dann kann der positive Eingang 
von GND bis Vref gehen und die Differenz bleibt im zulässigen Bereich 
von +-Vref/2

ADCs mit dem gleichen Pinning wie der LTC2418 sind mir nicht bekannt.

von Jens K. (mister232)


Lesenswert?

Ich habe das Problem mit den Eingangspegeln nun über ein paar neue 
Widerstände lösen können. Am LA sehe ich nun auch eine Veränderung des 
Dateninhaltes vom ADC zum µC, wenn ich die Eingangsspannung ändere. 
Leider bekomme ich aber immer nur 0V auf dem Bildschirm ausgegeben. Ich 
komme einfach nicht auf den Fehler:
1
// Bibliographies to be included
2
#include <math.h>
3
#include <avr/io.h>
4
#include "high_acc_ADC.h"
5
#include "main.h"
6
#include <util/delay.h>
7
#include "user_com.h"
8
#include <stdio.h>
9
10
// Global defines for the SPI-Interface
11
#define SPI_CS_LOW PORTB &= ~(1<<PB0)
12
#define SPI_CS_HIGH PORTB |= (1<<PB0)
13
14
15
// Structure written by LT, which contains variables for the ADC result evaluation
16
typedef struct
17
{
18
  int32_t LT_int32;  // 32-bit signed integer to be converted to four bytes
19
  uint32_t LT_uint32;  // 32-bit unsigned integer to be converted to four bytes
20
  uint8_t LT_byte[4];  // 4 bytes (unsigned 8-bit integers) to be converted to a 32-bit signed or unsigned integer
21
}LT_union_int32_4bytes;
22
23
24
// Functions in this file
25
uint8_t wait_for_eoc(void);
26
uint32_t LTC2418_read(uint8_t channel);
27
void init_SPI(void);
28
void lt_spi_transfer_block(uint8_t *tx, uint8_t *rx, uint8_t length);
29
double LT_code_to_voltage(int32_t adc_code);
30
31
32
// Function to initialize the microcontroller`s SPI-Interface
33
void init_SPI(void)
34
{
35
  DDRB |= (1<<PB0) | (1<<PB2) | (1<<PB1); // Set CS, SCK and MOSI pin as output
36
37
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); // SPI master mode, prescaler 8MHz/16 = 500kHz, SPI enable
38
}
39
40
41
// ************************************************ Functions from LT (modified for control unit) **********************************************************************
42
43
44
// Function, which triggers an ADC-Conversion. It gets an ADC channel and returns the actual voltage value at this channel
45
int16_t adc_conversion(uint8_t channel)
46
{
47
  // Local variable
48
  uint32_t adc_val = 0;
49
50
  
51
  // Check if ADC conversion is done
52
  if(wait_for_eoc())
53
  {
54
    debug_message("Error reading EOC!\n\r");
55
  }
56
  
57
  
58
  // A ADC conversion works as follows: The ADC value is read together with the next channel to read from. So the first conversion contains the result of the selected channel, set in the previous conversion.
59
  // Therefore the first value is read and gets thrown away. With this conversion the right channel gets selected for the next and finial conversion
60
  LTC2418_read(channel);
61
  
62
  // Check if ADC conversion is done
63
  if(wait_for_eoc())
64
  {
65
    debug_message("Error reading EOC!\n\r");
66
  }
67
  
68
  adc_val = LTC2418_read(channel); // Get ADC value previous from selected channel
69
  
70
  return LT_code_to_voltage(adc_val); // Convert the ADC value into a voltage value and return it
71
}
72
73
74
// Function to wait for conversion done by using the EOC-Bit: 1 = Conversion ongoing, 0 = Conversion done
75
uint8_t wait_for_eoc(void)
76
{
77
  // Local variable timer count for MISO
78
  uint16_t timer_count = 0;
79
  
80
  
81
  SPI_CS_LOW;                  // 1.) SPI-CS is pulled low
82
  _delay_us(100);
83
  while (1)                  // 2.) Wait for SDO (MISO) to go low
84
  {
85
    if (!(PINB & (1<<PINB3)))        // 3) If SDO is low, break loop
86
    {
87
      SPI_CS_HIGH;
88
      break;
89
    }
90
    /*
91
    if (timer_count++ > 1000)          // If timeout is reached, return 1 (failure)
92
    {
93
      SPI_CS_HIGH;            // Pull SPI-CS high
94
      return(1);
95
    }*/
96
//     else
97
//     _delay_ms(1);              // Wait for next loop
98
  }
99
  
100
  return(0);
101
}
102
103
104
// Function to read an ADC value from a selected channel
105
uint32_t LTC2418_read(uint8_t channel)
106
{
107
  // Local variables
108
  LT_union_int32_4bytes data, command;
109
  
110
  char test[10];  
111
  
112
  // Set channel selection to the data-byte
113
  command.LT_byte[3] = channel;
114
  command.LT_byte[2] = 0;
115
  command.LT_byte[1] = 0;
116
  command.LT_byte[0] = 0;
117
    
118
  
119
  // Data-byte transmission
120
  SPI_CS_LOW;                              // 1.) SPI-CS is pulled low
121
  
122
  lt_spi_transfer_block(command.LT_byte, data.LT_byte, 4);  // 2) Transfer 4 data-bytes
123
  
124
  SPI_CS_HIGH;                            // 3) Pull SPI-CS high
125
126
127
  return data.LT_int32; // Return raw ADC value
128
}
129
130
131
// Function, which reads and sends a byte array
132
void lt_spi_transfer_block(uint8_t *tx, uint8_t *rx, uint8_t length)
133
{
134
  // Local counting variable
135
  int8_t cnt;
136
137
138
  SPI_CS_LOW;                    // 1.) SPI-CS is pulled low
139
140
  for (cnt = (length - 1); cnt >= 0; cnt--)      // 2) Read and send byte array
141
  {
142
    SPDR = tx[cnt];                // Write data-byte
143
    
144
    while(!(SPSR & (1<<SPIF)));          // Wait until data is transmitted
145
    
146
    rx[cnt] = SPDR;                // Read data-byte
147
  }
148
149
  SPI_CS_HIGH;                  // 3) Pull SPI-CS high
150
}
151
152
153
// Function, which calculates the LTC2418 input bipolar voltage
154
double LT_code_to_voltage(int32_t adc_code)
155
{
156
  // Local variable for the ADC voltage
157
  double adc_voltage;
158
  
159
  adc_code = adc_code >> 6;              // 1) Bit-shift ADC code to the right 6 bits (remove last 6 bits with address, sign and sgl)
160
  //adc_code -= 8388608;                // 2) Convert ADC code from offset binary to binary
161
  adc_code = adc_code & 8388607;
162
  
163
  adc_voltage = (adc_code * 5.0) / 16777216;      // 3) Calculate voltage from ADC code and lsb.
164
  
165
  return(adc_voltage);                // Return the ADC voltage value
166
}

von Jens K. (mister232)


Angehängte Dateien:

Lesenswert?

Hier noch ein aktueller Auszug des LA

von Jens K. (mister232)


Lesenswert?

Jemand eine Idee?

von Jens K. (mister232)


Lesenswert?

Ich vermute irgendwie es liegt an dem struct, müsste das nicht eine 
Union 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.