Bascom Auslesen eines Messschiebers Bascom Glcd

Matthiasab64

Mitglied
21. Feb. 2012
82
0
6
Brandenburg an der Havel, de
Sprachen
  1. BascomAVR
Hallo liebe Gemeinde,

Zunächst einmal Sorry des ich ein neues Thema eröffne obwohl es darüber schon eins gibt, aber das andere Thema ist zwei Jahre alt und ist mit einer Diskusion ob Messschieber oder Schiebelehre im Sande verlaufen.

Nach dem ich lange gesucht hab wie man einen Messschieber ausliesst und leider nichts gefunden hatte was mir weitergeholfen hatte musste ich mir selbst helfen. Die Anschlussbelegung hab ich im Internet gefunden, soweit so gut aber einen Code für das auslesen hatte ich nicht wirklich gefunden. Denn die meisten die einen MS auslesen schreiben in ASM und dann meist auch nur für die Ausgabe an einem Pc in dem dann auch die berechnung stattfindet. Viele seiten auf die verwiesen wird sind übrigens auch schon lange vom Netz.

Da ich nicht wusste mit welchem Pegel und welcher Taktrate die signale kommen, hab ich kurzerhand mein M16 und das Glcd als Oszi(hab leider kein richtiges) eingerichtet und konnte mir erstmal einen ersten Eindruck vom Clock und Daten verschaffen. Da die Ausgänge recht hochohmig sind und ein sehr kleinen Pegel haben habe ich zwei OAmps vorgeschalten. Nachdem das erledigt war, konnte der M16 auch daten lesen, zu meiner überraschung waren die Daten fast im Klartext.
Das heisst bei meinem MS ist bit2 bis bit21 der messwert in mm dem nur noch die Kommastelle und das Vorzeichen angehängt wird. Bit1 ist bei 0 = mm und bei 1 = inch, bit22 setzt das Vorzeichen.

So nun zu meiner eigentlichen Frage ich habe unten im Code ein Format vergeben mit ..."#.##".... leider stört mich das immer der ganze Wert hin und her springt wenn sich die Wertgrösse von Einstellig vorm Komma auf Zwei bzw dann auch auf Drei stellen ändert. Kann man da irgendwelche "platzhalter" einbauen ohne führende nullen?

Das zweite, ich hatte vorher "Ergebn" as signle was mir irgendwann mal die Drehzahl anzeigen soll, wenn ich als single nehme wird mir der wert auch hier mit Kommastelle ausgegeben ich konnte es nur abstellen in dem ich "Ergebn" als integer dimensioniere. Warum ist das so???

Dann meine letzte Frage gibt es eine andere möglichkeit "Bit22" aus "M" zu entfernen als wie unten im Code mit dem hin und herschieben der werte? Mit M = NBit.22 hab ich probiert das geht nicht da meldet der Compeiler ein problem.

Der Code, bitte nicht den Kopf abreissen ist erstmal nur ein Grundgerüsst was nur einen MS ausliesst.

Code:
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32


Dim Z As Byte
Dim X As Byte
Dim Y As Byte
Dim M As Long
Dim V As Long
Dim Mes As Single
Dim Ergeb As String * 6
Dim Ergebn As Integer
Ergebn = 3000                                               ' wert für drehzahl _ weil wird noch nicht erfasst
Config Portc.0 = Input                                      'Daten
Config Portc.1 = Input                                      'Takt

Portc = 1


Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portd , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6
'**********************Grafik*****************************************
Cls
Cursor Off
Wait 1
Locate 1 , 1 : Lcd "         Maschinenkoordinaten           "


  Circle(150 , 90) , 1 , 255
  Waitms 100


For X = 150 To 220
   Pset X , 90 , 255
   Waitms 10
Next
Line(215 , 87) -(220 , 90) , 255
Line(215 , 93) -(220 , 90) , 255
Locate 13 , 36 : Lcd "X"

For Y = 90 To 20 Step -1
   Pset 150 , Y , 255
   Waitms 10
Next
Line(147 , 25) -(150 , 20) , 255
Line(153 , 25) -(150 , 20) , 255
Locate 4 , 24 : Lcd "Z"

  X = 150
  Y = 90
For Z = 1 To 35
   Incr X
   Decr Y
    Pset X , Y , 255
   Waitms 15
Next
Line(178 , 59) -(185 , 55) , 255
Line(182 , 61) -(185 , 55) , 255
Locate 8 , 29 : Lcd "Y"


'********************************************************************************




Do


Shiftin Pinc.0 , Pinc.1 , M , 6 , 24                        'Auslesen der Datenleitung  1.ten 24 bit
M = 0                                                       'werden verworfen (enthalten wohl absolutwerte)
Shiftin Pinc.0 , Pinc.1 , M , 6 , 24                        'Auslesen 2.ten 24 bit

 Locate 16 , 1                                              'nur mal zur anzeige was gelesen wurde - hat mir beim berechnen sehr geholfen
  Lcd Bin(m)

 V = M                                                      ' da ich das Vorzeichen und den messwert seperat bearbeiten muss

Shift V , Right , 21                                        '22 bit enthält info über das vorzeichen, also schieben bis der messwert weg ist, v = 0 Positiver bereich und v = 1 negativer bereich
Shift M , Left , 11                                         'das Vorzeichen Bit muss weg , also 11 Schritte nach links schieben bis das "bit 21" am linken ende der long variable steht
Shift M , Right , 12                                        ' nun den Inhalt wieder Zurück schieben aber um 12 Stellen da das erste Bit nur die Info, 0 = mm bzw 1= inch= enthält


If V = 0 Then                                               ' ist v = 0 dann messwert positiv berechnen, der Messwert kommt als ganzzahl und muss für die kommastelle berechnet werden
 Mes = M / 100
 Else                                                       ' bei v = 1 mit negativen werten rechnen
 Mes = M / -100

 End If

Ergeb = Fusing(mes , "# . ##")                              ' festlegen des Ausgabeformates


Locate 4 , 1 : Lcd "  X = " ; Ergeb ; " mm       "          ' Ausgabe
Locate 6 , 1 : Lcd "  Y = " ; Ergeb ; " mm       "
Locate 8 , 1 : Lcd "  Z = " ; Ergeb ; " mm       "
Locate 10 , 1 : Lcd "  n = " ; Ergebn ; " U/min            "




Waitms 1

Loop
End
DSC01999.JPGDSC02000.jpg

Danke euch schon mal

Gruss Matthias
 
Zu Deiner eigentlichen Frage:
Du hast ohne führende Nullen bei unterschiedlich langen Zahlen (Zehnerpotenzen) halt letztendlich unterschiedlich lange Strings. Was mich in dem Zusammenhang noch stört, ist die Ausgabe der "mm " je als einzelner String - das wäre über eine einmal definierte, und mehrfach verwendete Konstante wesentlich speichereffizienter. Auch das X= usw hätte ich in dem Zuge je als Konstanten abgelegt. Das mußt Du als Maske ja nur einmal ausgeben (zumindest solange das Bild das anzeigen soll).
Für Die eigentlichen Werte mußt Du jetzt halt führende Leerzeichen und danach dein "gefustes" Ergebnis zusammensetzen, und das dann in die entsprechende Lücke schreiben lassen - den Text drumherum beeinflußt Du ja damit nicht.

Sei L die (von Dir vorgegebene) maximale Stringlänge für den zu schreibenden Ergebnisstring
Berechne L2 (Länge des gefusten Ergebnisstringes - da gibts in Bascom garantiert 'n Befehl für)
Ergebmitleerzeichen ein vorerst leerer String (='')
addiere in einer For-Schleife (von L2 bis L (da stimmt bestimmt wieder irgendwas mit den Indizees nicht)) die nötigen Leerzeichen in den Ergebmitleerzeichen
addiere den gefusten Ergebnisstring

Das Projekt interessiert mich, kannst Du noch was zur Hardware schreiben und/oder den angedeuteten anderen Thread verlinken?

LotadaC
 
Hallo LotadaC,

Danke für den kleinen einblick aber richtig verstanden hab ichs noch nicht, kenne mich mit den Strings nicht so aus, ich hatte mal ne Lösung wo abgefragt wird wieviele stellen Geschrieben werden müssen und zu jedem fall nen eigenen ausgabephat gemacht aber sehr umstänlich und unübersichtlich. Zu x y und z , das sind nur bytes mit denen ich die grafik erzeuge die in der freien hälfte des displays angezeigt wird hätte auch nen bild abspeichern können aber die linien bauen sich einer nach der anderen auf (eigentlich nur ne spielerei)

Wie gesagt mit den String Befehlen muss ich mich erst noch auseiandersetzen. Und die werte für "y" und "Z" vom MS werden später noch seperat ausgelesen , momentan wird ein MS gelesen und auf alle drei Ausgaben gelegt.

Es gibt Seiten da ist so einiges erklärt was Hardware angeht und die beschreibung der Protokolle haben halt nicht zu meinen Messschiebern gepasst. Die meisten Schieber liefern wohl ein 2*24bit in inch und da gibt es kein bit für vorzeichen sondern die 0 = 1677215
und darüber ergeben sich positive inch werte und darunter negative, aber siehe selbst:
http://www.svens-projekte.de/3.html


Hardware :
bildm.pngmess.png

das erste ist der Ist-Zustand meiner Schaltung(Display usw hab ich weggelassen und wie gesagt nur ein MS dran zum testen)
das zweite hab ich gefunden und zeigt das ich gar nicht so falsch lag mit meiner Schaltung

wenn das mit der Drehzahlmessung auch so gut geht werd ich eine Platine erstellen und Fräsen da kommt aber sicher nur ein Mega 8 drauf, bin aber am überlegen noch ein Tastenfeld anzuschliessen damit Offset werte eingegeben werden können

gruss Matthias
 
Hallo,


ich nochmal, das einzige was mir auf die schnelle eingefallen ist zur Problematik das der Anzeigewert wandert in abhängkeit von seiner grösse vor dem komma inkl. vorzeichen,


Code:
Ergeb = Fusing(mes , "# . ##")                              ' festlegen des Ausgabeformates

If Mes < -100 Then
Locate 4 , 1 : Lcd "  X = " ; Ergeb ; " mm"                 ' Ausgabe mit abfrage der stellen vor dem komma
Elseif Mes < -10 Then
Locate 4 , 1 : Lcd "  X =  " ; Ergeb ; " mm"
Elseif Mes < 0 Then
Locate 4 , 1 : Lcd "  X =   " ; Ergeb ; " mm"
Elseif Mes > 100 Then
Locate 4 , 1 : Lcd "  X =  " ; Ergeb ; " mm"
Elseif Mes > 10 Then
Locate 4 , 1 : Lcd "  X =   " ; Ergeb ; " mm"
Else
Locate 4 , 1 : Lcd "  X =    " ; Ergeb ; " mm"
End If

wie man sieht sehr unsauber aber es geht und frisst speicher,
so ein befehl "locate x , y + Rechtsbündig" gibs nicht oder? :D

gruss Matthias
 
Hallo,


Ich habe den Code noch einmal überarbeitet
- ausgelegt für 3 MS mit abfrage an PinA 0-2
- constanten vergeben für immer wiederkehrende ausgaben
- Ausgabe für alle Werte in einer Sub-R

Gelesen wird zum Test immernoch von einem MS aber eben drei mal, und ich muss sagen es geht langsam, ca. 1sec für alle drei Werte. Das liegt Wahrscheinlich an dem Sendezyklus des MS, leider hab ich noch keine möglichkeit den MS in den Fast-Modus zu bringen gefunden, alle anleitungen im Netzsind nicht auf meine Sorte MS übertragbar(leider)

Dann wie im Code zu sehen müsste ich im Stecker zwischen MS und Platine einen weiteren Pin belegen um eine Abfrage zu realisieren ob ein MS angeschlossen wurde oder nicht.
Gibt es eine möglichkeit die Auswahl zu treffen in dem man den jeweiligen Data- bzw Clock-Pin auf verkehr abfragt? Denn leider bewirkt "Shiftin......" das wenn keine Daten anliegen also wenn nichts angeschlossen ist, dort verweilt und wartet. Es muss also eine Abfrage her die diesen Befehl ("Shiftin...") umgeht wenn keine Daten anliegen.

Und zurückblickend auf die Zeit für die Abarbeitung der DO-LOOP (ca. 1sec) mach ich mir sorgen um meine Frequensmessung bzw. Drehzahlerfassung.
Oder kann man da ohne bedenken mal eben nen Timer ansprechen, den der Takt(8MHz) ist ja relativ hoch und die meiste Zeit geht wahrscheinlich beim Auslesen drauf.
Kann mir nicht vorstellen das durch so etwas simples der Ganze Mega ausgelastet ist.

Für ein paar Tips wäre ich echt Dankbar

Code:
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'$baud = 38400
'$sim

Const Xa = " X = "
Const Ya = " Y = "
Const Za = " Z = "
Const E = " mm    "
Const F = "nicht Belegt"
Dim A As String * 5
Dim Zeile As Byte
Dim S As Byte
Dim Z As Byte
Dim X As Byte
Dim Y As Byte
Dim M As Long
Dim V As Long
Dim Mes As Single
Dim Ergeb As String * 6
Dim Ergebn As Integer
Ergebn = 0                                                  ' wert für drehzahl _  wird noch nicht erfasst
Ddrc = 0
Portc = &HFF
Ddra = 0
Porta = &HFF

Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portd , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6


'**********************Grafik*****************************************
Cls
Cursor Off
Wait 1
Locate 1 , 1 : Lcd "         Maschinenkoordinaten           "

For X = 150 To 220
   Pset X , 90 , 255
   Waitms 10
Next
Line(215 , 87) -(220 , 90) , 255
Line(215 , 93) -(220 , 90) , 255
Locate 13 , 36 : Lcd "X"

For Y = 90 To 20 Step -1
   Pset 150 , Y , 255
   Waitms 10
Next
Line(147 , 25) -(150 , 20) , 255
Line(153 , 25) -(150 , 20) , 255
Locate 4 , 27 : Lcd "Z"

  X = 150
  Y = 90
For Z = 1 To 35
   Incr X
   Decr Y
    Pset X , Y , 255
   Waitms 15
Next
Line(178 , 59) -(185 , 55) , 255
Line(182 , 61) -(185 , 55) , 255
Locate 8 , 32 : Lcd "Y"

'********************************************************************************




Do



 If Pina.0 = 0 Then                                         'Abfrage ob Messschieber vorhanden
  Shiftin Pinc.2 , Pinc.3 , M , 6 , 24                      'Auslesen 24 bit    (bei dieser sorte MS reicht einmal auslesen, es werden nur relative werte gesendet)
    Zeile = 4                                               'zeile für Ausgabe
    A = Xa                                                  'constante xa für Ausgabe
  Gosub Berechnung
  Gosub Ausgabe
 Else
  Locate 4 , 1 : Lcd Xa ; F
 End If

 If Pina.1 = 0 Then
  Shiftin Pinc.2 , Pinc.3 , M , 6 , 24
    Zeile = 6
    A = Ya
  Gosub Berechnung
  Gosub Ausgabe
 Else
  Locate 6 , 1 : Lcd Ya ; F
 End If

 If Pina.2 = 0 Then
  Shiftin Pinc.2 , Pinc.3 , M , 6 , 24
    Zeile = 8
    A = Za
  Gosub Berechnung
  Gosub Ausgabe
 Else
  Locate 8 , 1 : Lcd Za ; F
 End If

  Locate 10 , 1 : Lcd " n =       " ; Ergebn ; " U/min  "


 Loop
End
Berechnung:

  V = M                                                     ' da ich das Vorzeichen und den messwert seperat bearbeiten muss
  Shift V , Right , 21                                      '22 bit enthält info über das vorzeichen, also schieben bis der messwert weg ist, v = 0 Positiver bereich und v = 1 negativer bereich
  Shift M , Left , 11                                       'das Vorzeichen Bit muss weg , also 11 Schritte nach links schieben bis das "bit 21" am linken ende der long variable steht
  Shift M , Right , 12                                      ' nun den Inhalt wieder Zurück schieben aber um 12 Stellen da das erste Bit nur die Info, 0 = mm bzw 1= inch= enthält

  If V = 0 Then                                             ' ist v = 0 dann messwert positiv berechnen, der Messwert kommt als ganzzahl und muss für die kommastelle berechnet werden
   Mes = M / 100
  Else                                                      ' bei v = 1 mit negativen werten rechnen
   Mes = M / -100
  End If
   Ergeb = Fusing(mes , "# . ##")
Return

Ausgabe:

 If Mes < -100 Then
  Locate Zeile , 1 : Lcd A ; Ergeb ; E                      ' Ausgabe
 Elseif Mes < -10 Then                                      ' auswertung der Potenz mit und ohne vorzeichen
  Locate Zeile , 1 : Lcd A ; " " ; Ergeb ; E                'damit die anzeige vom einer bis zur masseinheit fix ist
 Elseif Mes < 0 Then
  Locate Zeile , 1 : Lcd A ; "  " ; Ergeb ; E
 Elseif Mes > 100 Then
  Locate Zeile , 1 : Lcd A ; " " ; Ergeb ; E
 Elseif Mes > 10 Then
  Locate Zeile , 1 : Lcd A ; "  " ; Ergeb ; E
 Else
  Locate Zeile , 1 : Lcd A ; "   " ; Ergeb ; E
 End If
Return

Gruss Matthias
 
Bitte bestätigen:
-Kommunikation geht quasi über ein SPI, wobei der MS der Master ist (er bedient die clock) - ausserdem nur in eine Richtung
-es werden 3 Bytes (24bit - also ein 3-Byte-Wort) übertragen

Hinweise:
-die meiste Zeit in einem loop-Durchlauf werden die Displayausgaben kosten
-statt der Shifterei solltest Du versuchen, das "Vorzeichenbit" direkt auszuwerten/zu manipulieren (in Assembler kein Thema, in Bascom könnte man abfragen, ob "die Zahl" kleiner als die Bitwertigkeit des Vorzeichenbits ist (dann pos, sonst neg) - wenns neg ist, kannst Du einfach die Bitwertigkeit von der Zahl abziehen, um den Betrag zu bilden - stell Dir das einfach mal Binär vor...
-wie fit bist Du betreffend Interrupts und Hardware-SPI? Gehe die entsprechenden Abschnitte imDatenblatt des Controllers mal ein paar mal durch, und Frage dann nochmal - insgesamt könnte da einiges einfacher werden, zumindest "flüssiger" im Programm.
 
Hallo Lotadac,


was genau der MS sendet kann ich dir nicht sagen ich wusste nur das es 24 bit sein sollen, und mit Shiftin eingelesen hat es dann auch sofort geklappt darum hab ich´s nicht weiter hinterfragt, wie gesagt es gibt wohl viele Protokolle und meines ist wohl kein Standart. Das Standart wäre wohl 2*24 Bit wovon das erste verworfen wird da es , so hab ich gelesen, nur absolutwerte enthält. Was ich mir auch nicht erklären kann ist die Tatsache das der Mega16 immer den anfang erwischt und nicht anfängt mitten im gerade gesendeten 24 Bit strang anfängt.

Am besten, so hab ichs auch begonnen, Signal einlesen und Binär ausgeben dann sieht man schön was Passiert wenn man am MS rumschiebt. :D

Jaaa also ganz so fit bin ich leider noch nicht was Timer usw. angeht aber durch solche Projekte versuche ich mich weiter zu bringen.

Die Display ausgabe hatte ich zwischenzeitlich auch mal ohne abfrage der Zehnerpotenzen gemacht was mir Zeitlich keinen vorteil verschaffte, es bleibt bei 1sec.
Ich bin langsam überzeugt das es die langsame Datenübertragung ist, den im Normalmodus senden die MS , so hab ich gelesen, alle 300ms die Daten, wenn man einen MS hat den man auf Fastmode stellen kann gibt es wohl alle 20ms Werte.

Das mit dem "Schiften" um das Vorzeichen zu separieren ist mir auch ein Dorn im Auge und war auch eine meiner Fragen im ersten Post. Wie gesagt hatte ich so etwas wie "NBit" ausprobiert aber das ging nicht. Aber jetzt wo du es sagst, ich hatte ja die ganze Zeit den Bin 24Bit mit auf dem Display, könnte ich ja den wert einfach wegsubtrahieren und das vorzeichen über ein if gösser als herausholen ---- Probier ich gleich mal. Obwohl ich überzeugt bin das man aus der Longvariable auch einzelne Bits auslesen bzw. ändern können müsste.


ASM bin ich auch am lernen aber das liebt noch weiter fern wie Bascom, hab zu viele Hobbys dadurch gehts hier langsamer vorran.

Danke gruss Matthias
 
Gab es da nicht irgendwie die möglichkeit eine Variable "AND" oder "Nand" zu verknüpfen um einzelne Bits zu Filtern. Weiss aber nicht mehr wie das ging.
Das wäre dann auch eleganter und nimmt sicher weniger Zeit und Speicher in anspruch.

Wie ist das eigentlich mit dem Befehl Gosub.

Ich habe meine beiden Sub´s jetzt zusammen gefasst weil sie eh immer nacheinander angesprungen werden das sollte auch etwas Zeit sparen, weil Bascom ja glaub ich immer alle Register rettet oder?





Edit:

so ich habs bis auf einmal um eine stelle schieben geschafft mit einfacher Subtrahtion des Dezimalen Wertes des Vorzeichen-Bit´s (mit xorginge es auch)

Code:
'alt  'V = M                                                   
'alt ' Shift V , Right , 21                                      
'alt ' Shift M , Left , 11


                                       
  Shift M , Right , 1                                        '  den Inhalt 1 Stelle nach rechts da das erste Bit nur die Info, 0 = mm bzw 1= inch= enthält

  If M < 1048576 Then                                       ' ist  M < 1048576 (wertigkeit des 21.ten Bit´s) dann messwert positiv berechnen, der Messwert kommt als ganzzahl und muss für die kommastelle berechnet werden
   Mes = M / 100
  Else                                                      ' bei M > 1048576 diesen wert abziehen und mit negativen wert berechnen
   M = M - 1048576
   Mes = M / -100
  End If

Aber schneller wird das Auslesen auch dadurch nicht.


Gruss Matthias
 
Hallo,

@Lotadac

Sorry hatte da vorhin etwas überlesen, das mit dem SPI, ich denke das heisst sowas wie Serial Pin oder?

ich denke das der MS alle 300ms auf Clock anfängt zu Takten und dann auch auf Data die Daten schickt.

Shiftin PINC.0 , PINC.1 , M , 6 , 24

Pinc.0 steht für den DatenPin
Pinc.1 für den Clock
M ist die Long variable die gefüllt wird
6 – LSB shifted in first when clock goes high with ext. clock (steht so in der Bascomhilfe)
24 ist die anzahl der Bit´s




Kann mir einer veraten warum mein Glcd nix mehr anzeigt sobald ich im Codekopf eine Baudrate angebe $baud = xxxxx ???(egal welche rate)



gruss Matthias
 
Ich weiß nicht, ob dann der HW-UART gleich mit scharf gemacht wird - jedenfalls verwendest Du für das Display D0 und D1 als I/O-Pins. Diese können auch auf das HW-UART geschaltet werden - dann bleiben die I/O-Instruktionen wirkungslos (der Pin ist vom I/O abgeklemmt, und ans UART angeklemmt). Stichwort fürs Datenblatt: I/O-Ports und alternate Port functions...
SPI ist das Serial Peripherial Interface. Verbinden kann man damit (gleichzeitig) 2 Devices. 1 Master, 1 Slave. Der Master bedient die Clock. Master und Slave besitzen je ein (8bit) Datenregister. Desweiteren eine oder 2 Leitungen für die Daten. Bei jedem Clock-Impuls (welche Flanke kann man enstellen, genauso wie, ob mit dem MSB oder dem LSB angefangen werden soll) schieben Master und Slave ein Bit über die Datenleitungen zum anderen Device. Nach 8 Clocks sind die Register Quasi geswappt.
Bei Dir emuliert Bascom sowas in Software (also dein Programm macht das - der Controller kann das aber in Hardware komplett im Hintergrund selbst).
Schau Dir mal das Datenblatt des Controllers an - SPI.
Benutzt werden bei SPI 3 Leitungen:
-Clock - Damit gibt der Master dem Slave vor, wann synchron ein Bit geschoben werden soll
-Mosi - Master Out Slave In, klar - hier fließen die Daten vom Master zum Slave
-Miso - Master In Slave Out - alles klar?
- wenn ein Master mit mehreren Slaves (abwechselnd) kommunizieren können soll, muß dieser ausgewählt werden - dazu haben die Slaves üblicherweise low-aktive ChipSelect-Eingänge

Im Atmel kannst Du den HW-SPI wie gesagt im Hintergrund laufen lassen, und ihn anweisen sich erst zu melden, wenn ein ganzes Byte "empfangen" wurde - allerdings mußt Du das 24bit-Wort dann selbst aus den 3 Bytes zusammensetzen. Hier kannst Du aber gleich des Vorzeichen-Problem erschlagen.

Beschäftige Dich mal mit der Hardware der Controller - Bei Hochsprachen wie Bascom besteht das Risiko, daß man überhaupt nicht mitbekommt, was die Controller einem Da zu bieten haben. Man kann eben mal schnell irgendein Init oder so einbauen, ohne zu wissen, daß da ein Riesenbatzen Code miterzeugt wird, den man genausogut mit ein paar Zeilen Code durch die Hardware erledigen lassen kann.
 
Guten Morgen,

Also wird mit $baud die datenrate für den HW-Uart festgelegt die auf PinD.0 RxD und Pind.1 TxD fix ist. Nicht das ich es jetzt gebraucht hatte aber mir ist das schon aufgefallen wie ich den Mega und das Glcd als Oszillograph verwendet hatte.

Datenblätter Wälz ich fast jeden Tag aber es geht langsam vorran.

Mal grob übersetzt meinst du ich könnte die Abfrage der 3 MS im hintergrund auch "Parallel" ablaufen lassen.
Das ein Master einen Slave anspricht ihn Daten zu senden das kenn ich auch aber in dem fall sind ja die drei MS die Master da sie auf keinen Befehl zum senden warten sondern immer munter senden.

Ok nun muss ich mir das Mal anschauen mit dem SPI, so langsam bekomme ich das gefühl das Bascom ausgenommen für Displays und Tastermatrix sonst nichts gescheites ist und ich mich besser auf Assambler konzentrieren sollte.


Gruss Matthias
 
Bei shiftin macht das Programm das komplett. Insbesondere "wartet" also alles, bis die kompletten 24bit (hier im Bsp) reingeschoben sind. Dafür kannst Du aber auch beliebige Bitlängen schieben. Der Hardware-SPI kann halt nur je 8bit - dafür macht der diese aber selbständig in einem Rutsch. Und er meldet sich via Interrupt-Anforderungsflag (an den man halt auch einen Interrupt binden kann) zurück. Allerdings mußt Du Dich dann um das sortieren der eintrudelnden Bytes kümmern.
Vom Master aus gesehen läuft as in etwa so ab:
-man konfiguriert die Hardware-SPI-Schnittstelle
-man schreibt das zu sendende Byte in das SPI-Datenregister
sofort beginnt der Master das Byte herauszuschieben, gleichzeitigwird das entsprechende Byte des Slave hereingeschoben,
währenddessen macht Dein Programm mit den nächsten Instruktionen weiter.
Irgendwann, wenn das SPI mit dem Byte fertig ist, wird das IRQ-Flag gesetzt, und ggf der Interrupt ausgeführt (also dann das Programm unterbrochen, und die entsprechende ISR ausgeführt.)
Danach macht das Programm dort weiter, wo der Interrupt zugeschlagen hat.

Jetzt noch ein potentielles Mißverständnis ausräumen:
Man kann mit Bascom natürlich auch (weitgehend) die Hardware nutzen (siehe hier konkret "config SPI" in der Bascom Hilfe), man selbst beschäftigt sich halt nur nicht mehr mit dem was dahinter steckt - für den Programmierer machts ggf keinen großen Unterschied ob er was in HW oder SW macht. Ggf lernt man die HW gar nicht kennen. (Und man wundert sich, warum der Flash ratzfatz voll ist, und das Programm "so langsam läuft").
Trotzdem gibt es so einige Einschränkungen bei den HW-Inits mit Bascom. Weil halt nicht alle Möglichkeiten unterstützt werden können (aufgrund der Fülle der unterschiedlichen Funktionen der unterschiedlichen Controller)- trotzdem kann man die aber nutzen.
Was macht denn so ein Init? Es initialisiert (im wesentlichen) die Hardware. Und wie geschieht das? Indem die entsprechenden Bytes in die entsprechenden I/O-Register der Hardware geschrieben werden. Und wenn jetzt der Bascom-Init-Befehl irgendein "exotisches" Register nicht kennt, und deswegen diesen Spezialfall nicht einstellen kann? Dann kannst Du selbst das Register immer noch selbst per Hand setzen.
Den ADC kann man zB zu einer Konversion anstupsen. Bascom macht das mit "getadc" oder so. Dann wird einmal gewandelt. Wenn er fertig ist setzt er wieder ein Interrupt-Anforderungsflag (das man pollen kann, oder halt einen IRQ dranbinden). Je nach Controller kann man den ADC aber auch automatisch starten lassen (zB direkt an das ADC IRQ-Flag - dann läuft der ADC quasi kontinuierlich). Da gibts natürlich Fälle, die Bascom noch nicht kennt - trotzdem kann man diese einstellen, indem man das entsprechende ADC-Steuerregister selbst manipuliert.

Edit zur Baudrate:
1. irgendwo in den Options ist eine Baudrate vorgegeben. Sofern irgendwo im Programm der HW-UART verwendet wird (print etc.), wird beim compilieren natürlich mit diesem Wert die Baudrate eingestellt, AUßER:
2. es taucht im Programm "$BAUD=xyz" auf -> dann wird bei der Init des UART statt der Vorgabe in den Options xyz als Baudrate verwendet (das "$" weist auf eine Compiler-Direktive hin)
3. um irgendwo im laufenden Programm (also während der Laufzeit) die Baudrate zu ändern, wird "baud=abc" verwendet - dadurch werden dann nur die UartBaudRateRegister (UBRR) umgeschrieben, und zwar genau an der Stelle im Programm (bis dahin war sie "xyz", jetzt ist sie "abc") - ist ja eine Instruktion und keine Direktive)
 
Hallo,


Danke Lotadac,

Also den groben ablauf verstehe ich ja von SPI aber ich müsste es ja so einrichten können das der MC eine Pause des MS erkennt und wenn der MS wieder anfängt zu senden das erst Byte lesen und danach sofost das zweite und dritte, sonnst geht es ja verloren und ich hab nur die hälfte der daten. Vielleicht hast du es ja oben auch schon so geschrieben aber mit diesen Fachgesimple kann ich noch nichts anfangen(nicht böse gemeint :D) , hier ein Flag und da ein Flag usw. .

Ich verstehe auch immer noch nicht:
Vom Master aus gesehen läuft as in etwa so ab:
-man konfiguriert die Hardware-SPI-Schnittstelle
-man schreibt das zu sendende Byte in das SPI-Datenregister
sofort beginnt der Master das Byte herauszuschieben, gleichzeitigwird das entsprechende Byte des Slave hereingeschoben,
währenddessen macht Dein Programm mit den nächsten Instruktionen weiter.

Ich kann ja den Master nicht beeinflussen!!! Ich hab doch nur den MC als Slave. Oder??? Ich kann nix auf den MS-Controller schreiben um eine Bedingung auszuhandeln. Der sendet einfach nur Blind seine Daten, also da kann der MC hoch und runterspringen das interessiert dem Messschieber nicht.

Ich hab jetzt schon viele Artikel gelesen über das Master Slave verhalten, zwei MC untereinander und auch MC und andere Hardware. Aber ich verstehe nicht wie der MC als Master meinem MS ein Befehl zur Daten übertragung geben soll wenn der "Taub" ist und nur "Sprechen" kann.

ich werde erstmal ein bissel was ausprobieren in sachen SPI,

Kurz zum verständnis:

ich habe ja die möglichkeit eine Datenübertragung ausgelöst durch einen ext. Int zu empfangen (damit kann ich also die Clockleitung überwachen) und in einer ISR meine Daten holen die 24 Bit z.B.
da ein Mega 8 nur zwei ext. INT Eingänge hat oder ein M16 nur 3 könnte ich sicher auch andere I/O Pin´s nehmen und sie intern auf ein INT schalten richtig?

Dann müsste ich ja in der lage sein die 3 Clockleitungen (MS 1-3) zu überwachen und wenn ein MS anfängt zu senden in eine ISR springen Pin zuweisen von dem jetzt Daten kommen und die in eine Variable geladen werden sollen,

ist dann die ISR so lange beschäftigt bis die Daten komplet sind oder komm ich vorher schon aus der ISR um die anderen eingänge weiter zu überwachen?

Oder hab ich da jetzt Grundlegend eine falsche vorstellung( wie gesagt ich arbeite mich auch Parallel zum Posten hier durch die Datenblätter aber mangels Englischkentnisse dauert es halt)


Edit:
hab jetzt ne super Seite gefunden die mir in sachen Hardware und Assambler etwas auf die Sprünge hilft. :D
http://www.weigu.lu/a/index.html
Danke für deine , eure Gedult :)

Gruss Matthias
 
...das der MC eine Pause des MS erkennt und wenn der MS wieder anfängt zu senden das erst Byte lesen und danach sofost das zweite und dritte, sonnst geht es ja verloren und ich hab nur die hälfte der daten. Vielleicht hast du es ja oben auch schon so geschrieben aber mit diesen Fachgesimple kann ich noch nichts anfangen(nicht böse gemeint :D) , hier ein Flag und da ein Flag usw...
Vorweg was zu den Flags und so:
Für die ganzen Hardware-Sachen, die in dem Controller so stecken gibts alle möglichen Flags - so zB für alles, was einen Interrupt auslösen können soll halt ein Interruptanforderungsflag. Wenn zB der ADC eine Konversion fertig hat, geht automatisch das "ADC-hat-fertig-Flag" (ADIF) high. Wenn man also wissen will, ob/wann der ADC fertig ist, könnte man dieses Flag pollen (in mehr oder regelmäßigen Abständen schauen, ob es gesetzt ist).
Oder man aktiviert den entsprechenden Interrupt, der genau an dieses Flag gekoppelt ist (und die Interrupts global) auch dafür müssen bestimmte Bits in bestimmten I/O-Registern gesetzt/löscht werden -> Datenblatt).
Wenn dann das Interrupt-Anforderungsflag (irgendwo im Programm - das lief ja im Vordergrund weiter) high geht, wird der laufende Befehl noch abgearbeitet, danach wird automatisch der Programmcounter (Rücksprungadresse) gepusht (Stack), und der entsprechende Interruptvektor angesprungen. Da wiederum steht dann üblicherweise ein Sprungbefehl in die entsprechende ISR. Dort wirrd auf den Interrupt reagiert, und dann mit RETI der Sprung zurück ins unterbrochene Programm (Adresse vom Stack) organisiert, unddie Interrupts global wieder freigegeben.
In Bascom Bascom erledigst Du das halt mit ein paar Zeilen Code...
Zur Pause:
Wie lang ist die denn so? Und wie lange dauert das senden der 24bit? Welchen Zustand hat die Clock-Leitung in der Pause? Man könnte zB den SPI im Controller erstmal auslassen, und abwarten, bis die Clock Leitung lange genug diesen Zustand hat (zB indem man einen Timer bei jedem Flankenwechsel resettet, in der Pause kann er überlaufen, und im entsprechenden Überlauf-IRQ den HW-SPI scharfmachen und sich selbst stoppen.
In der SPI-ISR muß dann das Ergebnis zusammengesetzt, und die nächste Pausendetektion bzw die Umschalterei der MS vorbereitet werden -> allerdings geht das nicht so, wie Du Dir das wohl vorstellst - später...
...Ich kann ja den Master nicht beeinflussen!!! Ich hab doch nur den MC als Slave. Oder??? Ich kann nix auf den MS-Controller schreiben um eine Bedingung auszuhandeln. Der sendet einfach nur Blind seine Daten, also da kann der MC hoch und runterspringen das interessiert dem Messschieber nicht...
Ist klar, der MS ist der Master, und es gibt keine Miso-Leitung. War von mir nur zur Erklärung gedacht gewesen, aber Du hast ja geschrieben, daß Dir das mehr oder weniger klar ist.
...da ein Mega 8 nur zwei ext. INT Eingänge hat oder ein M16 nur 3 könnte ich sicher auch andere I/O Pin´s nehmen und sie intern auf ein INT schalten richtig?...
Nein, der Mega8 hat genau 2 (eterne) Pins, die einen Interrupt auslösen können. Es gibt aber auch noch ein paar Tricks, mit denen man weiter externe IRQ bekommen kann (der analog-Comperator zB, oder ein als Counter verwendeter Timer. Diese Hardware-Funktionen sind aber immer an bestimmte Pins gebunden. Beim Mega16 mag ich jetzt nicht noch nachschlagen, da wird ähnlich sein.
Jetzt kommt das große ABER:
Vor längerer Zeit wurde diese Generation der Megas durch eine neuere ersetzt. Der Nachfolger des ATmega8 ist der ATmega88. Pinkompatibel, aber mit einigen Veränderungen bei den I/O-Registern - er bietet nämlich bedeutend mehr Möglichkeiten bei seiner Internen Hardware. U.a. kann jeder Pin einen so genannten Pin Change Interrupt auslösen.
...Dann müsste ich ja in der lage sein die 3 Clockleitungen (MS 1-3) zu überwachen und wenn ein MS anfängt zu senden in eine ISR springen Pin zuweisen von dem jetzt Daten kommen und die in eine Variable geladen werden sollen,...
Nein, siehe oben - zumindest nicht mit Hardware-SPI, da sind die PINs ja durch die eine Schnittstelle vorgegeben. Dann vielleicht doch mit SW shiftin.
...ist dann die ISR so lange beschäftigt bis die Daten komplet sind oder komm ich vorher schon aus der ISR um die anderen eingänge weiter zu überwachen?...
kommt drauf an wie Du das machst:
wenn Du in der ISR shiftin nutzt, wartest Du in der ISR. insbesondere sind auch andere Interrupts blockiert.
wenn Du den HW-SPI oder so scharf machst, kann die ISR gleich wieder beendet werden, da der SPI sich ja mit'nem eigenen IRQ zurückmeldet
wenn Du in der ISR nur irgendeinen Status umschaltest (Flag), kannst Du ins Programm zurückspringen und auf den Status reagieren, aber shiftin wartet dann ja trotzdem im Hauptprogramm
...hab jetzt ne super Seite gefunden die mir in sachen Hardware und Assambler etwas auf die Sprünge hilft...
Ich fand den hier gut.
 
Hallo zusammen,

also ich würde das über nen Interrupt-Pin für jeden Takt der einzelnen Meßschieber/Glaslineale/... machen und dann zum Interruptzeitpunkt die zugehörige Datenleitung einfach auslesen (samplen). Das ist wesentlich universeller als dieses ShiftIn oder SPI. Vor allem weil du sonst alles umbauen mußt wenn du mal einen MS mit nem anderen Protokoll hast weil der alte hin war.

Aber mal nen Tip ... sie dir doch mal den Thread an ...
Peters CNCECKE
> Maschineneigenbau / Maschinenumbau / Bauanleitungen / Schaltpläne / Modellbau
>> Meßtechnik und Steuerungseigenbauten
>>> Mess-Anzeige für Messschieber

du mußt dich allerdings vorher anmelden um um ins CNC-Forum zu kommen.
Hier ist die Webseite von dem der das baut ... http://www.arasal.de
Eventuell bringt es dir ja einiges für dein eigenes Projekt.
Es ist zwar mit nem PIC realisiert aber was solls. Programm ist Programm und die Funktionsweise kann man ja mit nem AVR nachbauen ;)

Gruß
Dino
 
Hi,


ja so langsam komme ich dahinter Danke Lotadac.

Wenn ich eine abfrage starte und in eine ISR gehe wollte ich eigentlich kein shift in mehr benutzen das bringt mir ja kein vorteil wenn ich den langsamen warten weg mit noch mehr code ausschmücke.

Ich dachte so an > ende einer Pause auf der Clockleitung erkannt - in ISR springen und von der zu der Clockleitung gehörenden Datenleitung lesen (SPI?) - danach wieder im Hauptprogramm weiter überwachen ob ein anderer MS zu senden anfängt - sobald die 8 bit geladen wurden und im SPSR SPIF 1 ist wird im SPCR mit SPIE ein IRQ ausgelöst und wieder in die ISR und das zweite byte laden usw. (fraglich ob das zeitlich funktioniert)

anschliessend die drei Bytes zusammen setzen und auswerten

leider kenne ich die Timings von dem MS nicht und hab auch keine möglich keit sie zu messen, wenn ich aber von dem Standart 2*24Bit Protokoll ausgehe müsste es so aussehen:

2*24 Bit sind ca. 850µs die Daten werden gelesen wen Clock von H auf L geht
Clock fängt mit einem ca 53µs langen H an und Toggelt dann mit ca. 13 µs
Quelle :http://www.yadro.de/digital-messleiste/protokoll.html#a2

Hmmm hab mir noch gar nicht angeschaut was die Mega8 nachfolger so können, werd ich gleich mal machen, aber ich muss allgemein meine kenntnisse noch verbessern.

Danke für den Tip die seite ist auch gut (y)

Gruss Matthias
 
Hi dino,

Danke für den Tip, da bin ich gemeldet muss ich mal hin schauen.

Wie zu anfang beschrieben Funktioniert es ja Tadelos bis auf die Tatsache das alle 3 Werte ca. ne sekunde brauchen, wollt es noch ein bissel aufpeppen. Und jetzt wo ich mir soweit alles erarbeitet hab möchte ich auch nix mehr nachbauen von anderen.
Und mit Pic´s werd ich erstmal gar nix anfangen können wenn ich noch immer beim AVR hänge :D

Also du meinst mit jeder fallenden Flanke Clock einen Interupt auslösen und dann das eine Bit lesenund beispielsweise in eine Longvar schieben? Dann muss ich mir aber nen anderen AVR nehmen, hatte eigentlich vor nen Tiny2313 oder nen Mega8 zu nehmen.
Weil ich fand das jetzt nicht so ne wahnsinig grosse "Nummer" das man da gleich nen Mega64 oder 128 brauch der 8 ext INT hat

gruss Matthias
 
ich nochmal,


Hab mir gerade die geschichte mit den PICs angeschaut, bei der CNC-Ecke.

Daran hatte ich auch schon gedacht für jeden MS ein AVR zu nehmen(denn das auslesen von nur einem MS geht recht schnell) da würde ja ein ganz kleiner reichen pro Kanal und ein etwas grösserer nimmt von den kleinen die Daten entgegen und gibt sie aufs Glcd, das würde dann auch super mit der SPI funktionieren da ich dann ein Master und 3-4 Slaves hätte.

Könnte ich dann nicht ein AVR nehmen als "zusätzlichen Displaycontroller" der Z.B. Daten von PIN x y auf Zeile 2, Daten von Pin x1 y1 auf Zeile 4 usw. schreibt. Nur son gedanke.


Gute Nacht

Matthias
 
hallo,

Prinzipiell hat Dino recht - ich bin gestern (nacht;)) auch noch gedanklch in diese Richtung gegangen...
Du willst aber 3 MS auslesen, die quasi gleichzeitig senden können. Ich habe da eine Lösung im Hinterkopf, die allerdings auf dem PinChangeInterrupt basiert. Allerdings muß ich erstmal mit den timings schauen.
Zum Mega88: der unterscheidet sich vom Mega48 und Mega168 praktisch nur durch seine Speichergröße, kannst also auch nach dem 168er schauen (ist eh ein Datenblatt).
Inzwischen gibt es eine Überarbeitung dieser Generation: ATmega88P/A/PA - natürlich auch in den anderen Varianten - so langsam wirds unübersichtlich. Noch haben Reichelt & co die aber nicht im Angebot...

Wenn Du die Daten nur anzeigen lassen willst, kannst Du auch einen kleinen µC pro MS verwenden, klar. Aber dann hat der entweder auch ein eigenes "Display" (gemultiplexte Siebensegmentanzeigen), oder aber Du brauchst einen weiteren µC für das Display. dieser schlägt sich dann auch wieder mit dem Problem der 3 Dateneingänge herum - ok, jetzt kannst Du aber die Konfiguration vorgeben.
Hmm... hätte auch was für sich. Die jeweiligen MS-Controller lesen permanent "ihren" jeweiligen MS aus (und bereiten die Daten ggf gleich noch auf) und merken sich diese. Der Display-Controller kann über einen geeigneten Bus (TWI ? oder doch noch SPI ?) jeden beliebigen MS-Controller ansprechen, und die letzten Resultate anfordern. Über TWI könntest Du dann bis zu 127 (?) MS anklemmen - oder irgendwas anderes, da war ja nochwas mit der Drehzahl.
Achso, ggf sollte man den Slaves noch die Möglichkeit geben, sich beim "Master of the display" aktiv zu melden - da das aber mit separaten Leitungen zuviele Pins am Master werden vielleicht folgenden Kompromiss: Alle Slaves benutzen dasselbe "HabWasNeues"-Netz. Tristate. Der Master zieht es über Seinen Pullup hoch. Jeder Slave kann jetzt den Master auf "was neues" aufmerksam machen. Dazu wartet er, bis das Netz high ist, und zieht es dann low. Wenn der Master ein low auf dem Netz erkennt, muß er abfragen, was es neues gibt -> leider bei allen Slaves.
Edit: Hmm... TWI ist vielleicht zu störanfällig - kommt drauf an, wieweit die Slaves vom Master entfernt sein sollen, und was da an Elektrosmog in der Gegend ist - mit Deinen 4 Slaves läßt sich sicher mit SPI auch noch ein ordentlicher Bus aufbauen, und die !CS als Melder verwenden.
 
Guten Morgen,

Das hört sich gut an, wegen der Leitungslänge mach ich mir keine Sorgen, zum einen ist alles auf einer Platine zumindest die AVR´s und das Display eventuell werde ich die OAP´s in die MS bzw in der nähe der MS bauen aber auch nur wenn es nötig ist. Sollte es Störungen geben durch was auch immer kann ich immer noch ein Metallgehäuse fräsen und die schaltung abschirmen.

Ich könnte auch ein ganzes Byte zum Controller senden, also einen ganzen Port mit "einem" Takt übergeben, So macht es der Kolege in der CNC-Ecke.

Mal davon abgesehen wenn eine der Cnc-fräsen in Betrieb ist (deren Endstufen, Motore und die Leitungen dazwischen sind wirklich enorm Störend - im Umreis von nem paar Metern ist da kein Radioempfang mehr möglich) brauche ich das Display nicht. Ich will es an der kleinen selbstgebauten Mini CNC-fräse nutzen wenn ich mit ihr per Hand fräse also per Kurbel(Kreutztisch und so), wenn ich sie per Software betreibe habe ich ja den verfahrweg am Monitor und wenn die Schrittmotore keine Schritte ( und wenn sie richtig ausgelegt und Parametriert sind tun sie das nie!!! ) verlieren ist die abweichung von der Displayanzeige zum real verfahrenden weg kleiner als der Messfehler eines Messschiebers < 2/100.

So werd jetzt mal schauen was mit nem Tiny 15 zum auslesen machbar ist und wenn mir das Datenblatt zusagt werd ich sie bestellen.
´
edit:

Attiny 15 gibs nicht Schreibfehler, bin jetzt alle! Daten der Atmel reihen durch und werde wohl den Attiny 4 zum auslesen nehmen und mit 6 pins ist der gar noch kleiner wie die OAP´s davor :D.
Muss halt nur schauen ob ich mit die 512 Byte auskomme aber nur das auslesen und eventuell berechnen sollte sich ausgehen.

zur Programmierung , kann man alle gleichzeitig Programmieren oder muss ich nachher auf meiner Platine x SPI- Schnittstellen vorsehen?

Allgemein ist mir auch aufgefallen das wenn es um viele ext INT geht die Attiny reihen besser sind, da alle I/O Pin´s auch extINT sind ausser beim Attiny26

Quelle:http://www.mikrocontroller.net/articles/AVR_Typen

gruss Matthias
 

Ü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)