C Attiny13a TSR-Programm AD-Abfrage und Ausgabe

flecralf

Mitglied
25. Juli 2013
194
2
18
Sprachen
  1. ANSI C
Keine passende Kategorie gefunden, bei Bedarf bitte entsprechend verschieben. Danke 1

Moin moin,
die 7-Segment-Anzeige funktioniert jetzt, aber eher bescheiden. (etwas bequemeres muß her)
Jetzt versuche ich einen über den ad-Wandler eingelesenen Wert an die Anzeige weiterzugeben.
Das Problem ist, dass die Abfrage des ad-Wandler das Programm so stark ausbremst dass die Ziffern
unlesbar erscheinen.
Wäre es möglich die ad-Abfrage als Hintergrundprogramm laufen zu lassen ?
Die Ausgaberoutine greift nach Bedarf auf die Variable mit dem Spannungswert zu.
So wie der Maustreiber beim Dos-Programm.
Ich glaube bei der PWM läuft das nach diesem Prinzip, oder ?

War so meine Idee.
Zweifel komme mir ob des Speichers des attiny13 auf. Zu klein ?

Gruß
Ralf
 
Keine passende Kategorie gefunden, bei Bedarf bitte entsprechend verschieben. Danke 1

Moin moin,
die 7-Segment-Anzeige funktioniert jetzt, aber eher bescheiden. (etwas bequemeres muß her)
Jetzt versuche ich einen über den ad-Wandler eingelesenen Wert an die Anzeige weiterzugeben.
Das Problem ist, dass die Abfrage des ad-Wandler das Programm so stark ausbremst dass die Ziffern
unlesbar erscheinen.
Wäre es möglich die ad-Abfrage als Hintergrundprogramm laufen zu lassen ?
Die Ausgaberoutine greift nach Bedarf auf die Variable mit dem Spannungswert zu.
So wie der Maustreiber beim Dos-Programm.
Ich glaube bei der PWM läuft das nach diesem Prinzip, oder ?

War so meine Idee.
Zweifel komme mir ob des Speichers des attiny13 auf. Zu klein ?

Gruß
Ralf

Interruptroutine vielleicht ? (Ich trete in den Dialog mit mir selbst, wie der attiny13, der führt auch nur Selbsgespräche) :hello:
 
Hallo Ralf,

ich denke nicht, dass der ATtiny13 hier überfordert ist. Mit internem RC-Oszillator (Auslieferzustand) liegt der Systemtakt bei über 9,6MHz. Soweit ich weiß, überträgst du die Displaydaten zu einen Seriel-Parallel-Wandler 74HC595. Das ist ja ziemlich schnell passiert. Wenn sich der Mikrocontroller um das Multiplexing der Anzeige kümmern muss, ist das auch nicht tragisch. Dieses solltest du in einer TimerISR realisieren.

Der Fehler liegt bestimmt an etwas anderem.

Eine AD-Wandlung, bzw. das Ergebnis der Wandlung auslesen, kann man über Polling des ADIF bits machen oder eben die ISR des ADC verwenden. Polling reicht dann, wenn im Hauptprogramm nicht viel zu erledingen ist. Dann ist es oft sogar vorteilhaft, wenn man über mehrere Wandlungen einen Mittelwert bildet. Es hat auch nicht viel Sinn, in einer Sekunde 1.000 Anzeigenausgaben zu machen.

Stell doch mal dein Programm in das Forum, vielleicht können wir dann sehen, woran es liegt.

Dirk :ciao:
 
Hallo Ralf,

ich denke nicht, dass der ATtiny13 hier überfordert ist. Mit internem RC-Oszillator (Auslieferzustand) liegt der Systemtakt bei über 9,6MHz. Soweit ich weiß, überträgst du die Displaydaten zu einen Seriel-Parallel-Wandler 74HC595. Das ist ja ziemlich schnell passiert. Wenn sich der Mikrocontroller um das Multiplexing der Anzeige kümmern muss, ist das auch nicht tragisch. Dieses solltest du in einer TimerISR realisieren.

Der Fehler liegt bestimmt an etwas anderem.

Eine AD-Wandlung, bzw. das Ergebnis der Wandlung auslesen, kann man über Polling des ADIF bits machen oder eben die ISR des ADC verwenden. Polling reicht dann, wenn im Hauptprogramm nicht viel zu erledingen ist. Dann ist es oft sogar vorteilhaft, wenn man über mehrere Wandlungen einen Mittelwert bildet. Es hat auch nicht viel Sinn, in einer Sekunde 1.000 Anzeigenausgaben zu machen.

Stell doch mal dein Programm in das Forum, vielleicht können wir dann sehen, woran es liegt.

Dirk :ciao:

Hallo Dirk,
die Ursache fiel mir beim Lesen Deiner Antwort ein. Die Fusebits sind auf minimale Frequenz eingestellt.
Ich strukturiere das Programm gerade ein wenig, da ich es von einem für den atmega8 bestimmten code übernommen habe.
Interessant ist hierbei dass der Befehl
Code:
dtostrf(u, 2,2, text);
zur folgenden Fehlermeldung führt:
Code:
avrdude: ERROR: address 0x0410 out of range at line 65 of test.hex
Diesen Befehl benötige ich um ein Byte über die rs232 zu versenden.
Gruß
Ralf
 
Hallo Dirk,
die Ursache fiel mir beim Lesen Deiner Antwort ein. Die Fusebits sind auf minimale Frequenz eingestellt.
Ich strukturiere das Programm gerade ein wenig, da ich es von einem für den atmega8 bestimmten code übernommen habe.
Interessant ist hierbei dass der Befehl
Code:
dtostrf(u, 2,2, text);
zur folgenden Fehlermeldung führt:
Code:
avrdude: ERROR: address 0x0410 out of range at line 65 of test.hex
Diesen Befehl benötige ich um ein Byte über die rs232 zu versenden.
Gruß
Ralf

Hier der Code zum Versenden eines Spannungswertes im Format xx.xx;.
Das ; dient als Steuerzeichen. Es sieht dann wie folgt aus: 12,95;
Es ist nur ein Ausschnitt es fehlt die include Datei uart.h.


Code:
int main(void)
{
    while(1)   
        {
sensor=ADCsingleREAD(0);
u=sensor*0.0420;
char text[9];
bit=0;
dtostrf(u, 2,2, text);

while(bit<6)
{
uart_putc(text[bit]);
_delay_ms(200);
bit++;
}
uart_putc(';'); // Steuerzeichen
WaitMs(400);
        }
  return 0;
}

Gleich kommt der Code zu 7-Segment-Ansteuerung.
 
Hier der Code zum Versenden eines Spannungswertes im Format xx.xx;.
Das ; dient als Steuerzeichen. Es sieht dann wie folgt aus: 12,95;
Es ist nur ein Ausschnitt es fehlt die include Datei uart.h.


Code:
int main(void)
{
    while(1)   
        {
sensor=ADCsingleREAD(0);
u=sensor*0.0420;
char text[9];
bit=0;
dtostrf(u, 2,2, text);

while(bit<6)
{
uart_putc(text[bit]);
_delay_ms(200);
bit++;
}
uart_putc(';'); // Steuerzeichen
WaitMs(400);
        }
  return 0;
}

Gleich kommt der Code zu 7-Segment-Ansteuerung.

So hier. Mein Problem ist hier die Anpassung. Ich muß die Zeichen Byteweise einlesen. Als Test habe ich ein Feld von Integerwerten angelegt.
Siehe uint16_t spannung[5]={5,9,2,1}; Das ergibt dann auf der Anzeige; 1295.... und das war schon ein Grund zur Freude, glaubts mir. :trytofly:

Code:
uint8_t y;    // Zählt die Anzeigen von Rechts nach Links
uint8_t bit; //  Schiebt die Bits von Rechts nach Link
uint16_t temp;     // Eingelesenes Bitmuster		
uint16_t ref;      // Referenz für die Und-Verknüpfung
 
 
#define DS PB0
#define SHCP PB1
#define STCP PB2

#define set_ds() PORTB |=  (1  << PB0);
#define clr_ds() PORTB &= ~(1  << PB0);

#define set_shift()  PORTB  |=  (1  << PB1);
#define clr_shift()  PORTB  &= ~(1  << PB1);

#define set_out()  PORTB  |=  (1  << PB2);
#define clr_out()  PORTB  &= ~(1  << PB2);



 uint16_t led[11]={
0b0000000001111111, // Punkt
0b0000000011111001, // 1
0b0000000010100100, // 2
0b0000000010110000,
0b0000000010011001,
0b0000000010010010,
0b0000000010000010,
0b0000000011111000,
0b0000000010000000,
0b0000000010010000,
0b0000000011000000,                        // 'ziffer 0
 };    

uint16_t spannung[5]={
5,9,2,1
};

  



int main()
{

   while(1)
   {

temp = ( led[spannung[1]]|(0b1000000000000000) >>1); 
DDRB |= ( (1 << DS) | (1 << SHCP ) | (1 << STCP) );
ref =    0b1000000000000000;

for(bit=0;bit<=15;bit++)    //Bit schieben
{
clr_shift(); 
clr_out();

if(temp & ref)
{
set_ds();
}              
else
{
clr_ds();
}
set_shift();
temp = (temp << 1);
}





for(y=0;y<=3;y++)
       {
    
if(y == 2)
{
temp = ( led[spannung[y]]|(0b1000000000000000) >>y); 
			  

}    
else
{
temp = (led[spannung[y]]|(0b1000000000000000)>>y);  // Nach der 2. Stelle soll ein Punkt hinzufügt werden. Dazu will ich den Wert für die Ziffer mit dem Muster für den Punkt verodern. Funzt aber noch nicht.
}

DDRB |= ( (1 << DS) | (1 << SHCP ) | (1 << STCP) );
ref =    0b1000000000000000;


for(bit=0;bit<=15;bit++)    //Bit schieben
{
clr_shift(); 
clr_out();

if(temp & ref)
{
set_ds();
}              
else
{
clr_ds();
}
set_shift();


temp = (temp << 1);
}


set_out();


	    }
      }

  
 }
 
So hier. Mein Problem ist hier die Anpassung. Ich muß die Zeichen Byteweise einlesen. Als Test habe ich ein Feld von Integerwerten angelegt.
Siehe uint16_t spannung[5]={5,9,2,1}; Das ergibt dann auf der Anzeige; 1295.... und das war schon ein Grund zur Freude, glaubts mir. :trytofly:

Code:
uint8_t y;    // Zählt die Anzeigen von Rechts nach Links
uint8_t bit; //  Schiebt die Bits von Rechts nach Link
uint16_t temp;     // Eingelesenes Bitmuster		
uint16_t ref;      // Referenz für die Und-Verknüpfung
 
 
#define DS PB0
#define SHCP PB1
#define STCP PB2

#define set_ds() PORTB |=  (1  << PB0);
#define clr_ds() PORTB &= ~(1  << PB0);

#define set_shift()  PORTB  |=  (1  << PB1);
#define clr_shift()  PORTB  &= ~(1  << PB1);

#define set_out()  PORTB  |=  (1  << PB2);
#define clr_out()  PORTB  &= ~(1  << PB2);



 uint16_t led[11]={
0b0000000001111111, // Punkt
0b0000000011111001, // 1
0b0000000010100100, // 2
0b0000000010110000,
0b0000000010011001,
0b0000000010010010,
0b0000000010000010,
0b0000000011111000,
0b0000000010000000,
0b0000000010010000,
0b0000000011000000,                        // 'ziffer 0
 };    

uint16_t spannung[5]={
5,9,2,1
};

  



int main()
{

   while(1)
   {

temp = ( led[spannung[1]]|(0b1000000000000000) >>1); 
DDRB |= ( (1 << DS) | (1 << SHCP ) | (1 << STCP) );
ref =    0b1000000000000000;

for(bit=0;bit<=15;bit++)    //Bit schieben
{
clr_shift(); 
clr_out();

if(temp & ref)
{
set_ds();
}              
else
{
clr_ds();
}
set_shift();
temp = (temp << 1);
}





for(y=0;y<=3;y++)
       {
    
if(y == 2)
{
temp = ( led[spannung[y]]|(0b1000000000000000) >>y); 
			  

}    
else
{
temp = (led[spannung[y]]|(0b1000000000000000)>>y);  // Nach der 2. Stelle soll ein Punkt hinzufügt werden. Dazu will ich den Wert für die Ziffer mit dem Muster für den Punkt verodern. Funzt aber noch nicht.
}

DDRB |= ( (1 << DS) | (1 << SHCP ) | (1 << STCP) );
ref =    0b1000000000000000;


for(bit=0;bit<=15;bit++)    //Bit schieben
{
clr_shift(); 
clr_out();

if(temp & ref)
{
set_ds();
}              
else
{
clr_ds();
}
set_shift();


temp = (temp << 1);
}


set_out();


	    }
      }

  
 }




Jetzt habe ich mal beide Codes zusammengefasst.
1. Abfrage des ad-Wandlers Adc0 an PB3
2. Ausgabe an 7-Segment, als Übergang mit einer fiktiven "gemessenen" Spannung von 12,95 V.
Das Problem ist, dass wenn die Zeile
Code:
   ADCSRA |= (1 << ADSC);    // Start the ADC conversion
nicht auskommentiert wird spinnt die Anzeige.

Hier der Code:
Code:
#include <avr/io.h>
//#define F_CPU 1600 
#define F_CPU 1200000
#include <avr/delay.h>
#include <inttypes.h>
#include <stdlib.h>                //ISO Standard library of C functions and macros.

#define BYTE char
uint8_t y;    // Zählt die Anzeigen von Rechts nach Links
uint8_t bit; //  Schiebt die Bits von Rechts nach Link
uint16_t temp;     // Eingelesenes Bitmuster		
uint16_t ref;      // Referenz für die Und-Verknüpfung
uint16_t sensorValue;

 
#define DS PB0
#define SHCP PB1
#define STCP PB2
#define ADC_Eingang PB3

#define set_ds() PORTB |=  (1  << PB0);
#define clr_ds() PORTB &= ~(1  << PB0);

#define set_shift()  PORTB  |=  (1  << PB1);
#define clr_shift()  PORTB  &= ~(1  << PB1);

#define set_out()  PORTB  |=  (1  << PB2);
#define clr_out()  PORTB  &= ~(1  << PB2);


 uint16_t led[11]={
0b0000000001111111, // Punkt
0b0000000011111001, // 1
0b0000000010100100, // 2
0b0000000010110000,
0b0000000010011001,
0b0000000010010010,
0b0000000010000010,
0b0000000011111000,
0b0000000010000000,
0b0000000010010000,
0b0000000011000000,                        // 'ziffer 0
 };    

uint16_t spannung[5]={5,9,2,1};



uint16_t ADCsingleREAD(uint8_t adctouse)
{
 int ADCval;

    ADMUX |= adctouse;         // use #1 ADC
    ADMUX |= (1 << MUX0);         // use #1 ADC
    ADMUX |= (1 << MUX1);         // use #1 ADC
    
    
    ADMUX |= (1 << REFS0);    // use AVcc as the reference
    ADMUX &= ~(1 << ADLAR);   // clear for 10 bit resolution
    
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);    // 128 prescale for 8Mhz
    ADCSRA |= (1 << ADEN);    // Enable the ADC

    ADCSRA |= (1 << ADSC);    // Start the ADC conversion

    while(ADCSRA & (1 << ADSC));      // Thanks T, this line waits for the ADC to finish 


    ADCval = ADCL;
    ADCval = (ADCH << 8) + ADCval;    // ADCH is read so ADC can be updated again

    return ADCval;
}




int main()
{

int i;

DDRB |= (1 << 16);
DDRB &= ~(1 << ADC_Eingang);// ADC0 pin
ADMUX |= (1 << REFS0); // VCC as Reference 
ADMUX |= (1 << MUX0); // Eingang PB3 für AD MUX0 und MUX1 = 1
ADMUX |= (1 << MUX1); // Eingang PB3 für AD MUX0 und MUX1 = 1
//ADCSRA |= (1 << ADEN); // Enable ADC   // Hier gibts das Problem

   while(1)
   {
   
DDRB=1; 
sensorValue=ADCsingleREAD(0);

//_delay_ms(10);
for(y=0;y<=3;y++)
       {
    
temp = ( led[spannung[y]]|(0b1000000000000000) >>y); 

DDRB |= ( (1 << DS) | (1 << SHCP ) | (1 << STCP) );
ref =    0b1000000000000000;

for(bit=0;bit<=15;bit++)    //Bit schieben
{
clr_shift(); 
clr_out();

if(temp & ref)
{
set_ds();
}              
else
{
clr_ds();
}
set_shift();
temp = (temp << 1);
}



set_out();

}
	    }
      }
 
Hallo Ralf,

du hast mehrere Stellen, die über flüssig sind oder nicht funktionieren. Die Ursache für das beschriebene Verhalten liegt anscheinend direkt nach der while(1) Schleife. Hier aenderst du das DDRB Register, alle Steuersignale für den Seriell-Parallel-Wandler sind Input. Dann erfolgt die AD-Wandlung, wenn ADSC Bit gesetzt. Während der Wandlung sind die Zustände der Steuersignale ggf. undefiniert, da floating.

Im Moment fehlt mir leider die Zeit noch weiter über deinen code zu schauen, das mache ich morgen mal, wenn sonst zwischenzeitlich niemand noch etwas findet.

Dirk :ciao:
 
Hallo Ralf,

du hast mehrere Stellen, die über flüssig sind oder nicht funktionieren. Die Ursache für das beschriebene Verhalten liegt anscheinend direkt nach der while(1) Schleife. Hier aenderst du das DDRB Register, alle Steuersignale für den Seriell-Parallel-Wandler sind Input. Dann erfolgt die AD-Wandlung, wenn ADSC Bit gesetzt. Während der Wandlung sind die Zustände der Steuersignale ggf. undefiniert, da floating.

Im Moment fehlt mir leider die Zeit noch weiter über deinen code zu schauen, das mache ich morgen mal, wenn sonst zwischenzeitlich niemand noch etwas findet.

Dirk :ciao:

Hallo Dirk,
Danke !
Es scheint mir auch ein bißchen unübersichtlich geraten ... aber ich versuche das Ganze nochmal zu ordnen.
Aber das mit den ddrb Register war schon mal ein Treffer.
Gruß
Ralf
 
Aber das mit den ddrb Register war schon mal ein Treffer.

Wieder was komisches....

Code:
float messwert_umgerechnet; 
sensorValue=ADCsingleREAD(0);  //Abfrage des ad-Wandlers

Folgender Befehl führt zu avrdude: ERROR: address 0x0410 out of range at line 65 of test.hex

messwert_umgerechnet=0.042*sensorValue; // Anpassung
Zuerst dachte ich dass an dem Komma liegen könnte, aber auch das Weglassen der Multiplikation bringt keine Besserung.
 
Folgender Befehl führt zu avrdude: ERROR: address 0x0410 out of range at line 65 of test.hex

Zuerst dachte ich dass an dem Komma liegen könnte, aber auch das Weglassen der Multiplikation bringt keine Besserung.

Eventuell reicht das Flash Memory nicht aus, du hast bei dem Tiny13 lediglich 1kByte.

Du nutzt zudem noch Floating Point, das benötigt ziemlich viel Programmspeicher.

Genau kann ich allerdings nicht sagen was da passiert, avrdude nutze ich nicht und ich kann es mit Atmel Studio nicht nachvollziehen, da mir das Gesamtprogramm fehlt.

Dirk :ciao:
 
Eventuell reicht das Flash Memory nicht aus, du hast bei dem Tiny13 lediglich 1kByte.

Du nutzt zudem noch Floating Point, das benötigt ziemlich viel Programmspeicher.

Genau kann ich allerdings nicht sagen was da passiert, avrdude nutze ich nicht und ich kann es mit Atmel Studio nicht nachvollziehen, da mir das Gesamtprogramm fehlt.

Dirk :ciao:

:hmmmm: , dann muss ich es mit Integerwerten machen.... aber wie nur....
 
:hmmmm: , dann muss ich es mit Integerwerten machen.... aber wie nur....

Das könnte so funktionieren...

Nicht verwenden, da ziemlich viel Flash Memory benötigt wird:
Code:
    #include <stdlib.h>
    dtostrf(u, 2,2, text);

Mit uint16_t rechnen:
Code:
    uint16_t sensorValue;
    uint16_t messwert_umgerechnet;
    uint8_t d1, d2, d3, d4;
    
    sensorValue = 1023;    // Beispiel. 10bit ADC: 0..1023 

    messwert_umgerechnet = 42 * sensorValue;    // Faktor 1.000 enthalten, dadurch ist alles integer. Es reicht hier uint16_t, da max. 1023 vom ADC kommt
    
    d1 = (messwert_umgerechnet / 10000);        // Digit1, 10er
    d2 = (messwert_umgerechnet / 1000) % 10;    // Digit2, 1er
    d3 = (messwert_umgerechnet / 100) % 10;     // Digit3, erste Stelle nach Komma    
    d4 = (messwert_umgerechnet / 10) % 10;      // Digit4, zweite Stelle nach Komma

Um für jede Stelle Ascii Character zu erhalten, jeweils 0x30 addieren.

Dirk :ciao:
 
Das könnte so funktionieren...

Nicht verwenden, da ziemlich viel Flash Memory benötigt wird:
Code:
    #include <stdlib.h>
    dtostrf(u, 2,2, text);

Mit uint16_t rechnen:
Code:
    uint16_t sensorValue;
    uint16_t messwert_umgerechnet;
    uint8_t d1, d2, d3, d4;
    
    sensorValue = 1023;    // Beispiel. 10bit ADC: 0..1023 

    messwert_umgerechnet = 42 * sensorValue;    // Faktor 1.000 enthalten, dadurch ist alles integer. Es reicht hier uint16_t, da max. 1023 vom ADC kommt
    
    d1 = (messwert_umgerechnet / 10000);        // Digit1, 10er
    d2 = (messwert_umgerechnet / 1000) % 10;    // Digit2, 1er
    d3 = (messwert_umgerechnet / 100) % 10;     // Digit3, erste Stelle nach Komma    
    d4 = (messwert_umgerechnet / 10) % 10;      // Digit4, zweite Stelle nach Komma

Um für jede Stelle Ascii Character zu erhalten, jeweils 0x30 addieren.

Dirk :ciao:

Hallo Dirk,
funktioniert das mit den Brüchen ? Da kommt auch wieder eine Kommazahl raus.
Gruß
Ralf
 
Hallo Ralf,

es ist alles integer. Vier Dezimalstellen werden abgepaltet, die ersten zwei sind vor dem Komma, die letzten zwei nach dem Komma.

Also ich habe es nicht ausprobiert, es müsste aber funktionieren.

Dirk :ciao:
 
Hallo Ralf,

es ist alles integer. Vier Dezimalstellen werden abgepaltet, die ersten zwei sind vor dem Komma, die letzten zwei nach dem Komma.

Also ich habe es nicht ausprobiert, es müsste aber funktionieren.

Dirk :ciao:

So nah dran und dann dies... Alles über 1V am adc ging in der Übersteuerung. (hätte man bei einem Verstärker gesagt.... hier ???)
Und wars ? REFS auf 1 gesetzt und damit auf interne Referenz. :stupid:

Hurra es läuft !!! :cheers:
Das mit dem Mittelwert funktioniert zwar mathematisch schon, allerdings macht dann die Anzeige schlapp.
Ich lasse immer 40 Wert aus und zeige dann den 41 wieder an.
Mittelwert wäre schöner, den müsste dann im Hintergrund berechnen.
Über Interrupt oder TSR bei Dos. Das wird aber den Speicher sprengen, denke ich.
Da habe ich derzeit auch noch keine Ahnung von.
Danke Dirk... gegen die 7-Segment-Anzeige stinkt das LCD-Multimeter einfach nur noch ab. :rolleyes:
 

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