Display ansteuern? Nichts funktioniert :(

OP #3438929
Lesenswert?

Hallo zusammen,

ich versuche bereits seit zwei Tagen das Display zum laufen zu bekommen, 
aber nichts funktioniert. Ich könnte noch nicht einmal sagen, ob die 
Anzeige vllt. defekt ist.

So sieht meine Verbindung aus:

ATTiny44A ---- EADOGS102N-6
===========================
PA1 - CS0
PA2 - Reset
PA3 - CD
PA4 (USCK) - SCK
PA5 (MISO) -
PA6 (MOSI) - SDA

Das Display läuft mit 3,3V und wurde mit den angegebenen 3x 1µF 
Kondensatoren
angeschlossen (http://www.lcd-module.de/deu/pdf/grafik/dogs102-6.pdf, 
Seite 4)

Hier der Code zum initialisieren:
1
#define LCD_CS      1
2
#define LCD_RST     2
3
#define LCD_CD      3
4
#define SPI_SCK     4 
5
#define SPI_MISO    5        
6
#define SPI_MOSI    6  
7
 
8

9
void SPI_Init(void) 
10
{
11
  DDRA  = (1 << LCD_RST); 
12
  DDRA  = (1 << LCD_CD);
13
  DDRA  = (1 << SPI_MOSI);
14
  DDRA  = (1 << SPI_SCK);
15

16
  PORTA &= ~(1 << SPI_MISO); 
17
  PORTA = (1 << SPI_MISO); 
18

19
  USICR = (1 << USIWM0); //Three Wire Mode DO,DI,USCK
20
  USICR = (1 << USICLK);
21
  USICR = (1 << USITC);
22
  USICR = (1 << USICS1);
23
}
24

25
void SPI_Transmit(char cData)
26
{
27
  PORTA &= ~(1<<LCD_CS);
28
  USIDR = cData;
29
  while(!(USISR & (1<<USISIF)))
30
  ;
31
  PORTA |= (1<<LCD_CS);
32
}
33

34
void DISPLAY_Init(void)
35
{
36
  SPI_Transmit(0x40);
37
  SPI_Transmit(0xA1);
38
  SPI_Transmit(0xC0);
39
  SPI_Transmit(0xA4);
40
  SPI_Transmit(0xA6);
41
  SPI_Transmit(0xA2);
42
  SPI_Transmit(0x2F);
43
  SPI_Transmit(0x27);
44
  SPI_Transmit(0x81);
45
  SPI_Transmit(0x10);
46
  SPI_Transmit(0xFA);
47
  SPI_Transmit(0x90);
48
  SPI_Transmit(0xAF);
49
}
50

51
int main(void)
52
{
53
  SPI_Init();
54
 _delay_ms(50);
55

56
  DISPLAY_Init();
57
  _delay_ms(50);
58
}

Man sieht leider überhaupt nichts. Habe ich etwas vergessen?

Danke
Gast #3438968
Lesenswert?

> Das war nun leider nicht der Fehler

..dann wars nicht ∗der∗ Fehler sondern ∗einer∗ (von vielen). Aber um 
nochmals darauf herumzureiten: was hast Du denn geändert an den 
markierten Stellen und wo noch überall? Oder anders gesagt: Wie sieht 
der Code jetzt aus?
#3439000
Lesenswert?

Die gesamte Routine kannst du in der Pfeife rauchen:
1
void SPI_Init(void) 
2
{
3
  DDRA  = (1 << LCD_RST); 
4
  DDRA  = (1 << LCD_CD);
5
  DDRA  = (1 << SPI_MOSI);
6
  DDRA  = (1 << SPI_SCK);
7

8
  PORTA &= ~(1 << SPI_MISO); 
9
  PORTA = (1 << SPI_MISO); 
10

11
  USICR = (1 << USIWM0); //Three Wire Mode DO,DI,USCK
12
  USICR = (1 << USICLK);
13
  USICR = (1 << USITC);
14
  USICR = (1 << USICS1);
15
}

Wenn hier das Timing nicht stimmt, macht dein Display garnix.
#3439011
Lesenswert?

T.roll schrieb:
>>  DDRA  = (1 << LCD_CD);
>>Aus dem = habe ich ein |= gemacht.
>
> Pin CD möchte welchen Level für Kommandos? Richtig! Low. Du schaltest
> ihn aber auf High für Daten.

eigentlich nicht.
An dieser Stelle wird erst mal nur der Pin auf Ausgang gestellt.

Aber so unrecht hast du nicht, denn in
1
void SPI_Transmit(char cData)
2
{
3
  PORTA &= ~(1<<LCD_CS);
4
...
wird fleissig an einem Pin LCD_CS rumgeschraubt. Der allerdings ist 
wiederrum nicht auf Ausgang gestellt.

Ach das hat doch keinen Sinn.
Zeig deinen kompletten Code, so wie er jetzt ist. Das muss doch alles 
kontrolliert werden. Da steckt doch noch jede Menge anderes Zeugs 
drinnen. Immer dieses posten von Code-Fitzelchen. Und die Helfer dürfen 
sich dann aus 3 Posts und jeder Menge Phantasie die Einzelteile zusammen 
suchen, wie der Code wohl jetzt aussehen könnte. Du bist der der Hilfe 
will. Also mache es anderen leicht dir zu helfen.
#3439075
Lesenswert?

Das Größte Problem ist das es überhaupt keine Warte zeiten zwischen den 
einzelnen schritten gibt. Das heißt das die Pins ständig geändert werden 
aber der Controller des Displays es ganricht mitbekommt.

Du musst aufjedenfall die richtigen Timmings einstellen. Und wie im 
Datenblatt des Displays steht findest du die Timmings im Dattenblatt des 
Diplay Controllers auf Seite 41.

http://www.lcd-module.de/eng/pdf/zubehoer/uc1701.pdf

Stell die Zeiten ruhig ein bisschen länger ein das ist besser als wenn 
sie zu kurtz sind.
OP #3439339
Lesenswert?

Erstmal danke für die vielen Antworten.

Mit einem Teil des Beispielcodes von EADOGS konnte ich das Display zum 
blinken bringen. Wenn ich allerdings den gesamten Code ausführe erhalte 
ich einen Overflow im Data Memory??? Ich habe die beiden mitgelieferten 
Fonts gelöscht und sonst auch keine variablem mit progmem 
gekennzeichnet. Woran kann das liegen?
#3439347
Lesenswert?

Daran, dass du ums verrecken deinen Code nicht herzeigen willst.

Ist das wirklich so schwer zu verstehen?
Wir sind doch hier keine Hellseher!
Du hast also ein Programm geschrieben oder modifiziert. UNd das stürzt 
ab. Und wir sollen jetzt irgendwie wissen, was du da für ein Problem 
erzeugt hast.
Wie soll das gehen? Sollen wir Karten legen? Astrologen befragen? Oder 
doch vielleicht die Antwort channeln?
#3439351
Lesenswert?

Hallo Alexander,

gleich kommen die Antworten, alles einzustellen was da ist, Bilder, der 
aktuelle Schaltplan und der gesamte CODE.

So wird das nichts, und Karl-Heinz hätte dir sicherlich gerne bis zum 
Erfolg geholfen.

Du musst immer bedenken, wir sitzen nicht für der Hardware, noch sehen 
wir den gesamten Code oder kennen die erwarteten und unerwarteten 
Reaktionen des Programms.

Ein Helfer, kann nur ein Helfer sein, wenn er/sie alles von dir erfährt, 
auf Nachfragen musst Du dann gewissenhaft und vollständig antworten.

Sprichwort:
"So wir ein Schuh daraus!"
Gast #3439358
Lesenswert?

Karl Heinz schrieb:
> Ist das wirklich so schwer zu verstehen?
> Wir sind doch hier keine Hellseher!
> Sollen wir Karten legen? Astrologen befragen? Oder
> doch vielleicht die Antwort channeln?

Ruhig Blut, Karl Heinz. Deine Antworten sind immer von herausragender 
Qualität, und - ich weiß nicht, wie Du das machst - Du schaffst es 
nahezu immer, erstaunlich lange die Ruhe zu bewahren. Lass Dich daher 
nicht ärgern - auch ich weiß, wie (sehr) frustrierend es ist, zu 
versuchen, Anfängern irgendetwas erklären zu wollen, wenn diese eine 
bestimmte, vorgefasste Meinung haben und glauben, diese sei korrekt und 
nur so ginge es... Da hilft leider nur das Konzept des "Lernens durch 
Schmerz" (ein in der Erwachsenenerziehung durchaus anerkanntes 
Instrument) - soll heißen, entweder gar nicht antworten oder die 
Qualität der Antwort an die Frage anpassen - soll heißen: Genauso 
schwammig und "mysteriös" antworten, wie die Frage formuliert ist...

Alexander Thies schrieb:
> Overflow im Data Memory
> keine variablem mit progmem

Die .data-Section liegt im RAM und nicht im FLASH, daher hilft Dir 
progmem hier wenig (sofern es das ist, was Du meinst)...
OP #3439370
Lesenswert?

Entschuldigt bitte! Ich freue mich ja über jede Hilfe. Der Code sieht 
jetzt nur genauso aus, wie der Beispielcode aus dem EADogs Archiv weiter 
oben. Die Einzige Ausnahme sind die Änderungen der jeweiligen Pins zur 
Anpassung an meinen Versuchsaufbau. Ich poste es aber gerne trotzdem.


main.c
===========================
1
#include "main.h"
2

3
//////////////////////////////////////////////////////////////////////////
4
///////  Sleep function
5
//////////////////////////////////////////////////////////////////////////
6
void Sleep(unsigned int ms)
7
{
8
  for(; ms>0; ms--) 
9
  {
10
    _delay_ms(1);
11
  }
12
}
13

14
//////////////////////////////////////////////////////////////////////////
15
///////  Main program routine
16
//////////////////////////////////////////////////////////////////////////
17
int main(void)
18
{
19
  spi_init() ;
20
    sei();
21

22
   lcd_init();
23
   _delay_ms(1000);
24
  
25
  lcd_string(0,5,"EA DOGS102-6!", ptr_font_6x8, INVERS); //Printing a line in big fonts, inverted
26
  lcd_string(0,5 + pgm_read_byte(ptr_font_8x16 + 5), "this is next line", ptr_font_6x8, DELETE); //Printing next line small fonts, normal
27

28
    while(1)
29
    {
30

31
    }
32
}






main.h
============
1
#ifndef _MAIN_H
2
#define _MAIN_H
3

4
#define XPIXEL 102
5
#define YPIXEL 64
6
#define XMAX XPIXEL-1
7
#define YMAX YPIXEL-1
8

9
//Meine pins
10
#define LCD_CS      1
11
#define LCD_RST     2
12
#define LCD_CD      3
13
#define SPI_SCK     4
14
#define SPI_MISO    5
15
#define SPI_MOSI    6
16

17
#include <stdint.h>
18
#include <inttypes.h>
19
#include <avr/io.h>
20
#include <avr/interrupt.h>
21
#include <avr/pgmspace.h>
22

23
#include "lcd.h"
24
#include "spi.h"
25
#include "font_6x8.h"
26
#include "font_8x16.h"
27

28
#ifndef F_CPU
29
#define F_CPU 1000000UL
30
#endif
31

32
#include <util/delay.h>
33

34

35
#endif






spi.c
============
1
#include "main.h"
2

3
void spi_init(void)
4
{
5
        volatile uint8_t IOReg;
6

7
    // set PB3(MOSI), PB5(SCK), PB2(SS) CS, PB1(CD) as output
8
        DDRA    |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<LCD_CS)|(1<<LCD_CD);
9

10
    // enable SPI in Master Mode with SCK = CK/4, CPHA = 1
11
        //USICR    = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<CPOL);
12
    USICR |= (1 << USIWM0); //Three Wire Mode DO,DI,USCK
13
    USICR |= (1 << USICLK);
14
    USICR |= (1 << USITC);
15
    USICR |= (1 << USICS1);
16
  
17
        IOReg   = USISR;         //clear SPIF bit in SPSR
18
        IOReg   = USIDR;      //clear receive buffer
19
    PORTB |= (1<<LCD_CD);    //SS high
20
    PORTB |= (1<<LCD_CD);    //CD high
21
}
22

23
uint8_t spi_byte (uint8_t data)
24
{
25

26
  USIDR = data; //send data
27
  while (!(USISR & (1<<USISIF)));    // wait until byte is sent and received
28

29
  return USIDR; //return received data (not used with EA DOGS102-6,
30
         //but you have to read out, because ATMega needs it
31
}






spi.h
============
1
#ifndef _SPI_H
2
#define _SPI_H
3

4
//----------------- Functions ------------
5
void spi_init(void);
6
uint8_t spi_byte (uint8_t data);
7

8

9
#endif

lcd.c (rest wie im archiv)
============
1
#include "main.h"
2

3
unsigned char lcd_buffer[XPIXEL][YPIXEL/8];  //Buffer to store display data. The buffer organization is equal to
4
                       // the one of the display
5

6

7
void lcd_init(void)
8
{
9
  DDRA |= (1<<LCD_RST); //Set display reset as output
10

11
  PORTA|=(1<<LCD_RST);  //Set display reset to high -> LCD is running now
12

13
  //Initialize bottom view 3.3V (booster on) 8Bit SPI
14
  lcd_send_command(0x40); //Startline 0
15
  lcd_send_command(0xA1); //SEG reverse
16
  lcd_send_command(0xC0); //Set COM direction (COM0-COM63)
17
  lcd_send_command(0xA4); //Set all Pixel to on
18
  lcd_send_command(0xA6); //Display inverse off
19
  lcd_send_command(0xA2); //Set bias 1/9
20
  lcd_send_command(0x2F); //Booster, regulator, follower on
21
  lcd_send_command(0x27); //Set contrast
22
  lcd_send_command(0x81); //Set contrast
23
  lcd_send_command(0x10); //Set contrast
24
  lcd_send_command(0xFA); //Temperature compensation
25
  lcd_send_command(0x90); //Temperature compensation
26
  lcd_send_command(0xAF); //Display on
27

28
  lcd_clear_all(); //Clear display and set display buffer to 0
29

30
}
31

32

33
void lcd_send(uint8_t data, uint8_t cd)
34
{
35
  PORTA&=~(1<<LCD_CS);      //Slave select (DCS to gnd)
36
  if (cd == 0)
37
    PORTA&=~(1<<LCD_CD);  //Send command (DCD to 0)
38
  else
39
    PORTA|=(1<<LCD_CD);  //Send data (DCD to 1)
40

41
  spi_byte(data);      //Send data
42

43
}






lcd.h
============
1
#ifndef _LCD_H
2
#define _LCD_H
3

4
//----------------- Definitions -----------
5
#define DELETE 0
6
#define ADD  1
7
#define INVERS 2
8

9
//-------------- Global varibales ----------
10
extern unsigned char lcd_buffer[XPIXEL][YPIXEL/8];
11

12
//--------------- Macrofuncitons ----------
13
#define lcd_send_command(data) lcd_send(data, 0)
14
#define lcd_send_data(data) lcd_send(data, 1)
15
#define lcd_clear_all() lcd_clear(0,0,XPIXEL-1,YPIXEL-1)
16
#define lcd_fill_all() lcd_fill(0,0,XPIXEL-1,YPIXEL-1)
17

18
//----------------- Functions ------------
19
void lcd_init(void);
20
void lcd_send(uint8_t data, uint8_t cd);
21
void lcd_clear(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
22
void lcd_fill(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
23
void lcd_line(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
24
void lcd_rect(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
25
void lcd_char(uint8_t x, uint8_t y, uint8_t data, uint8_t *font, uint8_t linkmode);
26
void lcd_string(uint8_t x, uint8_t y, char *data, uint8_t *font, uint8_t linkmode );
27

28

29
#endif
30
//----------------- EOF lcd.h ------------
#3439388
Lesenswert?

Hi,

beim schnellen durchblättern entdeckt, ich kommentiere es nicht weiter:
1
 PORTB |= (1<<LCD_CD);    //SS high
2
    PORTB |= (1<<LCD_CD);    //CD high

Noch eine Frage, gibt es dazu ein Makefile ?

Oder anders gefragt: wie werden die Dateien übersetzt und gelinkt ?
#3439419
Lesenswert?

Alexander Thies schrieb:
> Schaue ich mir direkt mal an! Das Problem ist gerade immer noch die
> Fehlermeldung mit dem Memory Overflow.
>
>
1
> Program Memory Usage : 7076 bytes   172,8 % Full (Memory Overflow)
2
> Data Memory Usage : 848 bytes   331,3 % Full (Memory Overflow)
3
>


Das Teil ist schlicht und ergreifend zu groß für einen Tiny44.
4K Flash - damit kann man schon was anfangen.
Aber 256 Bytes SRAM íst nun mal nicht viel.
#3439424
Lesenswert?

1
#include "font_6x8.h"
2
#include "font_8x16.h"

beide Fonts im Flash.
Die verbrauchen schon jede Menge Platz im Flash.

Die könnte man noch leswerden.
Kritischer sind aber die 256 Byte SRAM.
Da heisst es sparsam mit globalen Variablen umgehen, bzw. alle Strings 
ins Flash verbannen (nachdem es von einem Font leergeräumt wurde)
OP #3439446
Lesenswert?

Wenn ich die Fonts weglasse sieht es wie folgt aus:
1
Program Memory Usage : 608 bytes   14,8 % Full
2
Data Memory Usage : 816 bytes   318,8 % Full  (Memory Overflow)

Es scheint als wäre der Display Buffer zu groß
1
unsigned char lcd_buffer[XPIXEL][YPIXEL/8];

Das sind genau die 816 Byte :(
#3439469
Lesenswert?

An alle die dieses LCD kennen.
Seh ich das richtig, dass laut Datenblatt
http://www.lcd-module.de/deu/pdf/grafik/dogs102-6.pdf
es kein "Read Data Byte" Kommando gibt?


Denn sorry, Alexander.
In diesem Fall ist dieses LCD im Zusammenhang mit deinem Tiny44 
gestorben.
Wenn es ein derartiges Kommando gäbe, dann könnte man auf Kosten der 
Laufzeit noch etwas retten. Aber ohne dieses Kommandos bleibt dir nun 
mal nichts anderes übrig, als im Speicher eine binäre Repräsentierung 
der Pixel vorzuhalten, um korrekt zeichnen zu können.
Wer Grafik mit einem unintelligentem DIsplay machen will, braucht nun 
mal in erster Linie eines: Speicher, Speicher, Speicher.
Und genau den hat dein Tiny44 nicht.
#3439520
Lesenswert?

In dem Fall würde ich erst mal auf anderen Controller plädieren.

Nichts gegen den Tiny44. Aber mit 256 Bytes SRAM gewinnt man nun mal 
keinen Blumentopf.
Diese Speichermenge reicht, wenn man ein fertiges Projekt hat, welches 
diese Menge oder weniger benötigt und man sich fragt, welchen µC man 
jetzt in der Massenproduktion einsetzt. Dann ist der Tiny44 ein 
Kandidat.

Aber als allgemeines Entwicklungssystem ist das nun mal zu wenig. Ein 
bisschen 'rühren' muss man sich schon können, ohne gleich an allen Ecken 
und Enden an die Limits zu stossen.
Gast #3439584
Lesenswert?

Karl Heinz schrieb:
> In diesem Fall ist dieses LCD im Zusammenhang mit deinem Tiny44
> gestorben.

Warum? Das größere SRam benötigt er nur, wenn er Pixel einzeln setzen 
und löschen will. Für schlichte (überschreibende) Grafikausgaben oder 
Text würd' der Tiny44 noch reichen.

Vielleicht sollte man hier mit dem Vorhandenen erstmal ein 
Erfolgserlebnis produzieren, statt wegen anderer Gründe die Flinte ins's 
Korn zu werfen.

Ansteuerbar ist das Display (mit eingeschränkten Features), lediglich 
baut der TE zu viele Fehler, wozu auch die Verwendung nicht vorhandenem 
SRams gehört. Deswegen geht's nicht. Fehler wird er jedoch auf einem 
XMega genauso bauen.

Soll er sich 'nen anderen Code irgendwoher kopieren, denn selbst 
geschrieben ist das wohl nicht. Wer das selbst geschrieben und somit 
verstanden hätte, wäre frühzeitig zum Schluss gekommen, dass 816 Bytes 
nicht in 256 Bytes rein passen. Und auch dass EEProm zwar zur 
Bereithaltung von Bitmaps verwendbar ist, aber nicht als Bildspeicher 
zur Pixeladressierung taugt.

Da mangelt's einfach an den Grundlagen, ein größerer µC macht lediglich 
bestimmten copy/paste Code direkt verwendbar, verstehen wird er deswegen 
auch nicht mehr.
OP #3441768
Lesenswert?

Danke für eure Hilfe! Leider läuft das Display immer noch nicht.
Ich habe jetzt schon diverse Szenarien durchprobiert und folgendes 
notiert.
Im Anhang sind noch ein paar Bilder.

Display mit 3,23V (über Spannungsteiler):

                 Nach Start              Nach Knopfdruck (Erreichen BP)
========================================================================
Debug Modus:     Erst 3 schwarze Streifen,| Wieder weiß mit 3 Streifen
                 dann langsam komplett      dann langsam wieder schwarz
                 schwarz

Normaler Start:  Weißer Bildschirm          Weißer Bildschirm






Display mit 3,35V (über Spannungswandler):

                 Nach Start              Nach Knopfdruck (Erreichen BP)
========================================================================
Debug Modus:     Erst schwarz dann langsam,| Erst weiß, dann wieder wie
                 verblassend                 links

Normaler Start:  Weißer Bildschirm          Weißer Bildschirm


Hier einmal die Anschlüsse des Displays:

15 VLCD: über 1µF Elko an GND
16 VB1- über 1µF Elko an VB1+
17 VB0- über 1µF Elko an VB0+
18 VB0+ s.o.
19 VB1+ s.o.
20 VSS an 3,3V
21 VSS an 3,3V
22 VDD2/3 GND
23 VDD1 GND
24 SDA/MOSI an PA5/DO
25 SCK an PA4/USCK
26 CD an PA3
27 RST an PA2
28 CS0 an PA1
Angehängte Dateien:
Gast #3441846
Lesenswert?

Hi

>15 VLCD: über 1µF Elko an GND
>16 VB1- über 1µF Elko an VB1+
>17 VB0- über 1µF Elko an VB0+

Die Elkos solltest du durch Keramikkondensatoren ersetzen.

Welche Spannung misst du an VLCD?

MfG Spess
OP #3442290
Lesenswert?

> Welche Spannung misst du an VLCD?
>
> MfG Spess

0V messe ich, aber das ist ja auch nicht verwunderlich. Der Elko hängt 
doch in Reihe hinter VLCD an GND.



> Woher stammen die 3,23 V? Ausgerechnet oder gemessen (mit oder ohne
> Display)?
> Ein Spannungsteiler alleine taugt nur zur Stromversorgung, wenn man
> wirklich weiß, was man tut. Wenn Dein Display keine konstante
> Stromaufnahme hat, wackeln Deine 3,23V lustig umher...

Wenn ich den Spannungswandler benutze liegen über dem Display die 3,3V 
an.

Wenn ich es an den Spannungsteiler (3,23V) anschließe, kann ich über dem 
Display noch 1,04V an. Der Spannungsteiler war nur zum Experimentieren 
da. Ich hatte die Vermutung, dass vllt. der DCDC Spannungswandler defekt 
ist. Das scheint aber nicht der Fall zu sein.
Gast #3442342
Lesenswert?

Hi

>0V messe ich, aber das ist ja auch nicht verwunderlich. Der Elko hängt
>doch in Reihe hinter VLCD an GND.

Selbstverständlich ist das verwunderlich. VLCD ist der Ausgang für die 
LCD-Spannung (>VCC). Der Kondensator dort dient der Glättung. Bei einem 
ordentlich initialisiertem Display sollten dort 5..10V anliegen.

MfG Spess
Gast #3442894
Lesenswert?

Hi

>Ich habe gerade nochmal nachgemessen. Zwischen Vlcd und gnd sind es
>jetzt 1,4V??

Bei meinem USB-Testboard liegen bei einen funktionierenden DOGS102 9,3V 
an VLCD.

Entweder klappt deine Initialisierung nicht oder es liegt an deinen 
Kondensatoren. Ich setze generell Keramik-Cs ein und hatte bisher nie 
Probleme. Ist auch eine Empfehlung von EA.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren