Grundsatzfrage zum Bustransfer

#7681142
Lesenswert?

Ich habe mich ja nie damit beschäftigt und was ich bisher so gelesen hatte, wurde immer nur gewartet bis die Gegenstelle bereit ist und dann komplette Daten auf den Bus zum abholen gelegt.

Jetzt fällt mir auf, dass zumindest der dht da ein zeitverschlüsseltes ein bit Protokoll verwendet.

Das bedeutet, dass wenn das Timing nicht stimmt und man zwischendrin eine Pause macht, wieder von vorne anfangen muss.

Wie löst ihr das??

#7681210
Lesenswert?

Matthias schrieb:

Arduino F. schrieb:

Matthias schrieb:

Wie löst ihr das??

Öhhmm... Wir halten uns an das Protokoll des Herstellers, wenn wir damit erfolgreich sein wollen. Dann klappt das auch. Ohne Pause machen, ohne neu anfangen.

Und wie soll das gehen wenn die Uhrzeit über einen Interrupt kommt??

da der dht aber keine ganze Sekunde braucht, kannst du nach dem Interrupt das abfragen.

#7681255
Lesenswert?

Moin, Matthias schrieb im Beitrag #7681158:

Andreas S. schrieb:

Matthias schrieb:

Das kein Protokoll, das ist eine Krankheit...

Dein Pech. Und nun?

Schlafen und morgen meinen Swimmingpool weiterschaufeln.

Scheint mir eines der wenigen vernuenftigen Vorhaben von dir. Jeder sollte das machen, was er am besten kann.

scnr, WK

#7681738
Lesenswert?

Ich hab immer noch keine Lösung...

Wenn ich die Interrupt abschalte, werden die anderen Übertragungen gestört und wenn ich die an lasse, bekomme ich keine 100 %ig sichere Übertragung hin?

Vllt. den Interrupt vom Taskwechsel abschalten, da der ja recht lange dauert und die restlichen eben probieren und bei einem Fehler neu starten?

Oder findet die Übertragung grundsätzlich nur nach Aufforderung statt und ich kann theoretisch DHT, RS485, CAN und Ethernet nacheinander abarbeiten (also Interrupt abschalten, eine Schnittstelle abfragen, Antwort einlesen und Interrupt wieder anschalten)?

#7681784
Lesenswert?

Arduino F. schrieb:

Matthias schrieb:

....

Ja!

Was ja? Ich müsste das schon wissen, damit ich jetzt nicht mit den Modulen anfange um dann festzustellen, dass das sequentielle abarbeiten nicht möglich ist...

Der Can-Controller hat scheinbar einen eigenen Puffer, müsste also klappen.

RS485 hat ja keinen Controller, da wird man die Daten schon direkt einlesen müssen, ohne die Interrupt abzuschalten, wenn man alle Werte haben will?

(Firma: Gast) #7681841
Lesenswert?

Matthias schrieb:

mir hat halt beim dht11 ein serial.println beim einlesen, zwischen den Bits das Timing zerhauen und dann habe ich geschaut,

Du hast mein volles Mitgefühl! Allerdings: Wundern tut mich das nicht!

Matthias schrieb:

warum..

Du weißt "Warum?"

Dir sind sogar die möglichen Abhilfen bekannt. Und zwar: Solange du keinen 2ten Core nutzt, wirst du die Interrupts abschalten müssen.

#7681847
Lesenswert?

Matthias schrieb:

Ich hab immer noch keine Lösung...

Wenn ich die Interrupt abschalte, werden die anderen Übertragungen gestört

kommt darauf an, ich kann mich gerade nicht in deine Config einarbeiten, aber

ich fand für mich am AVR eine Lösung

für IRMP gibt es alle 64µs einen IRQ, der sammelt die IR Bits, dauer im µs Bereich. für Pedas Tasten Entprellroutine gibt es einen 10ms Timer IRQ

da im IRQ kein weiterer IRQ zugelassen ist könnte man im 10ms Timer IRQ für die Tastenentprellung ein IR Interrupt verpassen, also setzte ich ein Flag, eine Variable Bin_im_10ms_Timer_IRQ und gebe die IRQ für IR wieder frei mit sei(), wenn nun der nächste IR int kommt weiss ich ob ich im 10ms Timer IRQ bin oder nicht und muss entsprechend verzweigen/reagieren.

Bin ich noch im 10ms Timer IRQ mache nichts ist der Timer 10ms abgearbeitet, also am Ende sperre ich für den IR int mit cli() wieder und verlasse den 10ms timer tasten IRQ.

Das könnte auch bei dir funktionieren, aber die typischen IR senden Codes ja öfter so daß ein Bitausfall im IR nicht auffällt.

Ich kenne deine Aufgabe ja nicht.

#7681854
Lesenswert?

Joachim B. schrieb:

Matthias schrieb:

Ich hab immer noch keine Lösung...

Wenn ich die Interrupt abschalte, werden die anderen Übertragungen gestört

kommt darauf an, ich kann mich gerade nicht in deine Config einarbeiten, aber

ich fand für mich am AVR eine Lösung

für IRMP gibt es alle 64µs einen IRQ, der sammelt die IR Bits, dauer im µs Bereich. für Pedas Tasten Entprellroutine gibt es einen 10ms Timer IRQ

da im IRQ kein weiterer IRQ zugelassen ist könnte man im 10ms Timer IRQ für die Tastenentprellung ein IR Interrupt verpassen, also setzte ich ein Flag, eine Variable Bin_im_10ms_Timer_IRQ und gebe die IRQ für IR wieder frei mit sei(), wenn nun der nächste IR int kommt weiss ich ob ich im 10ms Timer IRQ bin oder nicht und muss entsprechend verzweigen/reagieren.

Bin ich noch im 10ms Timer IRQ mache nichts ist der Timer 10ms abgearbeitet, also am Ende sperre ich für den IR int mit cli() wieder und verlasse den 10ms timer tasten IRQ.

Das könnte auch bei dir funktionieren, aber die typischen IR senden Codes ja öfter so daß ein Bitausfall im IR nicht auffällt.

Ich kenne deine Aufgabe ja nicht.

1
void softSerialRead(){
2
  uint8_t d = 0;
3

4
  // If RX line is high, then we don't see any start bit
5
  // so interrupt is probably not for us
6
  if ( !rx_pin_read() ) {
7
    // Wait approximately 1/2 of a bit width to "center" the sample
8
    tunedDelay(_rx_delay_centering);
9

10
    uint8_t i;
11
    // Read each of the 8 bits
12
    for (i = 0x1; i; i <<= 1) {
13
      tunedDelay(_rx_delay_intrabit);
14
      uint8_t noti = ~i;
15
      if (rx_pin_read())
16
        d |= i;
17
      else // else clause added to ensure function timing is ~balanced
18
        d &= noti;
19
    }
20

21
    // skip the stop bit
22
    tunedDelay(_rx_delay_stopbit);
23

24
    // if buffer full, set the overflow flag and return
25
    if (((_receive_buffer_tail + 1) & _SS_RX_BUFF_MASK) != _receive_buffer_head) {  // circular buffer
26
      // save new data in buffer: tail points to where byte goes
27
      _receive_buffer[_receive_buffer_tail] = d; // save new byte
28
      _receive_buffer_tail = (_receive_buffer_tail + 1) & _SS_RX_BUFF_MASK;  // circular buffer
29
    } else {
30
      _buffer_overflow = true;
31
    }
32
  }
33
}

Das blockiert zwangsweise mindestens für 8 Bit jeglichen Interrupt.

Wenn jetzt von zwei solchen Teilen gleichzeitig Daten kommen, z. B. WR und Stromzähler, was passiert dann?

Kann sein, dass ich mich jetzt als Vollhorst oute, aber da kommt der Interrupt und dann ist das Signal sofort auf 8 Bit abzutasten, oder man hat einen Übertragungsfehler...

#7681857
Lesenswert?

Und dann noch sowas, damit ich weiß, ob die Batterie es nicht evtl. kalt hat:

1
bool dht11__read(int pin)
2
{
3
  // BUFFER TO RECEIVE
4
  zrtos_bitfield_t  bits[5] = {};//40
5

6
  // EMPTY BUFFER
7
  for (int i=0; i< 5; i++) bits[i].val = 0;
8

9
  // REQUEST SAMPLE
10
  pinMode(pin, OUTPUT);
11
  digitalWrite(pin, LOW);
12
  delay(18);
13
  digitalWrite(pin, HIGH);
14
  delayMicroseconds(40);
15
  pinMode(pin, INPUT);
16

17
  Serial.println("DHT11.1");
18

19
  // ACKNOWLEDGE or TIMEOUT
20
  unsigned int loopCnt = 10000;
21
  while(digitalRead(pin) == LOW)
22
    if (loopCnt-- == 0) return true;
23

24
  Serial.print("DHT11.2");
25

26
  loopCnt = 10000;
27
  while(digitalRead(pin) == HIGH)
28
    if (loopCnt-- == 0) return true;
29

30
  Serial.print("DHT11.3");
31

32
  // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
33
  for (int i=0; i<40; i++)
34
  {
35
    loopCnt = 10000;
36
    while(digitalRead(pin) == LOW)
37
      if (loopCnt-- == 0) return true;
38

39
    unsigned long t = micros();
40

41
    //Serial.print("DHT11.4");
42

43
    loopCnt = 10000;
44
    while(digitalRead(pin) == HIGH)
45
      if (loopCnt-- == 0) return true;
46

47
    //Serial.print("DHT11.5(");
48
    //Serial.print((micros() - t));
49
    //Serial.print(")");
50

51
    if ((micros() - t) > 40){
52
      zrtos_bitfield__set_msb(bits,i,true);
53
    }
54
  }
55

56
  Serial.print("DHT11.6");
57

58
  // WRITE TO RIGHT VARS
59
        // as bits[1] and bits[3] are allways zero they are omitted in formulas.
60
  //uint8_t humidity    = bits[0].val;
61
  //uint8_t temperature = bits[2].val;
62

63
  Serial.print("Humidity (%): ");
64
  Serial.println(zrtos_vfs_module_dht__get_humidity(bits,ZRTOS_VFS_MODULE_DHT_TYPE__DHT11));
65
  Serial.print("Temperature (%): ");
66
  Serial.println(zrtos_vfs_module_dht__get_temperature(bits,ZRTOS_VFS_MODULE_DHT_TYPE__DHT11));
67

68
  uint8_t sum = bits[0].val + bits[2].val;  
69

70
  if (bits[4].val != sum) return true;
71
  return false;
72
}

Ich probiere es ja, aber ob das zuverlässig läuft??

#7681858
Lesenswert?

Also um genau zu sein, kommen die Daten für die Steuerung des Mistvieh mindestens von 3 x modbus und 2 x canbus:

1
  Stromzähler -- modbus ----------.
2
  WR 1 --------- modbus --------. |
3
  WR 2 --------- modbus ------. | |
4
  ^                           v v v
5
  `--------------canbus ---- Arduino Uno <--.
6
  Batterie ----- canbus --------------------'
#7681903
Lesenswert?

Matthias schrieb:

Oder findet die Übertragung grundsätzlich nur nach Aufforderung statt und ich kann theoretisch DHT, RS485, CAN und Ethernet nacheinander abarbeiten (also Interrupt abschalten, eine Schnittstelle abfragen, Antwort einlesen und Interrupt wieder anschalten)?

Nein. Typisch hat man für RS485, CAN und Ethernet usw. einen Controller im MC, der die Daten puffert. Z.B. bei der UART im AVR werden bis zu 3 Bytes gepuffert, d.h. man hat 30 Bitlängen Zeit, in den Interrupt zu springen und die Daten in einem FIFO abzuspeichern. Es bleibt also genug Zeit, um andere Interfaces zu behandeln, ohne das es Konflikte gibt. Die Daten parst man dann bequem in der Mainloop.

Etwas tricky wird es bei Sonderformaten, für die es keine Controllereinheit im µC gibt und die man mit Bitwackeln nachbilden muß. Da bietet es sich an, mit Interruptprioritäten zu arbeiten, d.h. die Interfaces mit Controller auf geringere Priorität zu setzen. Oder falls das nicht geht, die Interrupts in deren Handler frühzeitig wieder freizugeben.

Wie man z.B. 1-Wire mit Interrupts behandelt, findest Du in der Codesammlung.

Ein RTOS macht die gleichzeitige Benutzung mehrerer Interfaces deutlich komplizierter und zehrt vor allem stark an den Ressourcen der CPU. Daher ein RTOS nur mit Bedacht und viel Erfahrung benutzen.

#7681911
Lesenswert?

Matthias schrieb:

void softSerialRead(){

Bei einer Funktion, die so heißt, klingeln bei mir sämtliche Alarmglocken. Diese Implementationen sind wirklich nur für sehr eingeschränkte Anwendungen gedacht. Oft sind sie auch blockierend geschrieben und nicht über Interrupts. Für sinnvolles Programmieren sollte man schon die entsprechenden Controllereinheiten im µC benutzen und nicht alles in Software nachbilden.

Es gibt natürlich auch UART-Implementationen mit Interrupts in Software, nur muß man dann auch deren Anforderungen an die anderen Tasks beachten. Unbekümmert nur Legosteinchen übereinander stapeln, geht dann nicht mehr.

#7682366
Lesenswert?

Peter D. schrieb:

Matthias schrieb:

Oder findet die Übertragung grundsätzlich nur nach Aufforderung statt und ich kann theoretisch DHT, RS485, CAN und Ethernet nacheinander abarbeiten (also Interrupt abschalten, eine Schnittstelle abfragen, Antwort einlesen und Interrupt wieder anschalten)?

Nein. Typisch hat man für RS485, CAN und Ethernet usw. einen Controller im MC, der die Daten puffert. Z.B. bei der UART im AVR werden bis zu 3 Bytes gepuffert, d.h. man hat 30 Bitlängen Zeit, in den Interrupt zu springen und die Daten in einem FIFO abzuspeichern. Es bleibt also genug Zeit, um andere Interfaces zu behandeln, ohne das es Konflikte gibt. Die Daten parst man dann bequem in der Mainloop.

Danke für den Denkanstoß, der Arduino Mega hat scheinbar 4 Hardware UART (der Uno nur einen). Damit müsste es gehen, ohne sich selbst ein nicht funktionsfähiges Software serial hinzufrickeln was dann doch nicht fehlerfrei läuft!!

#7682577
Lesenswert?

Joachim B. schrieb:

Matthias schrieb:

Für was ist eigentlich das SoftwareSerial,

nur für die die damit umgehen können!

Ich würde auch sagen, für die, die nur Legosteinchen stapeln wollen, ist es ungeeignet. Für schnell mal eben Testaus-/Eingaben zu zimmern, geht es durchaus.

Jedes Werkzeug hat seine Vor- und Nachteile. Wer die Nachteile nicht verstehen möchte, sollte es nicht benutzen.

#7682579
Lesenswert?

Matthias schrieb:

Für was ist eigentlich das SoftwareSerial, wenn es eh nur verbuggt läuft??

Du bist halt voll in die Arduino-Falle getappt. Die besteht darin dass man jedem Noob glaubhaft macht dass man nichts können oder wissen muss um per Copy-Paste embedded Software zu schreiben.

Ist halt nicht so. Ahnung haben hilft. Echt, ungelogen. Ansonsten wird das wie immer Lernen durch Schmerzen. Da du dich jedoch wenig einsichtig zeigst funktioniert das mit dem Lernen noch nicht so.

#7682602
Lesenswert?

Matthias schrieb:

Jetzt fällt mir auf, dass zumindest der dht da ein zeitverschlüsseltes ein bit Protokoll verwendet.

Falls Du damit die Feuchtesensoren meinst, das ist eigentlich nicht schwer. Eine Bitzeit dauert 76..120µs. Beim AVR @16MHz hat man also >1200 Zyklen Zeit für andere Interrupts. Wenn man da nicht zu verschwenderisch ist, läßt sich das bequem wuppen. Wie gesagt, das länger dauernde Parsen macht man eh in der Mainloop.

Da die Information in der Bitzeit liegt, bietet sich der Capture-Interrupt geradezu an. Das Einlesen erfolgt also per Interrupt im Hintergrund, ohne andere Tasks zu stören.

Leider findet man kaum konkrete Codebeispiele, sondern immer nur die Benutzung fertiger Libs. Ich habe daher keine Ahnung, wie gut deren Qualität ist, d.h. wie sauber die programmiert wurden. In einem Artikel habe ich gelesen, daß die DHT22 gerne mal abstürzen und dann ein Power-Off benötigen. Das läßt nichts gutes ahnen. Ich vermute daher Probleme in dieser verwendeten Lib.

Wie gesagt, es mit dem Capture-Interrupt auf dem AVR selber zu implementieren, stelle ich mir einfach vor. Zum Test würde ich zuerst mal alle 41 Capture-Werte im SRAM ablegen und per UART ausgeben (SW-Serial ginge dazu auch).

#7682689
Lesenswert?

120 us * 40 Bit müssten 4,8 ms sein.

Modbus hat, was ich so gelesen habe, scheinbar 19.200 bit/s, also 52,1 us pro Bit und 0,416 ms pro Byte.

Es können also 11,5 Byte über modbus eintrudeln, während ich da die Feuchtigkeit auslese.

Wenn der UART-Puffer tatsächlich nur 3 Byte hat, wird es mit einem blockierenden DHT11-Treiber wahrscheinlich nicht zuverlässig laufen.

Die Batterie hat aber einen eigenen Temperatursensor.

Wahrscheinlich kann ich auf den DHT11 verzichten und habe dann nur noch Controller, die sich per Interrupt melden wenn was angekommen ist.

Idiotensicher sozusagen...

#7682836
Lesenswert?

So kompliziert ist Interrupt Programmierung nicht. Man muß sich erstmal Gedanken machen, welchen Teil erledigt der Interrupt und welchen das Main. Man muß also eine Vorstellung entwickeln, was kostet viel CPU-Zeit und was ist zeitkritisch und dann diese Teile im jeweiligen Kontext ausführen. Ansonsten stößt man schnell an die Grenzen der blockierenden Programmierung.

Ein RTOS oder Multicore versucht im Prinzip das gleiche, nur wird da keine Intelligenz des Entwicklers benötigt. Die Trennung erfolgt also nicht logisch, sondern Brute Force mit einer Unmenge an Ressourcen.

(Firma: 1984now) #7682922
Lesenswert?

Peter D. schrieb:

Ein RTOS oder Multicore versucht im Prinzip das gleiche, nur wird da keine Intelligenz des Entwicklers benötigt. Die Trennung erfolgt also nicht logisch, sondern Brute Force mit einer Unmenge an Ressourcen.

Ist also im Prinzip bei gegebener Hardware nur ein sehr komplizierter Weg, denselben Zustand "geht nicht wegen Verstoß gegen timing constraints" zu erreichen.

Also wenn schon aus Gründen von Dummheit oder Faulheit oder Kostendruck die Verwendung eines RTOS attraktiv erscheint, dann gleich einen deutlich potenteren Rechenknecht als Target einplanen.

Lizenskosten für's RTOS und höhere Hardwarekosten können übrigens den Kostenvorteil bei der Entwicklung auch durchaus mal auffressen, wenn man nicht aufpasst. Hängt stark von der Stückzahl des Produkts ab. Je größer die ist, desto größer ist auch die Gefahr, dass es in der Gesamtbilanz ordentlich in's Minus geht.

(Firma: Schweigstill IT) Persönliche Seite #7682999
Lesenswert?

Matthias schrieb:

Modbus hat, was ich so gelesen habe, scheinbar 19.200 bit/s, also 52,1 us pro Bit und 0,416 ms pro Byte.

Was Du alles so liest... Mit wäre es neu, dass Modbus (RTU) mit nur einer einzigen Baudrate betrieben wird.

Und hast Du, insbesondere bei der Implementierung eines Modbus-Slaves, auch mal Gedanken über T35 usw. gemacht? Vermutlich nicht.

Es können also 11,5 Byte über modbus eintrudeln, während ich da die Feuchtigkeit auslese.

Einfach so, auch wenn Dein Microcontroller der Master sein sollte? Interessant zu wissen. War bisher niemandem bekannt.

#7683102
Lesenswert?

Andreas S. schrieb:

Matthias schrieb:

Modbus hat, was ich so gelesen habe, scheinbar 19.200 bit/s, also 52,1 us pro Bit und 0,416 ms pro Byte.

Was Du alles so liest... Mit wäre es neu, dass Modbus (RTU) mit nur einer einzigen Baudrate betrieben wird.

Und hast Du, insbesondere bei der Implementierung eines Modbus-Slaves, auch mal Gedanken über T35 usw. gemacht? Vermutlich nicht.

Es können also 11,5 Byte über modbus eintrudeln, während ich da die Feuchtigkeit auslese.

Einfach so, auch wenn Dein Microcontroller der Master sein sollte? Interessant zu wissen. War bisher niemandem bekannt.

Nein und ich habe jetzt auch nicht vor darüber eine Doktorarbeit zu schreiben.

Mir reicht es, wenn die Solaranlage mit Batteriespeicher irgendwann zuverlässig läuft, ohne dass da tagelang ein Relais klackert bis ich die Batterie manuell vom Stromkreis trenne.

So ein Relais hat nämlich nur ein paar 10 tausend Schaltzyklen, bevor es den Geist aufgibt.

Danach habe ich auch noch andere Projekte in der Schublade die traurigerweise wegen Zeitmangel verstauben 😭

#7683137
Lesenswert?

Ich habe ja schon nicht viel Ahnung und lese solche Sachen eigentlich um zu lernen. Wenn ich das hier vom TO lese, dann frage ich mich, wieso macht man das? Wieso nicht in kleinere Brocken aufteilen und erstmal eins zum Laufen bringen. Man kann auch alles auf eigene Controller realisieren und wenn das alles klappt, Stück für Stück das in eine Hardware zusammen fassen.

Dem Mut würde ich Respekt zollen, aber ich glaube nicht, dass es der Mut an Aufgaben zu wachsen ist.

#7683192
Lesenswert?

Falk B. schrieb:

Matthias schrieb:

Danach habe ich auch noch andere Projekte in der Schublade die traurigerweise wegen Zeitmangel verstauben 😭

Nö, wegen deiner Unfähigkeit und mangelndem Pragmatismus. Du bläst Probleme auch, anstatt sie zu lösen. Aber Jammern ist ja modern.

Nein, ich hab jetzt 6 Monate mit der Steuererklärung zugebracht, weil irgendeiner gerne einen Doktor hätte und es die scheinbar bei Steuergesetzen nur gibt, wenn man es noch schwerer macht.

Jetzt hatte ich ein kleines Zeitfenster für die Steuerung der Solaranlage und muss jetzt eben mit höchster Priorität den Garten fertig machen, bevor es wieder kalt wird.

Klar, kann man auch Tätigkeiten outsourcen, aber die IT wird halt teilweise sehr schlecht bezahlt.

(Firma: 1984now) #7690307
Lesenswert?

Klaus schrieb:

Falk B. schrieb:

Ein Schwätzer vor dem Herrn!

Der nun wohl vorläufig ruhegestellt wurde, und damit viel mehr Zeit hat, seine unterentwickelten Programmierkenntnisse seinem Trollfaktor anzunähern.

Nicht wirklich. Der wird wohl innert kürzester Zeit unter einem anderen Account wieder auftauchen. Zumindest wenn er nicht völlig blöd und Trollen sein eigentliches Ziel ist.

Aber: er hat genug Stoff für die Trolldetektor-KI hinterlassen. Wenn er wieder auftaucht, ist er auch schnell wiedererkannt. Genau so, wie sie seine vorherigen Inkarnationen erkannt hat.

Weswegen ich auch ziemlich sicher bin, dass er bald wieder auftauchen wird.

Notorische Trolle sind psychisch gestörte Personen, genau wie Serienmörder, bloß nicht ganz so gefährlich für das Gemeinwohl. Aber wie diese können sie nicht ablassen von ihrem Tun. Zumal hier keine ernsthafte Strafe droht.

Was andererseits auch irgendwie OK ist, es entsteht ja niemandem ein Schaden. Jedenfalls nicht, wenn man nicht bereit ist, freiwillig etwas zu tun. Also dem Troll zu antworten und tatsächlich Geistesleistungen aufzuwenden, um eine kompetente Antwort zu geben. Der Aufwand ist umsonst, klar. Aber es ist kein Schaden im Sinne des BGB, da er freiwillig und ohne vorherige Vereinbarung einer Gegenleistung erbracht wurde.

#7690328
Lesenswert?

Ob S. schrieb:

Der wird wohl innert kürzester Zeit unter einem anderen Account wieder auftauchen. Zumindest wenn er nicht völlig blöd und Trollen sein eigentliches Ziel ist.

Glaube nicht dass Trollen sein eigentliches Ziel war. Sonst hätte er nicht mit Links um sich geschmissen, die ihn mit 2-3 Mausklicks mit vollem Realnamen, vollständiger Adresse usw. "enttarnen".

Ich denke es ist eher das, was ich oben geschrieben habe: Der hat

Klaus schrieb:

echt einen an der Klatsche.

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