Assembler Assembler Einstieg

Lohnt sich Assembler zu lernen?

  • Ja

    Stimmen: 10 100,0%
  • Nein

    Stimmen: 0 0,0%

  • Umfrageteilnehmer
    10
Viele (insbesondere ältere) Controller kommen mit 64 I/O-Registern aus. In und Out können entsprechend sechs Bit Adressen ... adressieren.
Unabhängig davon sind die I/O-Register auch wie normaler SRAM mit LDS/LD/LDD zu lesen bzw mit STS/ST/STD zu beschreiben. VOR diesen befinden sich aber die 32 Rechenregister (die Du ebenso mit den SRAM-Schreib-/Lesbefehlen erreichst). In den inkludierten Definitionsdateien (die bei reinem ASM verwendet werden), werden für die ersten 64 I/O-Register die In/Out-Adressen verwendet, und dann die SRAM-Adressen (verwendest Du hier also für ein I/O-Register LD etc., mußt Du 32 (0x20) addieren. Erstells Du 'n C-Projekt (mit 'ner eingebundenen ASM-Datei), bindet C 'ne eigene Definitionsdatei ein, in der immer die SRAM-Adressen verwendet werden. Willst Du hier IN/OUT nutzen, mußt Du folglich 0x20 abziehen.

So...
bei den TPI-ATtinies sind die sechzehn(!) Rechenregister nicht mit LDS usw erreichbar, entsprechend gibt es hier keinen Adress-Unterschied bei I/O und SRAM-Adressen. Außerdem kannst Du hier nonvolatile Speicher (Lockbits, Calibrationbits, ID-Bits und den Flash wie SRAM lesen, letzteren (außer beim Tiny4/5/9/10) auch beschreiben (statt LPM/SPM).
Bei den X-Core-Tinies scheints ähnlich zu sein.
Zu den XMegas kann ich nichts sagen - interessieren mich nicht (-> @Mikro23 )
 
Hmmmm....auch wenn dieser thread schon etwas älter ist, bräuchte ich ein codeschnippsel fuer einen attiny4313 um den uart in gang zu bekommen.
73 de addi
 
Der Maus-Thread... geil...
fuer einen attiny4313 um den uart in gang zu bekommen.
Die Antwort wäre: "Du mußt nur RXEN und/oder TXEN in UCSRB aktivieren." Aber das wird Dir nicht helfen. Was willst Du denn konkret?
Der UART des Tiny4313 wird über vier I/O-Register und ein Doppel-I/O-Register konfiguriert/verwendet.
Drei Konfigurations- und Statusregister (UCSRA..C),
Ein Baudratenreister, wegen 12Bit in zwei I/O-Registern und
Ein Datenregister, welches beim Schreiben auf das Transmit-, und beim Lesen auf des (erste) Recieve-Register zugreift.

Zum generellen Ablauf:
  • Im UCSRC ist
    • der USART-Mode vorzugeben (UMSEL1..0) - Dein gewünschter asynchronous ist default (&B00)
    • der Parity-Mode vorzugeben (UPM1..0) - no Parity ist default (&B00)
    • die Anzahl der Stop-Bits vorzugeben (USBS) - ein Stopbit ist default (&B0)
    • die Polarität der Clock im synchronous mode vorzugeben (UCPOL) - hier also nicht relevant
    • die Anzahl der Datenbits vorzugeben (UCSZ1..0) - acht DB sind default (&B11). Es gibt in UCSRB noch ein drittes UCSZ, UCSZ2..0=&B111 würde den 9-Bit-Mode wählen.
  • das UCSRA enthält neben zwei Konfigurationsbits diverse Flags
    • Flag RXC ist dann gesetzt, wenn sich ein Datenbyte im Recieve-Buffer befindet. Wird dieses gelesen (UDR), wird das Byte aus dem Buffer gelöscht. Sind beide Register des Buffers leer, wird logischerweise auch RXC gelöscht. RXC kann einen IRQ triggern.
    • Flag TXC ist dann gesetzt, wenn das Transmit-Buffer-Register und(!) das Transmit-Schieberegister leer sind, also wirklich nichts mehr zu senden ist. TXC kann einen IRQ triggern.
    • Flag UDRE ist dann gesetzt, wenn der Transmit-Buffer leer ist, und mit neuen Daten beschrieben werden kann. Auch, wenn das Schieberegister noch sendet. UDRE kann einen IRQ triggern.
    • Flag FE signalisiert einen Frame-Error (Stopbit=0) des nächsten (muß also vor lesen des Bytes ausgewertet werden) "Bytes" im Recieve-Buffer.
    • Flag DOR signalisiert einen Data Overrun (zwei (ungelesene) Bytes im Recieve-Buffer, eins im Recieve-Shiftregister und ein erkanntes Startbit. Das wartende Byte im Schieberegister wird jetzt überschrieben.
    • Flag UPE signalisiert einen Paritätsfehler des nächsten Bytes im Recieve-Buffer.
    • Bit MCPM aktiviert den Multi-Prozessor-Kommunikationsmodus (salopp gesagt kannst Du damit ein Netz mit einem Master und vielen adressierbaren Slaves aufspannen. Genaugenommen bewirkt ein gesetztes MCPM lediglich, daß jedes empfangene Byte mit gelöschtem MSB ignoriert wird). Default ist der aus (&B0).
    • Bit U2X schaltet vom 16-fach-Oversampling auf 8-fach-Oversampling um, und verdoppelt damit effektiv die Baudrate
  • UCSRB enthält die drei Interrupt-Enable Bits für die bereits genannten interruptfähigen Flags, je ein Bit zum aktivieren von Transmitter und Reciever, das bereits genannte dritte Character-Size-Bit UCSZ2 sowie Datenbit8 des UDR je als Lese- und Schreibinstanz
  • UBRRH..L legt die Baudrate fest, genauer: den Takt des Oversamplings. Der Wert im UBRR entspricht den Systemtakten zwischen zwei Samples.
  • UDR greift beim Lesen auf den Recieve-Buffer, und beim Schreiben auf den Transmit-Buffer zu. Ist das Transmit-Schieberegister leer, wird dadurch automatisch der Transmit gestartet.
Für 8n1 ist UCSRC meist default. In UCSRA ist ggf das U2X zu setzen, je nach Baudrate und Systemtakt. In UBRRH/L ist die Baudrate (bzw der entsprechende Wert) zu schreiben.
In UCSRB zuletzt die benötigten IRQs sowie Transmitter und/oder Reciever aktivieren.
Fertig.
Senden und Empfangen dann im Programm (ggf Interrupt-gestützt) über Zugriffe auf UDR.
 
Hmmm..
@LotadaC,
was möchte ich?
Gut, hier die Problemstellung.
Ein GPS-Modul ist die Ausgangslage bzw. der 1PPS.
Diesen möchte ich einfach benutzen, um mittels einer ISR die Takte von Timer1 mittel Input Capture zählen (div by 1024) und dann die Differenz (+/- von 15625 bei 16MHZ) über den Uart an den PC weiterzuleiten (als kleiner ASCII-String).
Die Differenz von 15625 gibt mir dann einen Hinweis darauf, wie stark der Quarz des ATTINY von der Temp. abhängt. Das ganze steht im Carport unterm Dach.
Man kann sagen ... ich mache es just for fun.

Deswegen auch die Frage nach einem kurzen Codeschnipsel für die Uartintialisierung.
Bei dem Rest habe ich keine Probleme.
73 de Addi
 
Ein GPS-Modul ist die Ausgangslage bzw. der 1PPS.
Ok, also Du bekommst jede Sekunde 'n Impuls, der einen Input Capture auslöst, und in der korrespondierenden ISR verrechnest Du den ge-capture-ten Wert mit dem letzten (unter Berücksichtigung eines TOV)?
bei 16MHZ [...] wie stark der Quarz des ATTINY von der Temp. abhängt.
Der Tiny hat keinen Quarz, nur zwei interne R-C-Oszillatoren (mit 4 und 8 MHz, wobei das wahrscheinlich derselbe ist - nur mit unterschiedlich zugeschalteten Rs und/oder Cs) und einem Watchdog-Oszillator (auch R-C?).

16MHz gehen nur mit einem externen Quarz oder einer externen Clock (bzw einem Quarzoszillator) - diese externe Quelle bestimmt dann auch die Genauigkeit/Temperaturstabilität.
Du willst jetzt die Genauigkeit/Temperaturstabilität dieser externen Quelle prüfen?

über den Uart an den PC weiterzuleiten (als kleiner ASCII-String).
Also Du brauchst nur den Transmitter.
Wegen der String-Characters wirst Du 8 Datenbits nehmen, sicher ohne Parität und mit einem Stop-Bit. Also konventionelles 8N1 - UCSRC bleibt also default.
Die Flags in UCSRA interessieren Dich erstmal auch nicht, wegen der Baudrate mußt Du ggf nur das U2X setzen.
Das Senden würde ich mit an den Sekundentakt koppeln, ohne UART-IRQs (und erstmal nicht als String, sondern die 16Bit-Rohdaten-Differenz in Form von zwei Bytes) - also wäre in UCSRB nur TXEN zu setzen.

Vorher wäre die Baudrate (bzw der entsprechende Wert in die beiden Baudratenregister zu schreiben. Von 16MHz ausgehend lassen sich die beiden typischen Baudraten 38400 und 76800 recht gut treffen (sogar ohne U2X). In den Ressourcen gibts Rechenhilfen für den UBRR-Wert (zumindest als PC-Programm von Dirk, und als Android-App von mir).

UBRRvalue in die UBRR schreiben (wahrscheinlich ist UBRRH immer 0x00=default, die beiden Zeilen könnten also gespart werden, aber...):


CodeBox Assembler
.EQU UBRRvalue=...
; sonstiger Code
LDI R16, High(UBRRvalue)
OUT UBRRH, R16
LDI R16, Low(UBRRvalue)
OUT UBRRL, R16


Transmitter aktivieren (bei einigen AVR sind die UART-Bits nicht direct Bit accesible, auch wenn das Register im 0x1F-Adressraum liegt - hier finde ich aber den entsprechenden Hinweis im Datenblatt nicht, also versuchsweise QuickNDirty):


CodeBox Assembler
SBI UCSRB, TXEN

Transmitter ist initialisiert...

Nachtrag: Das TX-Bein muß natürlich auch zum Ausgang gemacht werden, das schaffst Du auch ohne Hilfe...
 
Zuletzt bearbeitet:
Vielen dank lotadac.
Das mit dem quarz habe ich unpräzise beschrieben. Es ist ein externer quarz, der den gleichen temperaturschwankungen ausgesetzt ist wie das gps inclusive attiny.
Er ist auch nicht thermisch isoliert.
Ich nehme an, das incl. Vorzeichen nicht mehr als 5bytes über die leitung gehen, wenn überhaupt.
Die leitung ist ungefaehr 16m lang.
Mittels max232 wurd der pegel angehoben.
Numpy macht die auswertung auf dem pc
73 de addi
 
Die leitung ist ungefaehr 16m lang.
Mittels max232 wurd der pegel angehoben.
Sollte kein Problem sein.
nicht mehr als 5bytes über die leitung gehen
Für den ersten Test würde ich bei jedem Sekunden-Puls die Differenz zwischen diesem Capture und dem letzten bilden (TOV berücksichtigen) - das Ergebnis ist ein 16Bit-Wert.
Diese beiden Bytes kannst Du problemlos senden. Du schreibst das erste ins UDR. Es landet im Transmit-Buffer, da der letzte Transfer etwa 'ne Sekunde her war, ist das Sende-Schieberegister leer, also geht er sofort(!) ins Schieberegister -> der Transmit-Buffer ist sofort wieder frei. Du kannst also sofort das zweite Byte hinterher ins UDR schreiben. Dieses wartet dann im Transmit-Buffer, bis das erste aus dem Schieberegister raus ist. Ab dem dritten Byte mußt Du vor dem beschreiben vom UDR auf UDRE (in UCSRA) warten; wenn der Transmit-Buffer beim beschreiben nicht leer ist, verpufft des neue Byte im Nirvana...
Timer1 mittel Input Capture zählen (div by 1024)
Prescaler 256 würde gerade so die Sekunde abdecken - sehr wenig Luft nach oben. Deswegen hast Du Prescaler 1024, klar.
ABER damit verliert Deine Messung "mal eben" zehn Bit Genauigkeit. Etwa 16kHz statt 16MHz.

Besser wäre, den Timer "oben" mit Software zu erweitern. Zwischen zwei TOVs hast Du ja sechzehn Bit=65536 Takte. Bei Prescaler=1.
 
Zuletzt bearbeitet:
Hmmm ..
Innerhalb einer sek kann man die differenz in form von 2 bytes über die leitung jagen, da ja die tov isr ( der softcounter als 16bit ausgelegt) quasi parallel abläuft und die isr fuer das 1pps signal 1sek luft verschafft.
Habe ich irgendetwas 7n meiner logik übersehen?
73 de addi
 
Nur mit den 16Bit des Hardware-Timers:
Dein PPS-Signal löst automatisch das Capture-Event des Timers aus, der Zählerstand wird ins ICR kopiert. Etwa einmal jede Sekunde. Außerdem nutzt Du den IRQ des Capture-Events. Du lädst den letzten Capture-Wert in zwei Register, den neuen in zwei andere und speicherst sie fürs nächste mal. Anschließend bildest Du die Differenz (SUB + SBC). Das Ergebnis ist der Betrag der Differenz, das Carry stellt das Vorzeichen. Wie das dann weiterbehandelt werden soll, weiß ich nicht - Du wolltest ja später 'n String draus machen, also ist der Betrag schon mal nicht schlecht. Den Betrag selbst kannst Du testweise auch erstmal ohne Vorzeicheninfo rausjagen, einfach nacheinander die zwei Bytes ins UDR schreiben. Da der Transmitter seit dem letzten Transmit ja eine Sekunde Zeit hatte, ist er definitiv frei, das erste Byte landet also im Shift-Register, das zweite im Transmit Buffer, wo es wartet, und automatisch übertragen wird, sobald das erste raus ist.
Ein Byte besteht aus zehn Bit, wenn man Start und Stop-Bit mitzählt - selbst bei 2400Baud könntest Du in der Sekunde also 240 Bytes (Zeichen) übertragen lassen.

Wie gesagt sind uns sechzehn Bit aber nun nicht genug Auflösung - der Timer soll im weitere Bits erweitert werden.
Also die zwei Bytes in Hardware, und ein weiteres in Software. 24Bit, rein rechnerisch also 16,777216 MHz, die erfaßt werden könnten. Wenn das nicht reicht, könnte man entweder die Auflösung über den Prescaler halbieren, oder mit einem weiteren Byte gegehalten (was dann aber sicher reichen sollte.

Mit 24Bit:
Grundsätzlich so wie oben, zusätzlich muß aber das dritte Byte in Form eines Registers in Software an den Timer gekoppelt werden. Im TOV-IRQ inkrementierst Du diese Register. Statt des Carry muß dann das Zero genutzt werden, wegen INC (falls nötig).
Bei der Differenzbildung in der Capture-ISR müssen entsprechend drei Bytes betrachtet werden. Insbesondere wird das dritte Byte ja nicht automatisch "abgelichtet".

Folgende Sonderfälle sind zu untersuchen:
  1. der Timer läuft vor dem Capture Event über: dann wird auch sein IRQ vorher behandelt, OK
  2. der Timer läuft nach dem Capture-Event, aber während der ISR über: Die ermittelte Differenz stimmt, der TOV-IRQ wartet im Hintergrund auf das Ende der Capture-ISR. Etwa 16Bit-Takte Zeit für die ISR. OK
  3. das Capture-Event tritt während der TOV-ISR ein: der Timer ist also bereits inkrementiert, das dritte Byte wird gerade inkrementiert, die Capture-ISR wartet, Du hast höchstens eine Sekunde Zeit für die Behandlung. OK
  4. TOV und Capture schlagen echt(!) gleichzeitig zu: Dann hat das Capture den Vorrang (wegen der IVT). Es wird also wie (2) behandelt - ABER der Timer ist bereits übergelaufen, das dritte Byte wurde aber noch nicht inkrementiert (der IRQ wartet ja noch). NICHT OK
Um (4) mußt Du Dich also kümmern.
Der Timer ist also übergelaufen, aber der IRQ konnte noch nicht behandelt werden. Insbesondere wurde also 0x0000 ge-capture-t. Ist die 0x0000 im ICR ein hinreichendes Kriterium? Nicht im allgemeinen - der Timer steht bei Prescalern größer eins ja mehrere Takte. Die TOV-ISR kann also vor dem Capture-Event ausgelöst worden sein, der Timer aber während des Captures noch nicht inkrementiert worden sein. Im ICR wäre dann folglich noch die 0x0000, das dritte Byte wäre in der Capture-ISR bereits (korrekt) inkrementiert. Das entspräche (1).
Also nochmal: der Timer ist gerade eben übergelaufen (ICR=0x0000) UND der Überlauf IRQ wurde noch nicht behandelt. Das läßt sich natürlich am noch gesetzten TOV-Flag erkennen. wenn beide Bedingungen erfüllt sind, mußt Du das eingelesene Soft-Byte inkrementieren (also nicht den Zähler selbst, sondern die Kopie, klar?)

Ok, die TOV-ISR sollte sich recht kurz halten lassen. In der Capture-ISR müssen die "geblitzten" Werte zumindest festgehalten werden (also auch das Soft-Byte) unter Beachtung von Fall (4). Die Differenzbildung ist auch recht simpel, zwei Bytes in den UART zu knallen auch, aber wenn mehr gesendet werden sollen (Baudrate!), und/oder ggf noch BCDs/Strings/... generiert werden sollen, muß an das gesamte Timing gedacht werden.
Die Capture-ISR muß der TOV-ISR genug Luft lassen, und die triggert alle 16Bit-Takte (wobei sich in 65 Kilotakten schon das ein oder andere erledigen läßt (Prescaler=1 angenommen)).
Ansonsten werden eben nur die vollständigen Captures oder die Differenzen abgelegt (und ein Statusflag), und dann außerhalb der ISRs (durch das Flag getriggert) weitere Umwandlungen und der Transfer behandelt, wofür dann etwa 'ne Sekunde (sechzehn Millionen Takte abzüglich vieler TOVs und eines Captures) verfügbar sind.

Und da @TommyB sich ja immer für ... eher unkonventionelle Vorschläge meinerseits begeistert: Der Tiny4313 besitzt 'n USI, und dieses 'n vier-Bit-Flankenzähler (um die sechzehn Flanken der Clock für acht Bit zu zählen). Diesen vier-Bit-Counter kann man in Hardware(!) an einen Timer koppeln. Intern leider nur an das "Timer/Counter0 Compare Match" (äh... welcher von den beiden??). Aber man kann Timer1 ja auch bei jedem Überlauf automatisch ein Bein toggeln lassen (über einen der Output Compare-Channel), und dieses extern auf den Clock-Eingang des USI-Counters legen. Dann hätte man einen 20Bit-Timer, wobei der 20Bit-TOV dann durch den USI Overflow Interrupt behandelt werden müßte. Das Input-Capture erwischt in Hardware natürlich auch nur die untersten 16Bit, der Rest wäre wie oben zu behandeln. Nur das Fall-4-Problem hast Du hier nicht, stattdessen kann der Timer jetzt aber während der ISR überlaufend den 4-Bit-Anteil inkrementieren (dann ist ICR sehr groß und TCNT nach dem auslesen des USI-Counters sehr klein. Vielleicht könnte man hier auch mit einer leeren tricksen … wahrscheinlich nicht).
Cave!: Das USIOIF scheint durch die ISR nicht automatisch gelöscht zu werden. Muß dann also selbst mit "1" beschrieben werden.

Den gekoppelten 20Bit-Hardware-Timer kannst Du natürlich trotzdem mit mehreren zusätzlichen Soft-Bytes erweitern.

Uuuund wo ich gerade am rumspinnen bin: Man kann natürlich auch erstmal Timer0 als Counter an Timer1 koppeln (externe Verbindung), und dann intern den USI-Counter dranschalten. Wäre dann mal eben ein 28-Bit-Timer.:p
(jaja, Capture dann mit soft-Unterstützung)
 
Waaaauuh...das muss ich mir auf der zunge zergehen lassen. Sprich gedanklich widerkäuen.
Man könnte auch(etwas sehr pragmatisch) die entspr. Fuse setzen um die quarzfrequenz mittels externem zähler zu erfassen. Imo zu trivial.
73 de addi
 
Das mit dem 28bit-Timer probier ich wohl selbst mal aus (hab noch ein paar Tiny2313A hier) - muß mir nur noch'was passendes als Aufgabe einfallen lassen. Die einstellbare Clock des STK500 mit dem kombinierten Input-Capture-Timer messen lassen...
mal sehn...
 
Hallo LotadaC,
der Sendezweig läuft jetzt..mit 9,6 und 2Stoppbits, no parity.
Jetzt geht es ans Eingemachte.
73 de addi
 
Hallo, bei den Atmel MCUs ist die Befehlsausführungszeit direkt mit dem Takt beziehungsweise mit Quarzfrequenz in Zusammenhang zu setzen. Man muss jetzt nur wissen, dass die einzelnen Befehle einmal einen oder mehrere Taktzyklen brauchen. Bei den Sprungbefehlen ist das dann so, dass bei Erreichen des Ziels zwei Takte beziehungsweise noch der Rücksprung als Takt "verbraucht" werden. Genaueres findet man in der Assembler-Help Instruction Set Zum Beispiel: BRLT-Befehl:Words: 1 (2 bytes) Cycles: 1 if condition is false; 2 if condition is true.
Für längere Zeitschleifen ist es vielleicht nicht schlecht, mit einem 16-Bit Registerpaar und den entsprechenden Befehlen zu arbeiten. Kleines Beispiel angefügt. Die Konstante ist hier Zeit0. Muss im Deklarationsteil vorher definiert werden. Man kann mehrere Konstanten definieren, die Repeat-Schleife bleibt aber gleich, braucht also nicht extra noch einmal ausformuliert werden, spart Code.

MfG
Oskar01
 

Anhänge

  • Zeitschleifen.asm
    923 Bytes · Aufrufe: 2
Zuletzt bearbeitet:
Hi
Wie ihr sicherlich bemerkt habt, ist es sehr still geworden bei mir. Aber seit ich im Ruhestand bin, hab ich einfach keine Zeit mehr Im Beitrag hab ich die Frage nach meinem geplanten Buchen gelesen Und ob es das schon gibt. Nun, nicht zu kaufen. Es ist mit über tausend Seiten fertig, schon eine ganze Weile. Aber ein abschließendes Kontrolllesen hab ich noch nicht geschafft. Bei Interesse würde ich es gegen einen kleinen Unkostenbeitrag diesem Forum zur Verfügung stellen. Es ist ein Zweiteiler. Erster Teil, Visual Basic (VB 10) mit Datenbankgrundlagen. Die Beschreibung wie ein Programm entsteht und damit es nicht langweilig wird, ist das fertige Programm ein nützliches Tool, um Controllerfunktionen am PC zur Laufzeit zu testen. Der zweite Teil beschreibt Assembler Programme auf ATiny- und AtMegabasis und wie sie schrittweise entwickelt werden können. Das Ganze ist auf einer CD. Ein richtiges Buch wäre auch zu teuer. Es richtet sich hauptsächlich an Anfänger und Einsteiger. Daher ist der Inhalt auch weitestgehend frei von komplizierten Programmstrukturen. OK, ich will hier aber keine Werbung machen, denn die Idee zur kommerziellen Vermarktung hab ich schon lange aufgegeben. Also, bei Interesse einfach Mal nachfragen.
Gruß oldmax
 
Hi
Es ist ja schon sehr lange her, das ich Mal einen ( ziemlich umfangreichen) Beitrag zu Assembler hier eingestellt habe. Mit dem Suchbegriff ,Angst, findest du diesen Thread ,Keine Angst vor Assembler,. Der sollte dir bei der Lösung einiger Probleme helfen.Vielleicht ist ja ein Mitglied Mal so nett,und setzt einen Link drauf. Ich hab das immer noch nicht geschnallt
Gruß oldmax


EDIT Admin:
Thema Keine Angst vor Assembler
 
Zuletzt bearbeitet von einem Moderator:

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)