Forum: Mikrocontroller und Digitale Elektronik 1-Wire an verschieden Ports an ATMega8, Bascom


von La. W. (flyingeagle)


Lesenswert?

Hallo,

nachdem ich bereits Tante Guckel und die Hilfe zu Rate gezogen habe, 
muss ich mich mal wieder an euch wenden.

Ich habe / will mehrere 1-Wire-Busse (da >20 Sensoren) an einen ATMega 8 
hängen.

Mit 'config 1wire = PortB.0' kann man den ja prima initial in Bascom 
definieren.

Schreibe ich nun im Code nextwireport = 2
1
if nextwireport = 1 then
2
  config 1wire = PortB.0
3
else
4
  config 1wire = PortD.3
5
endif
6
7
x(1) = 1wsesarchfirst()
dann fragen alle Routinen weiterhin den Port/Pin B.0 ab.
ändere ich hingegen initial B.0 in D.3 wird auch brav der zweite 
1-wire-Port abgefragt.

Mir ist bekannt das man jeder 1w-Routine den Port und Pin mitgeben kann, 
aber programmatisch wohl leider nur den Pin und nicht auch den Port. In 
der Hilfe wird in einem Beispiel nur über die Pins mit einer Schleife 
gegangen.

Jemand ne Idee wie ich auch per Code den Port beliebig ändern kann? 
Möchte dies später via UART vom PC aus angegeben können.
Ich möchte ungern mir die Routinen etc. selber stricken müssen. Die 
eingebauten sind so hübsch ;-)

Bitte kein Flamewar über C/ASM vs Bascom. Wenn dann bitte dahingehend 
konstruktive Ideen. Von mir aus auch mit Inline-Assembler, wobei ASM 14 
Siegel und C 7 Siegel für mich sind ;-)

grüße
lars

von MWS (Gast)


Lesenswert?

Du kannst 1wire-Befehlen jeweils Port und Pin mitgeben. Lies die Hilfe 
ob Deine Bascom-Version das kann. Ansonsten updaten.

von La. W. (flyingeagle)


Lesenswert?

Das schrieb ich ja bereits, nur lt. Hilfe kann man eben nur den Pin 
ändern.

Aus der Hilfe, (c) by Bascom
1
'you could create a loop with a variable for the bit number !
2
For I = 0 To 3                                             'for pin 0-3
3
 1wreset Pinb , I
4
 1wwrite &H33 , 1 , Pinb , I
5
 Ar(1) = 1wread(8 , Pinb , I)
6
 ...
7
Next
ich will das aber gern so in der art:
1
'you could create a loop with a variable for the bit number !
2
For x = 0 To 3                                             'for pin 0-3
3
  For I = 0 To 3                                             'for pin 0-3
4
   1wreset x , I
5
   1wwrite &H33 , 1 , x , I
6
   Ar(1) = 1wread(8 , x , I)
7
  Next
8
Next
wie gesagt "in der Art", ist nur Pseudocode!

Bascom-Version (Vollversion):
1
Compiler version :2.0.7.0
2
Compiler build   :2.0.7.0.003
3
IDE version      :2.0.7.0
grüße
lars

von La. W. (flyingeagle)


Lesenswert?

So, Update erledigt ... keine Unterschiede in diesem Punkt.
1
Compiler version :2.0.7.2
2
Compiler build   :2.0.7.2.001
3
IDE version      :2.0.7.2

Habe grad in der Übersichtsliste der CONFIG-Befehle gesehen "config 
1-wire Reusable: No", d.h. das dieser Aufruf nicht mehrfach 
vorgenommen werden kann. Ok. Oder auch nicht.

Aber es muss doch möglich sein mehrere 1-Wire an einem µC zu haben bzw. 
das was 'config 1-wire' "manipuliert" in z.b. Inline-ASM einzubauen - 
oder?

Falls ja, bitte bitte bitte, den betreffenden ASM-Code einstellen ;-)

Grüße
Lars

von MWS (Gast)


Lesenswert?

Lars W. schrieb:
> Das schrieb ich ja bereits, nur lt. Hilfe kann man eben nur den Pin
> ändern.

Nö, hast Du nicht geschrieben, dort werden im Beispielcode keine 
Parameter direkt an die Befehle übergeben. Da Config für 1wire nicht 
wiederverwendbar ist, kannst Du mit dem gezeigten Code nicht mal die 
Pinnummer ändern, der Code dort wird also nicht wie vorgesehen 
funktionieren.

Lars W. schrieb:
> Habe grad in der Übersichtsliste der CONFIG-Befehle gesehen "config
> 1-wire Reusable: No", d.h. das dieser Aufruf nicht mehrfach
> vorgenommen werden kann.

Ja, war klar, ich kenn' die Hilfe.
Config ist aber nicht nötig, wenn der Port/Pin im Befehl selbst steht.

In der Hilfe findest Du auch, daß Pinnummer als Variable akzeptiert 
wird, aber der Port direkt angegeben werden muss, das heißt die 8 Pins 
eines Ports sind ohne Verrenkungen ansprechbar. Wenn Dir das nicht 
reicht, musst Du Dir selbst was bauen.

Sollten die 1wire Routinen in der MCS.lib verfügbar sein, dann können 
sie angepasst werden. Du kannst das nach eigener Aussage nicht, warum 
sollte jemand anders Deine Arbeit machen ?

von La. W. (flyingeagle)


Lesenswert?

Lars W. schrieb:
>> Das schrieb ich ja bereits, nur lt. Hilfe kann man eben nur den Pin
>> ändern.
>
MWS schrieb:
> Nö, hast Du nicht geschrieben, ...

Doch :-)

denn Lars W. schrieb:
> Mir ist bekannt das man jeder 1w-Routine den Port und Pin mitgeben kann,
> aber programmatisch wohl leider nur den Pin und nicht auch den Port. In
> der Hilfe wird in einem Beispiel nur über die Pins mit einer Schleife
> gegangen.

MWS schrieb:
> In der Hilfe findest Du auch, daß Pinnummer als Variable akzeptiert
> wird, aber der Port direkt angegeben werden muss, das heißt die 8 Pins
> eines Ports sind ohne Verrenkungen ansprechbar.

Genau das meine ich, Port direkt, Pin per Variable. sorry falls ich mich 
da unverständlich ausgedrückt haben soll(te).

> Ja, war klar, ich kenn' die Hilfe.
> Config ist aber nicht nötig, wenn der Port/Pin im Befehl selbst steht.

siehe oben, man kann nur den PIN in einer Variable definieren mir ging 
und geht es auch um den Port.

> Wenn Dir das nicht
> reicht, musst Du Dir selbst was bauen.

Das ist ja genau der Punkt ;-)

> Du kannst das nach eigener Aussage nicht, warum
> sollte jemand anders Deine Arbeit machen ?

mir geht es nicht um den kompletten Code, sondern mein Gedanke war 
abgeleitet von der Aussage in der Hilfe ...

>> The 1wire commands and function will automatically set the DDR and PORT
>> register bits to the proper state. You do not need to bring the pins
>> into the right state yourself.

... der, das mir evtl. auch jemand sagen kann was genau config 1-wire da 
treibt, damit ich eben den DDR und das Port Register selber anpassen 
kann.

Andernfalls müsste ich ja sowas in der art Programmieren (siehe 1. Post)
1
if nextwireport = 1 then
2
  T(1) = 1wsearchfirst(PortB, 0)
3
elseif nextwireport = 2 then
4
  T(1) = 1wsearchfirst(PortC, 4)
5
else
6
  T(1) = 1wsearchfirst(PortD, 3)
7
endif
da ich einige unterschiedliche Modi habe, die unterschiedliche Werte 
zurückgeben bläht diese Methode den Code gewaltig auf.
Daher meine Idee dem µC vorher zu sagen "alle 1-Wire ab jetzt B.0 oder 
C.4 oder oder oder) danach laufen alle Modi/alle 1-wire-Befehle auf 
diesem Port/Pin ...

> Sollten die 1wire Routinen in der MCS.lib verfügbar sein, dann können
> sie angepasst werden.

Danke auf jeden Fall für den Hinweis mit der Lib, werde mir das auch mal 
ansehen.

Grüße
Lars

von La. W. (flyingeagle)


Lesenswert?

Habe nun mal in der MCS.Lib gestöbert ... es war die Hölle :-)

ich habe da einen abschnitt gefunden, ob das allerdings der gesuchte ist 
für "config 1wire" kann ich nicht beurteilen, da ich mit ASM auf 
kriegsfuß stehe, könnte mir bitte einer der Experten hier was zu sagen?
1
[_1WIRE]
2
   ...
3
; Dallas 1wire routines. On entry X points to data, Z to PIN register, R24 holds bit number
4
; R18 holds number of bytes to transfer
5
   ...
6
Ret
7
8
[_ADJUST_PIN]
9
; internal routine used to create a usable number for a pin number
10
; on entry Pin number(0-7) must be in R24
11
; on exit r24 contains the number for OR operations
12
; on exit r25 contains the number for AND operations
13
   ...
14
Ret
(den vollständigen code will/kann/darf ich nicht posten da MCS was von 
"No SOURCE code from the library may be distributed in any form" 
schreibt)

kann ich überhaupt - und wenn ja wie - diesen code direkt als inline 
verwenden?

wie müsste der angepaßt werden damit er läuft?
würden die anderen 1-wire-funktionen die änderungen dann überhaupt 
akzeptieren?

danke
grüße
lars

von MWS (Gast)


Lesenswert?

Lars W. schrieb:
>   T(1) = 1wsearchfirst(PortB, 0)
> elseif nextwireport = 2 then
>   T(1) = 1wsearchfirst(PortC, 4)
> else
>   T(1) = 1wsearchfirst(PortD, 3)

Musst halt die 1wire-Befehle in eigene Funktionen kapseln, denen Du den 
Port mitgeben kannst.

> da ich einige unterschiedliche Modi habe, die unterschiedliche Werte
> zurückgeben bläht diese Methode den Code gewaltig auf.

Wüsste jetzt nicht, warum der Code "gewaltig" aufgebläht würde, wenn man 
eigene Funktionen aufruft. Das wäre der für Dich beherrschbare und auch 
sinnvolle Weg.

von Georg I. (dschi-ai)


Lesenswert?

Schonmal daran gedacht, dass 1WIRE ein BUS ist, an den mehrere Geräte ( 
bis ca. 100) angeschlossen werden können?

von La. W. (flyingeagle)


Lesenswert?

Georg Ious schrieb:
> Schonmal daran gedacht, dass 1WIRE ein BUS ist, an den mehrere Geräte (
> bis ca. 100) angeschlossen werden können?

ja das habe ich, aber aufgrund unterschiedlicher leitungslängen kommt es 
vor, das einige Sensoren nicht richtig erkannt werden.
ja, mit verschiedenen widerständen habe ich rumgespielt und die AN von 
Maxim auch gelesen ...

von La. W. (flyingeagle)


Lesenswert?

MWS schrieb:
> Wüsste jetzt nicht, warum der Code "gewaltig" aufgebläht würde, wenn man
> eigene Funktionen aufruft. Das wäre der für Dich beherrschbare und auch
> sinnvolle Weg.

beherrschbar ja, nur PRO abfrage ergeben sich ja (ungezählt) 5,6,7,8 
Befehle, welche ich in eigene funktionen Packen müsste, ok, geht, 
"schöner" wäre es aber eben dies nicht machen zu müssen sondern nur den 
"Ausgangsport" aller 1-wire-befehle zu ändern. Das wäre die bequemste 
art und weise.

hatte mal irgendwo im internet was gesehen wo einer an einer steuerung 
mehrere ports/pins für mehrere busse hatte. leider war da imho kein code 
dabei und soweit ich mich erinnere wäre der auch in C gewesen.

allein aus organisatorischen gründen kann es doch auch manchmal gut sein 
die sensoren oder busteilnehmer zu trennen, kann mir also prinzipiell 
nicht vorstellen, das man nachträglich während des betriebes des uC dies 
nicht mehr ändern können sollte.

Falls ich irgendwoher ne lösung finde, werde ich sie euch aber auch 
mitteilen.

So lange, danke und grüße
lars

von allu (Gast)


Lesenswert?

Zur Überwachung meiner Heizung verwende ich mehrere 1.Wire-Buse mit 
jeweils einem Sensor. Nachfolgend die Abschntte zur Busbedienung (ohne 
Ablauf und Zeitsteuerung):

---- 1.Wire-Buse anlegen

Config 1wire = Portb.0             '5 mal 1Wire-Bus konfigurieren
Config 1wire = Portb.1
Config 1wire = Portb.2
Config 1wire = Portb.3
Config 1wire = Portb.4



' ------------- Startbefehl für Temperaturmessung ----------------

Erste_messung_starten_b:
      Bus = 255                           ' -1 in Bytedarstellung
      Index = 0
Naechste_messung_starten_b:
      Incr Index
      Incr Bus
      1wreset Pinb , Bus                  ' mindestens 1 Sensor am Bus
      If Err = 0 Then
               1wwrite Skip_rom , 1 , Pinb , Bus ' und Messung starten
               1wwrite Convertt , 1 , Pinb , Bus
     End If

Return

-------

Der Temperaturwert wird 2 Sekunden nach dem Startbefehl geholt,
dann kommt der nächste 1.Wire-Bus dran.

-------

Aktuelle_buchse_abfragen:

   1wreset Pinb , Bus                         ' Sensor DS18S20 abfragen
   If Err = 0 Then
         1wwrite Skip_rom , 1 , Pinb , Bus            ' Command Skip ROM
         1wwrite Read_ram , 1 , Pinb , Bus            ' Sensor abfragen
         Array_1wire(2) = 1wread(9 , Pinb , Bus)

         If Array_1wire(10) = Crc8(array_1wire(2) , 8) Then '    ok?
               Gosub Temperatur_a_eintragen      ' CRC ist ok !
         End If
   Else
         Gosub Keine_sensoren_gefunden
   End If

   Gosub Index_eintragen  '.. und LCD-String berechnen und anzeigen
Return

Gruß  allu

von La. W. (flyingeagle)


Lesenswert?

öh, ich bin verwirrt ...

also kann man doch "config 1-wire" mehrfach verwenden, oder bezieht sich 
das "reusable no" in der hilfe auf was anderes?

auf jeden fall, danke allu

was aber auch in deinem programm nicht geht ist den PORT zu wecheln, nur 
der PIN geht ... aber wenigstens schon mal was :-))

DANKE
grüße
lars

von MWS (Gast)


Lesenswert?

allu schrieb:
> Config 1wire = Portb.0             '5 mal 1Wire-Bus konfigurieren
> Config 1wire = Portb.1
> Config 1wire = Portb.2
> Config 1wire = Portb.3
> Config 1wire = Portb.4

Dieser Code ist komplett sinnfrei, der Rest funktioniert nur weil den 
1wire-Befehlen Port und Pin direkt mitgegeben wird:

>          Array_1wire(2) = 1wread(9 , Pinb , Bus)

von Karlchen (Gast)


Lesenswert?

Lars W. schrieb:
> was aber auch in deinem programm nicht geht ist den PORT zu wecheln, nur
> der PIN geht ... aber wenigstens schon mal was :-))


Doch, mein 6ter 1.Wire-Bus liegt auf Port d.3, habe ich aber wegen der 
Übersichtlichkeit weggelassen (Solar-Speicher und Warmwasser-Speicher, 
Heizung Vor- und Rücklauf, Solar Vor- und Rücklauf und Abgastemperatur 
mit einem PT1000 - aber das ist eine andere Geschichte).

MWS schrieb:
> Dieser Code ist komplett sinnfrei, der Rest funktioniert nur weil den
> 1wire-Befehlen Port und Pin direkt mitgegeben wird:

Mag sein, läuft aber schon seit Wochen ohne Probleme durch.

Gruß   allu

von allu (Gast)


Lesenswert?

War am Leih-Notebook unterwegs, allu ist richtig, nicht Karlchen.

von MWS (Gast)


Lesenswert?

Karlchen schrieb:
> Mag sein, läuft aber schon seit Wochen ohne Probleme durch.

Solange die eigentliche Funktion nicht behindert wird, lässt sich das 
Hinzufügen von sinnlosem Code fast beliebig fortsetzen :D

von allu (Gast)


Lesenswert?

MWS schrieb:

> Solange die eigentliche Funktion nicht behindert wird, lässt sich das
> Hinzufügen von sinnlosem Code fast beliebig fortsetzen :D

Darf ich mal raten: Du bist Informatiker ?

von MWS (Gast)


Lesenswert?

allu schrieb:
> Darf ich mal raten: Du bist Informatiker ?

Nein, das ist nicht mein Job, aber ich weis was in Bascom geht und was 
nicht.

von allu (Gast)


Lesenswert?

MWS schrieb:
> Nein, das ist nicht mein Job, aber ich weis was in Bascom geht und was
> nicht.

Frage: Kann ich

Config 1wire = Portb.4
Config 1wire = Portd.3
usw.

einfach weglassen, weil dadurch überhauot kein BASCOM-Code generiert 
wird ?

Danke, gruss    allu

von MWS (Gast)


Lesenswert?

allu schrieb:
> Frage: Kann ich
>
> Config 1wire = Portb.4
> Config 1wire = Portd.3
> usw.
>
> einfach weglassen, weil dadurch überhauot kein BASCOM-Code generiert
> wird ?

Durch diese Configs wird grundsätzlich noch kein Code erzeugt. Du sagst 
dem Compiler nur, daß im Falle er einen 1wire-Befehl ohne Port/Pinangabe 
findet, dann eben diese Config-Einstellung verwendet.

Solltest Du also noch einen 1wire-Befehl ohne Port/Pin im Code haben, 
dann achte darauf welches Config dafür verwendet wird.

Hat jeder 1wire-Befehl seine eigene Port/Pin-Angabe, dann kannst Du Dir 
die Configs sparen.

von La. W. (flyingeagle)


Lesenswert?

hmm, habe das mal testweise umgebaut auf Port,Pin angabe ohne das Config 
vorher zu verwenden ...

kam nur mist bei raus ... er landet in der do loop in einer 
endlosschleife, scheinbar wird ERR nicht gesetzt. die Hex werte für den 
sensor sind 00, nur die letzten beiden ziffern ändern sich.

bei 1wverify kann man imho und laut hilfe keinen port/pin angeben ... 
wie soll das dann gehen? oder geht nur eh immer 1wverify(1)?

Weiterhin geht 1wirecount nicht, hier bleibt der uC hängen. und geht 
erst ewig später weiter, wenn überhaupt. und wenn er es doch macht oder 
wenn ich es auskommentiere, dann gibts o.g. "00"en

und ja bzw. nein D.5 ist nicht anderweitig konfiguriert ;-)

codeausschnitt:
1
...
2
 1wactivebus = 5
3
 Reset Err
4
 1wreset Portd , 1wactivebus
5
 1wwrite &HCC , 1 , Portd , 1wactivebus          
6
 1wwrite &H44 , 1 , Portd , 1wactivebus          
7
 Waitms 750
8
9
 Tmp1int = 1wirecount(portd , 1wactivebus)    ' <-- hier bleibt er hängen
10
11
 If Tmp1int > 0 Then
12
   Reset Tmp2int
13
   Reset Tempsensor(1)
14
   Reset Tempsensordata(1)
15
16
   Tempsensor(1) = 1wsearchfirst(portd , 1wactivebus)
17
   If Err = 0 Then
18
    Do
19
      Reset Err
20
      1wverify Tempsensor(1)        
21
      ' ^^-- hier schmeist der compiler einen fehler
22
      1wwrite &HBE , 1 , Portd , 1wactivebus
23
      Tempsensordata(1) = 1wread(9 , Portd , 1wactivebus)        
24
25
      Print Array2hexstring(tempsensor(1) ) ;
26
27
      For I = 1 To 9
28
      Print Hex(tempsensordata(i));
29
      Next
30
31
      Tempsensor(1) = 1wsearchnext(portd , 1wactivebus)
32
    Loop Until Err = 1            
33
    ' ^^-- endlosschleife, obwohl nicht gewollt :-)
34
   Else
35
    Print "ERROR"
36
   End If
37
   1wreset Portd , 1wactivebus
38
   1wwrite &HCC , 1 , Portd , 1wactivebus 
39
   1wwrite &H44 , 1 , Portd , 1wactivebus
40
 End If
41
...

wo könnte mein fehler liegen?

grüße
lars

von allu (Gast)


Lesenswert?

MWS schrieb:
> Hat jeder 1wire-Befehl seine eigene Port/Pin-Angabe, dann kannst Du Dir
> die Configs sparen.

Aha, danke, habe ich immer mit Port/Pin-Angabe gemacht, deshalb läuft es 
wohl problemlos.

Gruss   allu

von MWS (Gast)


Lesenswert?

allu schrieb:
> Aha, danke, habe ich immer mit Port/Pin-Angabe gemacht, deshalb läuft es
> wohl problemlos.

Zitat aus der Bascom-Hilfe:

> You can configure only one pin for the 1WIRE statements because the idea is that
> you can attach multiple 1WIRE devices to the 1WIRE bus.

> You can however use multiple pins and thus multiple busses. All 1wire commands
> and functions need the port and pin in that case.

von MWS (Gast)


Lesenswert?

Lars W. schrieb:
>  1wwrite &HCC , 1 , Portd , 1wactivebus
>  1wwrite &H44 , 1 , Portd , 1wactivebus
>  Tmp1int = 1wirecount(portd , 1wactivebus)    ' <-- hier bleibt er hängen

Vergleich' doch die verwendete Syntax mit der Hilfe, oder auch mit 
allu's Code.

von La. W. (flyingeagle)


Lesenswert?

Ok, Ok, Ok. Habe nur PORT gelesen und nicht das die Funktionen da PINx 
haben wollen, steht da auch verwirrend ;-)
1
Syntax
2
  1WWRITE var1 , bytes , port , pin
3
4
Dann später:
5
6
port
7
 The name of the PORT PINx register like PINB or PIND.
8
pin
9
 The pin number in the range from 0-7. May be a numeric constant or variable.
Trotzdem Danke!

Bleibt nur die Frage noch übrig bei 1wverify ...

Grüße
lars

von allu (Gast)


Lesenswert?

Lars W. schrieb:
> Bleibt nur die Frage noch übrig bei 1wverify ...

In einem anderen Fall sind an einem Bus 2 Sensoren angeschlossen. Die 
Sensoren werden über ihre ID (Dsid1()und Dsid2() ausgewählt.
Die IDs werden beim Programmstart einmalig aus den Sensoren ausgelesen.

Const Read_ram = &HBE
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Const 1w_bus_1 = 1 ' Port-Pin ist PC.1
-----------------
-----------------
' 1.Temperatursensor DS18S20 abfragen

            1wreset Pinc , 1w_bus_1
            1wverify Dsid1(1) , Pinc , 1w_bus_1
            If Err = 0 Then
                1wwrite Read_ram , 1 , Pinc , 1w_bus_1
                Array_1wire(2) = 1wread(9 , Pinc , 1w_bus_1)
-----------------
    Sensorwerte im Array_1wire()

Gruss   allu

von MWS (Gast)


Lesenswert?

Lars W. schrieb:
> Ok, Ok, Ok. Habe nur PORT gelesen und nicht das die Funktionen da PINx
> haben wollen, steht da auch verwirrend ;-)

Hätte Mark schreiben sollen "1WWRITE var1 , bytes , pin , pin" ?

Lars W. schrieb:
> Bleibt nur die Frage noch übrig bei 1wverify ...

1wverify Arg(1), PinX, PX hat's nur nicht in die Hilfe geschafft, wird 
aber richtig compiliert.

von La. W. (flyingeagle)


Lesenswert?

allu schrieb:
> 1wverify Dsid1(1) , Pinc , 1w_bus_1

lt. Hilfe gibt es dieses Konstrukt nicht ...

MWS schrieb:
> 1wverify Arg(1), PinX, PX hat's nur nicht in die Hilfe geschafft, wird
> aber richtig compiliert.

... wenns denn funktioniert solls mir recht sein. Werde es testen.

MWS schrieb:
> Hätte Mark schreiben sollen "1WWRITE var1 , bytes , pin , pin" ?

naja, das nicht aber vielleicht so

1wwrite var1 , bytes , port-pin, pin-number

und bei den mit Portangabe anstelle Pin vielleicht

1wwrite var1 , bytes , port, pin-number

dann wäre es auf jeden fall übersichtlicher, nun denn, es ist müssig 
sich darüber aufzuregen, is halt nicht so.
Es geht.
ich weiß das man auch mal ein paar zeilen tiefer gucken und noch genauer 
lesen muss in zukunft und fertig.

danke für eure hilfe bis zum nächsten mal :-)
lars

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.