Forum: FPGA, VHDL & Co. SPI-Master in Verilog mit TLC5970


von Michael (Gast)


Lesenswert?

Hallo,
ich bin neuling auf dem Gebiet der FPGAs, jedoch sehr begeistert von den 
Möglichkeiten die sie einem bieten. Ich versuche nun schon seit wochen 
eine RGB-LED die an den TLC5970 angeschlossen ist per SPI anzusteuern 
jedoch schaffe ich es ums verrecken nicht.
Laut Datenblatt schreibt man per SPI 40-Bit hintereinander in ein Latch. 
Nach der letzten steigenden Flanke des SPI-Clocks wartet der TLC5970 
eine Latch-Time ab bis er die Daten in sein internes Latch 
weiterschiebt. Mein Problem ist jetzt, dass ich mir nicht sicher bin ob 
ich überhaupt die ganzen 40-Bit hintereinander an das TLc senden muss 
und wie lange ich warten muss nach der letzten steigende Flanke .Ich 
arbeite mit dem Digilent Spartan-3A Bord mit einem Spartan-3 XC3S200. 
Mein Code ist sehr gewöhnungsbdürftig, ich hoffe ihr versteht dennoch 
was ich vorhabe.

SPI-Master-Top
1
`timescale 10ps/10ps
2
3
module spi_master_top(
4
  input wire clk_50m,
5
  output wire sclk,
6
  output wire mosi,
7
  output wire cs,
8
  output wire test_sclk,
9
  output reg clk_2m
10
  );
11
12
wire clk_108m;
13
reg [9:0] clkcount = 0;
14
15
16
spi_master spi_m (
17
  .clk_2m(clk_2m),
18
  .mosi(mosi),
19
  .sclk(sclk),
20
  .cs(cs),
21
  .test_sclk(test_sclk)
22
  );
23
  
24
pll_108m pll (
25
    .CLKIN_IN(clk_50m),
26
    .RST_IN(1'b0), 
27
    .CLKFX_OUT(clk_108m), 
28
    .CLKIN_IBUFG_OUT(), 
29
    .CLK0_OUT(), 
30
    .LOCKED_OUT()
31
    );
32
33
always@(posedge clk_108m)
34
begin
35
  if(clkcount == 26)
36
  begin
37
    //test_sclk = ~test_sclk;
38
    //test_mosi = ~test_mosi;
39
    clkcount = 0;
40
    clk_2m = ~clk_2m;
41
  end
42
  clkcount = clkcount + 1;
43
end
44
45
endmodule

SPI-Master
1
`timescale 10ps/10ps
2
3
module spi_master(
4
  input wire clk_2m,
5
  output wire mosi,
6
  output wire sclk,
7
  output wire cs,
8
  output wire test_sclk
9
  );
10
11
reg [199:0] out_data [2:0];
12
reg sclk_buffer = 0;
13
reg mosi_buffer = 0;
14
reg cs_buffer  = 1;
15
16
reg [199:0] out_buffer = 199'd0;
17
integer clk_count = 0;
18
integer pos = 0;
19
20
       
21
initial
22
begin
23
  out_data[0] = 200'b11110000000000000000000000000001011111111111000000000000000000000000000101111111111100000000000000000000000000010111111111110000000000000000000000000001011111111111000000000000000000000000000101111111;
24
  out_data[1] = 200'b11100000000000000001111111111111111111111110000000000000000111111111111111111111111000000000000000011111111111111111111111100000000000000001111111111111111111111110000000000000000111111111111111111111;
25
  out_data[2] = 200'b00000000000000000000000000001111111111110000000000000000000000000000111111111111000000000000000000000000000011111111111100000000000000000000000000001111111111110000000000000000000000000000111111111111;
26
  //out_data[0] = 200'b11111110100000000000000000000000000011111111111010000000000000000000000000001111111111101000000000000000000000000000111111111110100000000000000000000000000011111111111010000000000000000000000000001111;
27
  //out_data[1] = 200'b11111111111111111111100000000000000001111111111111111111111110000000000000000111111111111111111111111000000000000000011111111111111111111111100000000000000001111111111111111111111110000000000000000111;
28
  //out_data[2] = 200'b00000000000000000000000011111111111100000000000000000000000000001111111111110000000000000000000000000000111111111111000000000000000000000000000011111111111100000000000000000000000000001111111111110000;
29
end
30
31
always@(negedge clk_2m)
32
begin
33
  if(clk_count == 26000)
34
  //if(clk_count == 10)
35
  begin
36
    cs_buffer = 0;
37
    out_buffer = out_data[pos];
38
    mosi_buffer = out_data[pos][199];
39
    out_buffer = out_buffer << 1;
40
  end
41
  if(clk_count >= 26001)
42
  //if(clk_count >= 12)
43
  begin
44
    sclk_buffer = ~sclk_buffer;
45
    if(!sclk_buffer)
46
    begin
47
      mosi_buffer = out_buffer[199];
48
      out_buffer = out_buffer << 1;
49
    end
50
    if(clk_count == 26400)
51
    //if(clk_count == 91)
52
    begin
53
      mosi_buffer = 0;
54
      sclk_buffer = 0;
55
      cs_buffer = 1;
56
      clk_count = 0;
57
      pos = pos + 1;
58
    end
59
  end
60
  if(pos == 3)
61
  begin
62
    pos = 0;
63
    clk_count = 0;
64
  end
65
  clk_count = clk_count + 1;
66
end
67
68
assign sclk = sclk_buffer;
69
assign mosi = mosi_buffer;
70
assign cs = cs_buffer;
71
assign test_sclk = clk_2m;
72
73
endmodule

Danke für eure Hilfe...

MfG
Michael

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> Mein Problem ist jetzt, dass ich mir nicht sicher bin ob
> ich überhaupt die ganzen 40-Bit hintereinander an das TLc senden muss
Ja klar, denn da sind immer 4 Adressbits und 36 Datenbits dabei. Sieh 
dir einfach mal die Seite 32 an...
> und wie lange ich warten muss nach der letzten steigende Flanke
Seite 41 "Internal Latch Pulse Delay Time"

Sihe dir einfach mal das Datenblatt des Bausteins noch ein wenig genauer 
an. Als Tipp: PDFs lassen sich super toll durchsuchen...

von Michael (Gast)


Lesenswert?

Danke für sie schnelle Antwort !
Ich muss zugeben, ich hab die Frage gestellt weil ich das schon die 
ganze zeit mache, es aber trotzdem nicht funktioniert.
Ich habe das so verstanden, dass ich die FC/BC sende (Adresse 1111) und 
dann die LATTIM abwarte damit der TLC die Daten in das FC/BC Register 
schiebt. Daraufhin sende ich wieder 40-Bit, diemal jedoch für das 
DC-Register (Adresse 1110). Dann warte ich wieder und sende nochmal die 
40-Bit für das GC-Register. Wenn DSPRPT nun aktiviert ist, sollte die 
erste LED nun leuchten oder?
Der TLC den ich verwende, sitzt auf einer LED-Leiste. Der Hersteller von 
dem ich die habe, hat die LATTIM auf 1111 gesetzt. Also muss ich 10-16 
ms warten.

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Etwas schwer zu lesen, aber es sieht so aus als ob du pos bei jeder SPI 
Clockflanke erhöhst, sozusagen DDR.

Was sagt die Simulation? Was sagt das Osci?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Etwas schwer zu lesen
Richtig, weil der Takt-Vorteiler in den Code mit reingemantscht ist...

> Was sagt die Simulation?
Das wäre allerdings interessant.

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Wie gesagt, ich programmiere erst seit ca. 2 Monaten in Verilog, daher 
entschuldigt meinen sehr unprofessionellen Code. DIe Simulation habe ich 
mal angehängt. Das Oszi sagt dasselbe, wenn die LATTIM am Ende der 
Übertragung ganz kurz ist (10 Takte). Ist Sie jedoch so lang wie im 
Datenblatt gefordert (10-16 ms), sieht man auf dem Oszi nichts 
erkennbares mehr.

MfG
Michael

von Michael W. (michael_w85)


Lesenswert?

Den Taktteiler habe ich übrigens mit reingemischt, weil ich es leider 
nicht hinbekommen habe die MOSI Leitung einen Takt bevor SCLK anfängt 
mit dem ersten Bit zu setzen. Nur zur Erklärung...

von Lattice User (Gast)


Lesenswert?

Ich habe mir das Datenblatt des TLC5970 jetzt mal angeschaut. SPI würde 
ich das Interface nicht nennen. Wenn du später mal einen richtigen SPI 
Master daraus ableiten möchtest bekommst du graue Haare.

Wenn ich es richtig verstanden habe braucht der TLC5970 alle 40 bit eine 
Pause in der Clock um den internal Latch zu erzeugen. Und diese Pause 
fehlt bei dir.

von Michael W. (michael_w85)


Lesenswert?

Das ist mir auch bewusst... Der TLC benötigt ja auch keinen CS, demnach 
ist das eine sehr schlechte SPI-Umsetzung. Zu der Pause: Richtig, so 
habe ich das auch verstanden. Und die Pause ist auch vorhanden, jedoch 
nicht nach 40 Bit sondern nach 200 Bit. Das liegt daran das auf der 
LED-Leiste insgesamt 5 TLCs miteinander kaskadiert sind. Damit alle TLCs 
mit daten gefüttert werden übertrage ich insgesamt 200 Bit und pausiere 
dann erst. Ich kann aber auch dazu sagen das es nicht funktioniert hat, 
als ich nur 40 Bit für die erste LED übertragen habe und die Pause 
direkt danach eingelegt habe. Daher auch meine Frage ob noch jemand eine 
Idee hat, woran es liegen kann... Sieht das Timing denn ansonsten 
akzeptabel aus?!

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Michael W. schrieb:
> Das ist mir auch bewusst... Der TLC benötigt ja auch keinen CS, demnach
> ist das eine sehr schlechte SPI-Umsetzung. Zu der Pause: Richtig, so
> habe ich das auch verstanden. Und die Pause ist auch vorhanden, jedoch
> nicht nach 40 Bit sondern nach 200 Bit. Das liegt daran das auf der
> LED-Leiste insgesamt 5 TLCs miteinander kaskadiert sind. Damit alle TLCs
> mit daten gefüttert werden übertrage ich insgesamt 200 Bit und pausiere
> dann erst.

Im Datenblatt steht zwar etwas von unbergrenzter Kaskadierung, ist mir 
aber nicht klar woher jeder TLC weiss welche 40 bit von den 200 für ihn 
gedacht sind.

> Ich kann aber auch dazu sagen das es nicht funktioniert hat,
> als ich nur 40 Bit für die erste LED übertragen habe und die Pause
> direkt danach eingelegt habe. Daher auch meine Frage ob noch jemand eine
> Idee hat, woran es liegen kann...

Wie sind die B Eingänge der TLC angeschlossen?

> Sieht das Timing denn ansonsten
> akzeptabel aus?!
>
Eigentlich schon.

von Michael W. (michael_w85)


Lesenswert?

Also den Timings entnehme ich das die Daten direkt weitergeshiftet 
werden. Übertrage ich die ersten 40 Bit, stehen die komplett im Register 
des 1. TLCs. Übertrage ich das 41 Bit, steht das 1.Bit nun im Register 
des 2. TLCs. Und dann immer so weiter. Die ersten 40 Bit von den 200 die 
ich übertrage steen demnach am Ende im letzten TLC.
Mit dem B-Eingängen meinst du denke ich die invertierten Pins. Diese 
habe ich garnicht beschaltet. Ich verwende für die Eingabe SCKA und SDTA 
und Kaskadiert werden die TLCs mit SCKY und SDTY. Quasi genauso wie auf 
dem Titelblatt des Datenblatts.

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Michael W. schrieb:
> Mit dem B-Eingängen meinst du denke ich die invertierten Pins. Diese
> habe ich garnicht beschaltet. Ich verwende für die Eingabe SCKA und SDTA
> und Kaskadiert werden die TLCs mit SCKY und SDTY. Quasi genauso wie auf
> dem Titelblatt des Datenblatts.

Welches Datenblatt liegt dir vor?
Bei dem das ich mir vorhin von TI geladen habe, sind die B Eingänge in 
allen Applikations Beispielen angeschlossen, auch auf der ersten Seite.
Ich vermute stark, dass da das Problem liegt.

von Michael W. (michael_w85)


Lesenswert?

Dasselbe das du auch vor dir haben wirst. Ich habe nur eins gefunden, 
das es direkt auf der TI-Seite gibt. Das ist eine Interessante 
These...Jedoch ist der Sinn für mich nicht ersichtlich alle 4 Leitungen 
zu beschalten. Sind die Leitungen dann auch mit den entsprechenden 
Signalen zu betreiben, also wirklich der invertierte Takt und die 
invertierten Daten? Ich werde das gleich mal ausprobieren und werde dann 
entweder heute Nacht oder morgen früh mal berichten was sich getan hat. 
Ich bin mir nur momentan auch nicht mehr sicher ob die kaskadierung auf 
der LED-Leiste auch alle 4 Leitungen verwendet, ich meine nämlich dass 
da nur zwei leitungen verwendeten werden, müssten da nicht dann 
theoretisch auch alle 4 Leitungen verwendet werden? Ich werde mal 
nachsehen wenn ich zu Hause bin und auch das nochmal bescheid geben ;)
Danke schon einmal für deine Hilfe und Zeit !! :)
Wenn es wirklich daran liegt, würde  mir ein Stein vom Herzen fallen.

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Michael W. schrieb:
> Jedoch ist der Sinn für mich nicht ersichtlich alle 4 Leitungen
> zu beschalten

Störsicherheit, EMC/EMI ......, und damit auch Kabellänge.
Nennt sich differentielle Datenübertragung.

von Michael W. (michael_w85)


Lesenswert?

Ahh okay, habe ich wieder was gelernt. Dafür ist dann wohl auch das DSI 
(Differential Signal Interface) zuständig oder? Ist der denn jetzt auch 
"theoretisc" notwendig, dass die kaskadierung ebenfalls alle 4 
Signalleitungen verwendet oder ist das egal, weil die leitungen ja auf 
der Platine liegen und nicht über "Kabel" verbunden sind?

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Michael W. schrieb:
> Ist der denn jetzt auch
> "theoretisc" notwendig, dass die kaskadierung ebenfalls alle 4
> Signalleitungen verwendet oder ist das egal, weil die leitungen ja auf
> der Platine liegen und nicht über "Kabel" verbunden sind?

Ja ist notwendig, da beide Inputs auf gleichem Pegel die Schaltschwelle 
darstellen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael W. schrieb:
> Ist der denn jetzt auch "theoretisc" notwendig, dass die
> kaskadierung ebenfalls alle 4 Signalleitungen verwendet
Ähm, wie meinst du sollte es denn sonst funktionieren?
Das ist ein differentielles Signal. Das braucht beide Polaritäten. Für 
Takt und Daten zusammen also 4: T+, T-, D+ und D-. Du könntest 
versuchen, einen der Eingänge auf Ub/2 zu legen, aber das ist dann eher 
ein akademische Spielerei.

von Michael W. (michael_w85)


Angehängte Dateien:

Lesenswert?

@ Lothar Miller
Tut mir leid, aber wie bereits erwähnt befasse ich mich erst seit 
einigen Monaten mit diesem Thema und habe von einem Differentiellen 
Signal bisher noch nichts gehört... Daher war mir auch nicht klar dass 
ich bei Pegel benötige.

@Lattice User
Ich habe es nun mit allen vier Leitungen programmiert, es funktioniert 
jedoch leider immer noch nicht. Ich habe nocheinmal die Timings 
hochgeladen und es auf 40-Bit Daten umgestellt, sende also nicht mehr 
sofort alle 200 Bit. Ich habe auch bereits mehrfach die Leitungen 
überprüft, ob alles korrekt angeschlossen ist. Langsam bin ich mit 
meinem Latein am Ende...

MfG
Michael

von Michael W. (michael_w85)


Angehängte Dateien:

Lesenswert?

Hier noch mal ein paar Bilder vom Oszi...
Leitungen:
Gelb:   SCKA
Grün:   SCKB
Rosa:   SDTA
Türkis: SDTB

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Warum ist bei 01 - 04.png der Pegel von SDTB zu niedrig?
Ansonsten sieht das ok aus.

Ich fürchte du msst dich nochmal eingehend mit dem TLC5970 
auseinandersetzen,
vielleicht braucht er einen Resetbefehl, oder eine Einstellung falsch?

Um HW Probleme auf den seriellen endgültig auszuschliessen kannst du dir 
noch die Ausgänge am Osci anschauen.

Mehr kann ich leider nicht mehr helfen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Ansonsten sieht das ok aus.
Kommen die Überschwinger im Takt wirklich nur von Messaufbau?
Ich würde mal gerne das Differenzsignal SCKA-SCKB sehen.

von Michael W. (michael_w85)


Lesenswert?

Lattice User schrieb:
> Warum ist bei 01 - 04.png der Pegel von SDTB zu niedrig?
> Ansonsten sieht das ok aus.
Das weis ich auch nicht. Auf den späteren Bildern sind diese 
verschwunden, dabei habe ich lediglich ein neues Bild erstellt.

Lothar Miller schrieb:
> Kommen die Überschwinger im Takt wirklich nur von Messaufbau?
> Ich würde mal gerne das Differenzsignal SCKA-SCKB sehen.

Könnten die Überschwinger das Problem sein? Der Versuchsaufbau sieht so 
aus, dass die Leitungen alle über ca. 5 cm kurze Steckbrücken verbunden 
werden. Vielleicht sollte ich einen SPI-Stecker auf eine kleine Platine 
löten und die Pins dann darüber verbinden...
Bei einem Takt von 4,5 MHz kann ich mir gut vorstellen, dass das Signal 
da nicht so optimal durchläuft. Ich kann das Differenzsignal gerne 
nocheinmal darstellen, jedoch bin ich erst am Montag wieder in der Uni 
sodass ich ein Oszi zur Verfügung habe...

Ich habe den Code zudem nochmal "rundum erneuert". Vielleicht ist es 
jetzt etwas einfacher zu lesen und zu verstehen...
1
`timescale 10ps/10ps
2
3
module spi_master(
4
  input wire clk_9m,
5
  output wire mosia,
6
  output wire sclka,
7
  output wire mosib,
8
  output wire sclkb
9
  );
10
11
reg [199:0] out_data [2:0];
12
reg sclka_buffer;
13
reg mosia_buffer;
14
reg sclkb_buffer;
15
reg mosib_buffer;
16
reg [6:0] state;
17
18
reg [199:0] out_buffer;
19
reg [6:0] NEXT_STATE;
20
integer counter;
21
integer data_counter;
22
integer pos;
23
24
25
/* Parameter Definitionen */
26
    parameter START =     7'b0000001,
27
           SEND_FCBC =   7'b0000010,
28
           SEND_GC =     7'b0000100,
29
           SEND_DATA =   7'b0001000,
30
           WAIT_1S =     7'b0010000,
31
           WAIT_LATTIM = 7'b0100000,
32
           IDLE =       7'b1000000,
33
           FCBC =       0,
34
           GC =        1,
35
           DOTS =      20;
36
37
initial
38
begin
39
  sclka_buffer <= 0;
40
  mosia_buffer <= 0;
41
  sclkb_buffer <= 1;
42
  mosib_buffer <= 1;
43
  counter <= 0;
44
  data_counter <= 0;
45
  pos <= 0;
46
  out_buffer <= 200'd0;
47
  state <= IDLE;
48
  
49
  /* FC/BC */
50
  //out_data[0] <= 40'b1111000000000000000000000000000101111111;
51
  /* GC */
52
  //out_data[1] <= 40'b0000000000000000111111111111000000000000;
53
  /* DC */
54
  //out_data[2] <= 40'b1110000000000000000111111111111111111111;
55
  
56
  /* FC/BC */
57
  out_data[0] <= 200'b11110000000000000000000000000001011111111111000000000000000000000000000101111111111100000000000000000000000000010111111111110000000000000000000000000001011111111111000000000000000000000000000101111111;
58
  /* GC */
59
  out_data[1] <= 200'b00000000000000001111111111110000000000000000000000000000111111111111000000000000000000000000000011111111111100000000000000000000000000001111111111110000000000000000000000000000111111111111000000000000;
60
  /* DC */
61
  out_data[2] <= 200'b11100000000000000001111111111111111111111110000000000000000111111111111111111111111000000000000000011111111111111111111111100000000000000001111111111111111111111110000000000000000111111111111111111111;
62
end
63
64
always@(negedge clk_9m)
65
begin
66
  case(state)
67
  IDLE:
68
    begin
69
      mosia_buffer = 0;
70
      sclka_buffer = 0;
71
      mosib_buffer = 1;
72
      sclkb_buffer = 1;
73
      if(counter == 9000000)
74
      //if(counter == 9)
75
      begin
76
        counter = 0;
77
        state = SEND_FCBC;
78
      end
79
    end
80
  SEND_FCBC:
81
    begin
82
      pos = FCBC;
83
      out_buffer = out_data[pos];
84
      mosia_buffer = out_data[pos][199];
85
      mosib_buffer = ~out_data[pos][199];
86
      out_buffer = out_buffer << 1;
87
      data_counter = data_counter + 1;
88
      state = SEND_DATA;
89
    end
90
  SEND_GC:
91
    begin
92
      pos = GC;
93
      out_buffer = out_data[pos];
94
      mosia_buffer = out_data[pos][199];
95
      mosib_buffer = ~out_data[pos][199];
96
      out_buffer = out_buffer << 1;
97
      data_counter = data_counter + 1;
98
      state = SEND_DATA;
99
    end
100
  SEND_DATA:
101
    begin
102
      sclka_buffer = ~sclka_buffer;
103
      sclkb_buffer = ~sclka_buffer;
104
      if(!sclka_buffer)
105
      begin
106
        mosia_buffer = out_buffer[199];
107
        mosib_buffer = ~out_buffer[199];
108
        out_buffer = out_buffer << 1;
109
        data_counter = data_counter + 1;
110
      end
111
      if(data_counter > 200)
112
      begin
113
        data_counter = 0;
114
        mosia_buffer = 0;
115
        sclka_buffer = 0;
116
        mosib_buffer = 1;
117
        sclkb_buffer = 1;
118
        if(pos == FCBC)
119
        begin
120
          counter = 0;
121
          pos = GC;
122
          state = WAIT_1S;
123
          NEXT_STATE = SEND_GC;
124
        end 
125
        else if(pos == GC)
126
        begin
127
          counter = 0;
128
          state = WAIT_LATTIM;
129
        end
130
      end
131
    end
132
  WAIT_1S:
133
    begin
134
      if(counter >= 9000000)
135
      //if(counter >= 9)
136
      begin
137
        counter = 0;
138
        state = SEND_GC;
139
      end
140
    end
141
  WAIT_LATTIM:
142
    begin
143
      /* Warte 15 ms für den Internal Latch Pulse */
144
      if(counter == 140000)
145
      //if(counter == 14)
146
      begin
147
        counter = 0;
148
        state = WAIT_1S;
149
      end
150
    end
151
  default:
152
    begin
153
      counter = 0;
154
      state = IDLE;
155
    end
156
  endcase
157
  
158
  counter = counter + 1;
159
end
160
161
assign sclka = sclka_buffer;
162
assign mosia = mosia_buffer;
163
assign sclkb = sclkb_buffer;
164
assign mosib = mosib_buffer;
165
166
endmodule

MfG
Michael

von Lattice User (Gast)


Lesenswert?

Michael W. schrieb:
> Lattice User schrieb:
>> Warum ist bei 01 - 04.png der Pegel von SDTB zu niedrig?
>> Ansonsten sieht das ok aus.
> Das weis ich auch nicht. Auf den späteren Bildern sind diese
> verschwunden, dabei habe ich lediglich ein neues Bild erstellt.

Also gibt es irgendwo einen HW Defekt.
Das sollte man als allererstes suchen und beheben.

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.