Forum: Mikrocontroller und Digitale Elektronik Dauerhafte Pinüberwachung in Assembler


von Socke (Gast)


Lesenswert?

Hallo Leute,

ich habe vor in einer LED Matrix über einen Taster mehrere Programme zu 
steuern, sodass bei nedem Taster betätigen das nächte Programm 
aufgerufen wird. Ich arbeite mit einem µC der 8051-Familie.

Jetzt habe ich folgendes Problem, wenn der Controller momentan dabei 
ist, ein "Bild" in der Matrix dazustellen, kann er ja nicht gleichzeitig 
die Eingabe des Tasters kontrollieren (oder doch)?
Jetzt wollte ich Fragen, wie das am besten realisieren kann.
Hat jemand ein paar gute Ideen?

Hier der code: Währen er LED1 Darstellt, soll die Taster Eingabe 
kontrolliert werden, sodass man damit auch mitten im PRogramm von LED1, 
das Programm LED2(noch nicht vorhanden)
ansteuern kann.
1
Start:
2
      clr A
3
      mov P0,#00h
4
      mov P1,#00h            ;clear all
5
      mov P2,#00h
6
      mov P3,#00h
7
      
8
Tast1:  mov P0,#00h
9
      mov P1,#00h
10
      mov P2,#40h
11
      mov A,P2
12
      JNZ Tast1
13
      
14
LED1:    mov P0,#18h
15
      mov P1,#18h
16
      call Warte
17
      mov P0,#3Ch
18
      mov P1,#3Ch
19
      call Warte
20
      mov P0,#7Eh
21
      mov P1,#7Eh
22
      call Warte
23
      mov P0,#0FFh
24
      mov P1,#0FFh
25
      mov P0,#0FFh
26
      mov P1,#0FFh
27
      call Warte
28
      mov P0,#7Eh
29
      mov P1,#7Eh
30
      call Warte
31
      mov P0,#3Ch
32
      mov P1,#3Ch
33
      call Warte
34
      mov P0,#18h
35
      mov P1,#18h
36
      call Warte
37
      jmp LED1
38
        
39
;---------------------------------------------------        
40
         
41
Warte:
42
    mov R2,#2d
43
Warte1:
44
    mov R1,#200d
45
Warte2:
46
    mov R0,#200d
47
Warte3:
48
    DJNZ R0,Warte3
49
    DJNZ R1,Warte2
50
    DJNZ R2,Warte1
51
    ret

Lg Socke

von Timerinterrupt (Gast)


Lesenswert?

Prüfe nach jedem Befehl in LED1 den Eingang andem die Taste hängt und 
Spring, in LED2 falls die Taste gedrückt wird ;-)

von Socke (Gast)


Lesenswert?

Hey,

Danke für die Antwort,

aber genau auf die Antwort habe ich nicht gehofft. Habe es leider 
vergessen zu schreiben. So geht es ist mir klar, aber es ist ja keine 
schöne Lösung und ich hoffe man kann es auhc irgendwie anders machen.

Lg Jonas

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


Lesenswert?

Socke schrieb:
> Jetzt habe ich folgendes Problem, wenn der Controller momentan dabei
> ist, ein "Bild" in der Matrix dazustellen, kann er ja nicht gleichzeitig
> die Eingabe des Tasters kontrollieren (oder doch)?
Klar: das was du in "Warte" machst, ist vergeudete Rechenzeit. Mach doch 
statt zu warten eine Tastenabfrage. Dann kannst du während eines 
Wartezyklus die Taste zigtausendmal abfragen. Und dann ein Flag setzen 
und sofort zurückspringen in das "Hauptprogramm", und dort dann auf 
dieses Flag reagieren...

Sinnvollerweise machst du dir aber mal besser Gedanken zur Programmieren 
in Schleifen und Zustandsautomaten. Das hört sich kompliziert an, ist 
aber der einzig sinnvolle Weg, kompliziertere Programme aufzusetzen. In 
deinem Fall ginge das etwa so:
Eine Hauptschleife wird mit maximaler Geschwindigkeit durchlaufen und 
fragt die Taste ab. Wenn ein bestoimmte Zeit erreicht ist, wird das 
nächste Bitmuster dargestellt und weiter gehts in der Hauptschleife:
1
mainloop:
2
    call Tastenabfrage
3
    call MusterDarstellen
4
    goto mainloop
5
6
Tasterabfrage:
7
    wenn taster gedrückt dann inc lauflicht
8
    ret
9
10
MusterDarstellen:
11
    inc Zähler
12
    wenn Zähler<5000 dann ret
13
    Zähler=0
14
    bitmuster = nächstes bitmuster
15
    ret

: Bearbeitet durch Moderator
von Stefan W. (xerox)


Lesenswert?

Da Dir etwas Grundlagenwissen fehlt schau Dir mal das Thema Timer an. 
Damit kannst Du soetwas unproblematisch lösen und hast zusätzlich nicht 
unnötig Zeit in Deinen Delays verschwendet.

PS: Im Timer nur den Tastereingang abfragen und wenn gedrückt wurde 
einfach ein Flag setzten welches Du in Deiner Main verarbeitest. Siehe 
hierzu auch Tastenentprellung mit Timer.

http://www.mikrocontroller.net/articles/8051_Timer_0/1

: Bearbeitet durch User
von Michael_ (Gast)


Lesenswert?

Im 8051 weiß ich nicht, ob ein Interrupt bei Flankenwechsel ausgelöst 
werden kann. Bei den AVR geht das.
Der Rest ist einfach.

von Socke (Gast)


Lesenswert?

Hallo,

Danke für die ganzen Antworten, ich werde mich am Wochende dann nochmal 
dran setzten.

Ich sollte mich glaube ich sowieso mal etwas mehr mit den ganzen Flags 
auseinander setzen, so kann man sicherlich einiges Einfacher machen auf 
dauer.

Mit dem Timer habe ich mich bis jetzt auch noch nicht beschäftigt, werde 
es zu diesem Thema dann mal machen.

Im Prinzip wollte ich nur erstmal wissen, ob es überhaupt so möglich 
ist, wie ich mir das gedacht habe.

Das Programm war auch erstmal nur ein Beispiel, aber ihr habt mir schon 
sehr geholfen. Mit den Stichworten werde ich wohl was hinbekommen, ein 
bisschen möchte man ja auch selber machen, sonst fehlt ja der 
Lerneffekt.

Vielen Dank nochmal an alle.


Lg Socke

von Stefan W. (xerox)


Lesenswert?

Du kannst das auch ohne Timer machen, allerdings musst Du dann Deine 
Warteschleifen anders gestallten. z.B. könntest Du bei jedem Main 
Durchlauf eine Variable um 1 erhöhen und z.B. die entsprechende LED bei 
Zählerstand X ein oder ausschalten. Allerdings hast Du wenn Du das so 
machen würdest keine feste Zeit da die Mainschleife ja dynamisch Zeit 
braucht. Wenn es allerdings Zeitunkritisch ist, Sprich egal ist ob es 
nun 400ms oder 500ms sind dann könnte man das über den Zähler machen :) 
Aber Grundsätzlich sollte man an so "unsinnigen" Code garnicht erst 
denken da er schlicht weg mehr als Schlecht wäre.

mfg xerox

von Socke (Gast)


Lesenswert?

Stefan Wagner schrieb:
> Da Dir etwas Grundlagenwissen fehlt schau Dir mal das Thema Timer
> an.
> Damit kannst Du soetwas unproblematisch lösen und hast zusätzlich nicht
> unnötig Zeit in Deinen Delays verschwendet.
>
> PS: Im Timer nur den Tastereingang abfragen und wenn gedrückt wurde
> einfach ein Flag setzten welches Du in Deiner Main verarbeitest. Siehe
> hierzu auch Tastenentprellung mit Timer.
>
> http://www.mikrocontroller.net/articles/8051_Timer_0/1

Leider sind in dem Link die meisten Beispiele nur in C dargestellt, da 
ich aber assembler als anfänger sehr sinnvoll empfinde, wird es die 
Sache nicht erleichtern, dennoch werde ich es mal versuchen, bei 
konkreten Fragen melde ich mich einfach mal.

Vielen Dank

Lg Socke

von Ralph (Gast)


Lesenswert?

Socke schrieb:
> da
> ich aber assembler als anfänger sehr sinnvoll empfinde

Da bin ich und viele andere aber anderer Meinung.

Das führt aber dann wieder zur Diskussion über die "bessere" 
Programmiersprache, also lassen wir das.


Die Lösung für dein Problem nennt sich Interrupt.
Also deine externe Beschaltung so aufbauen das jeder Taster einen 
Interrupt auslösen kann. Entweder jeder einen eigene ( falls du genug 
Interrupteingänge hast) oder die über eine "wired OR" zusammengefasst 
auf einen Interrupt Pin.
Damit kannst du Interrupt jeweils deinen Tastendruck erkennnen.

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


Lesenswert?

Ralph schrieb:
> Die Lösung für dein Problem nennt sich Interrupt.
> Also deine externe Beschaltung so aufbauen das jeder Taster einen
> Interrupt auslösen kann.
Das ist Murksprogrammierung. Einen Interrupt für einen stinknormalen 
Taster brauche ich nur, wenn ich den Controller schlafen lege. In einem 
normalen Programm sollte man Interrupts für den normalen Programmablauf 
vermeiden wie der Teufel das Weihwasser. Denn ein Interrupt ist genau 
das, was der Name vermittelt: eine Unterbrechung (also auch Störung) des 
normalen Programmablaufs. Mit nur einer halben Minute Nachdenken fallen 
mir da gleich ein paar potentielle Probleme ein.

Für alle normalen Fälle wurde das Stichwort schon genannt: 
Zustandsautomat, Finite State Machine FSM, Schrittkette usw.
Nur so lassen sich wirklich überschaubare, wartbare und erweiterbare 
Programme abbilden. Denn dann ist jedesmal der selbe Ablauf:
1. Ports und Daten einlesen
2. Neue Zustände und Ergebnisse berechnen
3. Ausgänge schreiben
4. weiter bei 1.
Und das Ganze so oft wie möglich pro Sekunde.
Das ist das SPS-Schema, das unbestritten weltweit problemlos 
funktioniert. Und die einzig interessante Zahl bei der SPS ist die 
Zykluszeit.

: Bearbeitet durch Moderator
von Ralph (Gast)


Lesenswert?

Lothar Miller schrieb:
> 1. Ports und Daten einlesen
> 2. Neue Zustände und Ergebnisse berechnen
> 3. Ausgänge schreiben
> 4. weiter bei 1.
> Und das Ganze so oft wie möglich pro Sekunde.

nunja, es ist eben nicht alles eine SPS.

Eine SPS kommt in Probleme mit Events die innerhalb der Zykluszeit 
stattfinden.
Oder im besonderen wenn innerhalb der Zykluszeit ein Event mehrfach 
auftritt.

Sowas lässt sich nur mit zusätzlichen Hardwarepuffern abfangen, oder 
halt über Eventtrigger ( Interrupt)

Das Grundschema 1 bis 4 passt schon, dazu ist es zu generisch.

Aber gleich alle Interrupts zu verteufeln ist auch nicht der Sinnvolle 
weg.

Wenn das Hauptprogramm durch Interrupts in Probleme kommt, ist da in der 
grundsätzlichen Auslegung aber etwas sehr schief gegangen.

Ist klar wenn die Zykluszeit zb 1msec ist und die Abarbeitung bereits 
998 µsec benötigt ist da keine Luft für Interrupt. Sollte mir allerdings 
mal jemand ein solches System mit dieser Auslegung verkaufen wollen darf 
er gleich wieder nach Hause gehen, mit seinem System.



Ich würde für mich selbst das ganze über eine Timebase Interrupt lösen 
in dem alle Eingänge gelesen und gepuffert werden.

Aber das möchte ich einem Anfänger in Assembler nun nicht wirklich 
raten.
Er wird mit Assembler an sich schon genug beschäftigt sein um sich dazu 
auch noch über besonders elegante und wiederverwendbare Lösungen 
Gedanken zu machen. Das kommt später.......

von Socke (Gast)


Lesenswert?

Hallo,
Ich werde mich da wohl einfach mal durchlesen müssen.

Findet ihr C als anfänger sinnvoller?

Danke  nochmal
Lg jonas

von Ralph (Gast)


Lesenswert?

Socke schrieb:
> Findet ihr C als anfänger sinnvoller?

Ja !!

Um die ganzen Details die einem der Compiler abnimmt kann man sich 
später kümmern. Daraus wird dann Assembler.

von Socke (Gast)


Lesenswert?

Hallo

ich habe nochmal eine Frage, und zwar habe ich jetzt scho etwas mit den 
Interupts herumgespielt.

Allerdings wollte ich jetzt mit dem gleichen Interrupt zwei Programme 
nacheinander Starten. Sprich wird der Taster einmal gedrückt, startet 
das erste rogramm, drückt man den Taster erneunt, startet das zweite 
Programm.

Jedoch habe ich das Problem, dass das Programm direkt startet bzw, das 
er direkt ohne betätigen des tasters den Interupt aufruft. Man kann ihn 
jedoch nicht weiterschalten.

Hier mein code, hoffe ihr versteht mich:
1
  jmp main
2
3
org 03h
4
        CJNE R0,#01h,LED01
5
        CJNE R1,#01h,LED2
6
      reti
7
8
main:      
9
      setb EA
10
      setb EX0
11
      setb IT0
12
         
13
         
14
15
16
17
Start:
18
      clr A
19
      mov P0,#00h
20
      mov P1,#00h            
21
      mov P2,#00h
22
      mov P3,#00h
23
                        mov R0,#00h
24
                        mov R1,#00h
25
26
      jmp Start
27
      
28
29
LED01:                  inc R0      
30
31
LED1:            mov P0,#18h
32
      mov P1,#18h
33
      call Warte
34
      mov P0,#3Ch
35
      mov P1,#3Ch
36
      call Warte
37
      mov P0,#7Eh
38
      mov P1,#7Eh
39
      call Warte
40
      mov P0,#0FFh
41
      mov P1,#0FFh
42
      mov P0,#0FFh
43
      mov P1,#0FFh
44
      call Warte
45
      mov P0,#7Eh
46
      mov P1,#7Eh
47
      call Warte
48
      mov P0,#3Ch
49
      mov P1,#3Ch
50
      call Warte
51
      mov P0,#18h
52
      mov P1,#18h
53
      call Warte
54
      jmp LED1
55
        
56
LED2:
57
      mov P0,#18h
58
      mov P1,#18h
59
      jmp LED2        
60
        
61
         
62
Warte:
63
    mov R2,#2d
64
Warte1:
65
    mov R1,#200d
66
Warte2:
67
    mov R0,#200d
68
Warte3:
69
    DJNZ R0,Warte3
70
    DJNZ R1,Warte2
71
    DJNZ R2,Warte1
72
    ret


Lg Socke

von Dietrich L. (dietrichl)


Lesenswert?

Socke schrieb:
> Man kann ihn jedoch nicht weiterschalten.

Das kann ja auch nicht gehen, denn Du verlässt die Interrupt-Routine ja 
nicht und bleibst ewig in der Endlosschleife LED1 oder LED2.
Solange "reti" nicht ausgeführt wird, ist der Interrupt gesperrt und die 
Interuptroutine mit der Tastenabfrage wird nicht mehr aufgerufen.

Ein Interrupt-Enable alleine hilft da aber auch nicht, weil sonst der 
Stack überläuft (das "ret" von "reti" fehlt dann).

Gruß Dietrich

von Socke (Gast)


Lesenswert?

Du hadt recht st7mmt, dann klapptdas ja gar nicht so wie ich mir das 
gedacht habe.
Aber wieso startet der Interrupt dann direkt, ohne tastereingabe?
Lg Socke

von Jobst M. (jobstens-de)


Lesenswert?

Socke schrieb:
> Findet ihr C als anfänger sinnvoller?

Für den 8051 auf gar keinen Fall!
Den kann man so wundervoll in ASM programmieren. Er wurde sogar dafür 
entwickelt.

Versuch mal den Timerinterrupt zu verstehen:

1 Timer initialisieren
2 Interrupts einschalten
3 Aufgabe A im Hauptprogramm erledigen
4 Aufgabe B im Timerinterrupt erledigen

Wenn Du Beispiele benötigst, sag bescheid.


Gruß

Jobst

von Socke (Gast)


Lesenswert?

Hi,

ja danke, aber ich würde ja gerne 10 Programme mit einem Taster 
nacheinander aufrufen | also bei jedem Taster klick soll das nächste 
kommen.
Und das dann egal, wann der Taster betätigt wird deswegen ja mit den 
Interrupt.

Lg Socke

von Ralph (Gast)


Lesenswert?

Socke schrieb:
> Hi,
>
> ja danke, aber ich würde ja gerne 10 Programme mit einem Taster
> nacheinander aufrufen | also bei jedem Taster klick soll das nächste
> kommen.
> Und das dann egal, wann der Taster betätigt wird deswegen ja mit den
> Interrupt.
>
> Lg Socke

Das geht in Richtung Multitasking mit dem Taster als Trigger für den 
Taskwechsel.

Dafür gibt es µC die aufgrund ihrer Architektur besser geeignet sind als 
die kleinen 8Bitter.

Oder ist mit "Programme" nur ein unterschiedliches Blinkverhalten der 
LED's gemeint ?

In dem Fall würde ich das anderes aufsetzen.
* eine 2 Dimensionale Tabelle aufsetzen
* pro Spalte ein Blinkprogramm
* pro Zeile eine LED Anweisung

Mit dem Programmablauf zeilenweise durch die Spalte laufen.

Bei Tastendruck die Spalte wechseln.



Aber das ganze ins Assembler? naja es geht aber muss man sich das 
wirklich antun ?

Wenn man Autofahren lernt geht es auch nur um die Bedienung der Pedale, 
Schalter, Lenkrad und so weiter.
Niemand wird in der Fahrschule lernen wie die Einspritzanlage 
eingestellt werden muss damit man Losfahren kann.

von Socke (Gast)


Lesenswert?

Hey Ralph
gute Antwort, danke.
Wieder ein neues Thema jetzt muss ich mich wohl auch noch mit Tabellen 
auseinander setzen

zur Zeit habe ich nur einen AT 89S8253 zur Verfügung .
Eventuell Werde ich mich auch mal in C einlesen. Man kann doch auch in C 
fertige Assembler codes laden Oder?

Vielleicht bringt der Weihnachtsmann auch einen Arduino ;-)

Danke nochmal

Lg Socke

von Michael_ (Gast)


Lesenswert?

Was willst du bei dem Ding mit C?
Dein Interrupt macht nichts weiter, als in einem Register einen Wert zu 
hinterlegen.
Und den wertet dein Hauptprogramm aus.
Wenn du anfängst, dann nimm nicht so einen Oldtimer. Geh gleich auf AVR.
Ich glaub, für deinen AT 89S8253 gibt es einen Pin-compatiblen Ersatz 
von den AVR.

von Socke (Gast)


Lesenswert?

Michael_ schrieb:
> Wenn du anfängst, dann nimm nicht so einen Oldtimer.

Die Schule bestimmt leider, was wir verwenden.

Also unten steht der neue code. Ich setzte jetzt jedes mal wenn bei 
Tasterbetätigung mit dem Interrupt ein Register +1 und vergleiche es 
dann in jedem Programm, jedoch funltioniert aus irgendeinem Grund auch 
das nicht so ganz korrekt. Liegt es vielleicht daran, dass man den 
Taster zu lange betätigt und er dann dierekt das Register +3 nimmt?

'Vielleicht findet ihr ja einen Fehler.
Werde mich in naher zukunft jedoch Trotzdem noch mit dem Timer Interrupt 
und Tabellen auseinander setzten :)

Danke nochmal an Alle bis jetzt.
1
Start0:       
2
       sjmp main
3
       
4
       
5
org 03h
6
      inc R4
7
        reti
8
9
main:      
10
      setb EA
11
      setb EX0
12
      setb IT0
13
      mov R4,#00h
14
      jmp Start
15
16
Start:
17
      clr A
18
      mov P0,#00h
19
      mov P1,#00h            ;clear all
20
      mov P2,#00h
21
      mov P3,#00h
22
      CJNE R4,#2d,Start
23
      
24
      
25
LED1:    mov P0,#18h
26
      mov P1,#18h
27
      call Warte
28
      mov P0,#3Ch
29
      mov P1,#3Ch
30
      call Warte
31
      mov P0,#7Eh
32
      mov P1,#7Eh
33
      call Warte
34
      mov P0,#0FFh
35
      mov P1,#0FFh
36
      mov P0,#0FFh
37
      mov P1,#0FFh
38
      call Warte
39
      mov P0,#7Eh
40
      mov P1,#7Eh
41
      call Warte
42
      mov P0,#3Ch
43
      mov P1,#3Ch
44
      call Warte
45
      mov P0,#18h
46
      mov P1,#18h
47
      call Warte
48
      CJNE R4,#3d,LED1
49
      
50
        
51
LED2:
52
      mov P0,#18h
53
      mov P1,#18h
54
      CJNE R4,#4d,LED2        
55
         jmp Start
56
         
57
Warte:
58
    mov R2,#2d
59
Warte1:
60
    mov R1,#200d
61
Warte2:
62
    mov R0,#200d
63
Warte3:
64
    DJNZ R0,Warte3
65
    DJNZ R1,Warte2
66
    DJNZ R2,Warte1
67
    ret

Lg Socke

von Ralph (Gast)


Lesenswert?

Socke schrieb:
> Liegt es vielleicht daran, dass man den
> Taster zu lange betätigt und er dann dierekt das Register +3 nimmt?

Das wird wohl eher das Tastenprellen sein.

Hier muss also noch eine Entprellen des Tasters dazukommen.

Das kann per hardware gemacht werden. ZB ein Tiefpass mit Schmitttrigger 
zwischen Taster und µC Eingang.
Oder es kann per software gemacht werden.
Dazu gibt es aber auch schon genug Beiträge hier im Forum zum Nachlesen.

von Socke (Gast)


Lesenswert?

Das Problem tritt aber auch auf, wenn ich nur kurz die beiden Drähte 
ajeinanderhalte, ohne Taster.

Also les ich mir das mit den Tasterprellen mal durch und sonst muss ich 
das noch irgendwie auch anders lösen.
Danke
Lg Socke

von Jobst M. (jobstens-de)


Lesenswert?

Socke schrieb:
> Das Problem tritt aber auch auf, wenn ich nur kurz die beiden Drähte
> ajeinanderhalte, ohne Taster.

Das ist ja noch schlechter als ein Taster ...
Das prellt erst recht ... so richtig :-D


Gruß

Jobst

von Socke (Gast)


Lesenswert?

So ich habe mir jetzt  mal das entprellen von peter danegger angeschaut 
und versucht zu verstehen und umgeschrieben auf die passenden befehle 
für meinen uC, jedoch nicht läuft da noch so einiges nicht rund. Er sagt 
doch er hat es für 8051 geschrieben, aber wieso kann mein controller mit 
den befehelen or and und eor oder com so gar nichts anfangen?
Vielleicht erschließt sich mir auch morgen der sinn des codes komplett 
und ich kann ihn anders schreiben, so easy ist der ja gar nicht.

Hat jemand noch andere möglichkeiten, für die entprellung in assembler 
bei den 8051ern?

Schönen abend noch
Lg Socke

von Michael_ (Gast)


Lesenswert?

Socke schrieb:
> Die Schule bestimmt leider, was wir verwenden.
Dann lies dir die bereitgestellten Unterlagen durch oder du hast 
geschlafen.
Socke schrieb:
> zur Zeit habe ich nur einen AT 89S8253 zur Verfügung . Ich glaub, dafür gibt es 
einen pinkompatiblen Ersatz als AVR.
Wenn du privat Interesse hast, dann mach damit weiter.

von Jobst M. (jobstens-de)


Lesenswert?

Naja, der 8051 wird häufig schlechter gemacht, als er ist. Sollte es 
keinen triftigen Grund geben, die Architektur zu wechseln, kann man gut 
dabei bleiben, immerhin ist er Industriestandard. Und es gibt sehr 
viele, sehr unterschiedliche Derivate - vor allem von verschiedenen 
Herstellern. Und es wird ihn in 30 Jahren auch noch geben.

Warum der TO davon weg bewegt werden soll ist mir nicht klar.


Gruß

Jobst

von MarioT (Gast)


Lesenswert?

Socke schrieb:
> Vielleicht erschließt sich mir auch morgen der sinn des codes komplett
> und ich kann ihn anders schreiben

Beitrag "Tasten entprellen Bulletproof.asm"

Socke schrieb:
> aber wieso kann mein controller mit
> den befehelen or and und eor oder com so gar nichts anfangen?

Peter hat den Code für AVR geschrieben. Das Original ist vermutlich vom 
8051

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.