Forum: Mikrocontroller und Digitale Elektronik 7-Segment Anzeige ansteuern (Gray-Code und ATmega32)


von Ingemar F. (dementius)


Lesenswert?

Hallo,

ich möchte eine 7-Segment Anzeige per ATmega32 ansteuern wobei die 
Eingangssignale als Gray-Code definiert sind:

000 = A
001 = U
011 = E
010 = 1
110 = 2
111 = 3
101 = 4

Wenn die entsprechenden Signale an den jeweiligen Bits (PA0 - PA2) 
anliegen sollen die entsprechenden Bits am PORT D auf High geschaltet 
werden.
Ich hab mir das Tutorial durchgelesen und auch andere Beispiele 
angeschaut und mal probiert ein Programm dazu zu schreiben.
Für Hilfe und Ratschläge wäre ich sehr dankbar.

mfg

1
#define F_CPU 8000000UL
2
#include <util/delay.h>
3
#include <avr/io.h>
4
5
6
7
int main(void)
8
{
9
  //Setzen der Eingänge
10
  DDRA = 0x00;
11
  DDRA &= ~((1<<PA0) | (1<<PA1) | (1<<PA2));
12
13
  // Ausgänge definieren
14
  DDRD = 0xff;
15
16
    while (1) 
17
    {
18
    // für Anzeige "U"
19
    if (PINA &= (1<<PA0))
20
    {
21
      PORTD |= ((1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5));
22
      _delay_ms(250);
23
    } 
24
    else
25
    {
26
      PORTD = 0x00;
27
    }
28
    
29
    // für Anzeige "E"
30
    if(PINA &= ((1<<PA0) & (1<<PA1)));
31
    {
32
      PORTD |= (1<<PD0) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6);
33
      _delay_ms(250);
34
    }
35
    else
36
    {
37
      PORTD = 0x00;
38
    }
39
40
    //für Anzeige "1"
41
    if(PINA &= (1<<PA1))
42
    {
43
      PORTD |= (1<<PD1) | (1<<PD2);
44
      _delay_ms(250);
45
    }
46
    else
47
    {
48
      PORTD = 0x00;
49
    }
50
51
    //für Anzeige "2"
52
    if(PINA &= (1<<PA1) & (1<<PA2))
53
    {
54
      PORTD |= (1<<PD0) | (1<<PD1) | (1<<PD3) | (1<<PD4) | (1<<PD6);
55
      _delay_ms(250);
56
    }
57
    else
58
    {
59
      PORTD = 0x00;
60
    }
61
62
    // für Anzeige "3"
63
    if (PINA &= (1<<PA0) & (1<<PA1) & (1<<PA2))
64
    {
65
      PORTD |= (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3) | (1 << PD6);
66
      _delay_ms(250);
67
    } 
68
    else
69
    {
70
      PORTD = 0x00;
71
    }
72
    
73
    // für Anzeige "4"
74
    if (PINA &= (1<<PA0) & (1<<PA2))
75
    {
76
      PORTD |= (1 << PD1) | (1 << PD2) | (1 << PD5) | (1 << PD6);
77
      _delay_ms(250);
78
    } 
79
    else
80
    {
81
      PORTD = 0x00;
82
    }
83
    
84
    }
85
}

von Max D. (max_d)


Lesenswert?

Mach dir eine code Tabelle und benutze deinen Code als Zeiger da rein.

von Witkatz :. (wit)


Lesenswert?

Ingemar F. schrieb:
> if (PINA &= (1<<PA0))

&= ist ein Zuweisungsoperator

von Karl M. (Gast)


Lesenswert?

Hallo,

hier ist eine komplette Lösung mit LunaAVR für unterschiedliche LED mit 
gemeinsamer Kathode oder Anode.
1
'---------------------------------------
2
' LunaAVR Version 2017.r1 build 9156 (beta)
3
' 2017-01-30
4
'---------------------------------------
5
' System Settings
6
7
const F_CPU = 8000000
8
avr.device   = atmega32
9
avr.clock  = avr.F_CPU
10
avr.stack  = 64
11
12
'---------------------------------------
13
' define I/O Portpins
14
15
#define INPUT0 as portA.0
16
#define INPUT1 as portA.1
17
#define INPUT2 as portA.2
18
19
#define LED_OUT as portd
20
21
'---------------------------------------
22
' setup I/O Portpins
23
24
INPUT0.mode = input, nopullup
25
INPUT1.mode = input, nopullup
26
INPUT2.mode = input, nopullup
27
28
'---------------------------------------
29
' Belegung der LED Segmente
30
' Wahl des LED Typs
31
#define LED_COMMON_ANODE   as 0
32
#define LED_COMMON_KATHODE as 1
33
#define LED_COMMON_TYPE    as LED_COMMON_KATHODE
34
35
' Belegung der LED Segmente am Port LED_OUT
36
' LED_SEG_DP = Bit7 wird nicht bedient.
37
const LED_SEG_A  = (1<<0)
38
const LED_SEG_B  = (1<<1)
39
const LED_SEG_C  = (1<<2)
40
const LED_SEG_D  = (1<<3)
41
const LED_SEG_E  = (1<<4)
42
const LED_SEG_F  = (1<<5)
43
const LED_SEG_G  = (1<<6)
44
const LED_SEG_DP = (1<<7)
45
46
#if LED_COMMON_TYPE
47
LED_OUT.mode = output, low
48
#else
49
LED_OUT.mode = output, high
50
#endif
51
52
'---------------------------------------
53
' main loop
54
55
dim bInput as byte
56
dim bInput_old as byte
57
58
bInput_old = ReadInput()
59
LED_OUT.value = ReadLEDChar( bInput_old )
60
61
do
62
bInput = ReadInput()
63
64
if (bInput <> bInput_old) then
65
bInput_old = bInput
66
LED_OUT.value = ReadLEDChar( bInput )
67
endif
68
69
' waitms(100) ' just debug
70
loop
71
72
'---------------------------------------
73
'
74
function ReadInput() as byte
75
 dim result as byte
76
 result = 0
77
78
 when (INPUT0) do result or= 0b001
79
 when (INPUT1) do result or= 0b010
80
 when (INPUT2) do result or= 0b100
81
82
 return result
83
endfunc
84
85
'---------------------------------------
86
'
87
function ReadLEDChar( value as byte ) as byte
88
 #if LED_COMMON_TYPE
89
  return LED_character.ByteValue( value and 0b111 )
90
 #else
91
  return not LED_character.ByteValue( value and 0b111 )
92
 #endif
93
endfunc
94
95
'---------------------------------------
96
' LED Zeichensatz
97
data LED_character
98
' 0b000
99
.db 0b01110111
100
' 0b001
101
.db 0b00111110
102
' 0b010
103
.db 0b00000110
104
' 0b011
105
.db 0b01111001
106
' 0b100
107
.db 0b0
108
' 0b101
109
.db 0b01100110
110
' 0b110
111
.db 0b01011011
112
' 0b111
113
.db 0b01001111
114
enddata

von fop (Gast)


Lesenswert?

1
if (PINA &= (1<<PA0))
Uff ! So vergleicht man eigentlich nicht. Das ist eine Zuweisung in 
einem if.
Also wird hier PINA der Wert von PINA mit 1 und-verknüpft zugewiesen. 
Weil aber in C jede Zuweisung auch einen Wert hat, gibt's dafür keinen 
Mecker vom Compiler, sondern die Bedingung ist wahr, sobald PINA und 1 
einen Wert ungleich null hat.
Du schreibst also auf PINA, das ist bei AVRs wie ein Schreiben auf 
PORTA. Da die Pins wohl Eingänge sind, schaltest Du damit munter die 
Pullups, falls sie global aktiviert sind. War vermutlich so nie gedacht.
Punkt 2 ist noch witziger, sobald das Bit 0 in PINA eins ist, ist die 
Bedingung erfüllt. Also immer, wenn PA0 auf high ist.
Laut Deiner Tabelle also bei U, E, 3 und 4. Nicht wie geplant nur bei U.
Warum Du die Anzeige löschst, wenn der aktuell abgetestete Wert nicht 
stimmt, bleibt wohl Dein Geheimnis. Würdest Du Dir das verkneifen, 
könntest Du die delay auch einfach weg lassen.
Also normalerweise würdest Du ja auch sagen
- wenn U, zeige U an
- wenn E, zeige E an
... usw.
- wenn nix von alledem, lösche Anzeige

So was kann man als witzige if...else if...else if...else if...else 
Kaskade schreiben. Oder man kann das wie dafür gemachte switch/case 
benutzen.

Wenn Du es so umsetzt kannst Du auch volle Geschwindigkeit geben. Es 
flackert dann nur, wenn der Eingangswert wackelt.

von Ingemar F. (dementius)


Lesenswert?

Max D. schrieb:
> Mach dir eine code Tabelle und benutze deinen Code als Zeiger da rein.

So in etwa?
1
const unsigned char GrayCode[7] = {0x7E, //U 
2
0x79, // E
3
0x06, //1
4
0x5B, //2
5
0x4F, //3
6
0x66, //4
7
0x77 //A 
8
};
Das wären die Zustände für die Pins an der 7-Segment Anzeige.

Abgefragt sollen folgende Zustände an den Eingangspins:

U = 0x01
E = 0x03
1 = 0x02
2 = 0x06
3 = 0x07
4 = 0x05
A = 0x00

Edit:

Ist das korrekt?
1
//Setzen der Eingänge
2
  DDRA &= ~((1 << DDA0) | (1 << DDA1) | (1<<DDA2));
3
  
4
  // Ausgänge definieren
5
  DDRD |= (1 << DDD0) | (1 << DDD1) | (1 << DDD2) | (1 << DDD3) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6);

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Du musst vorher den graycode in binär "umdenken".
Das erste Element ist das mit der Adresse 0 0=0x00="A"
Das nächste ist 1
1=0x01="U"

usw....

von Georg (Gast)


Lesenswert?

Max D. schrieb:
> Du musst vorher den graycode in binär "umdenken"

denken vielleicht, programmieren muss man das nicht - es genügt ja eine 
Tabelle Gray -> 7Segment.

Georg

von Ingemar F. (dementius)


Angehängte Dateien:

Lesenswert?

Georg schrieb:
> Max D. schrieb:
>> Du musst vorher den graycode in binär "umdenken"
>
> denken vielleicht, programmieren muss man das nicht - es genügt ja eine
> Tabelle Gray -> 7Segment.
>
> Georg

Soll so sein wie im Anhang dargestellt. Das ganze mit gemeinsamer 
Kathode der 7-Segment Anzeige

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Du baust dir erstmal eine Tabelle die für deine 8 Zustände die Werte 
enthält:
1
uint8_t konverterTabelle[] = {
2
0x77 //A
3
0x7E //U
4
0x06 //1
5
0x79 //E
6
//hier noch die restlichen Codes
7
};
(größere Tabellen kann man auch in den flash legen (pgmspace.h) um Platz 
im RAM zu sparen, bei 8 Einträgen lohnts aber ned)
Du kannst die dann ansprechen fast wie eine Funktion:
1
PORTD = konverterTabelle[PINA&0b00000111];
Wenn auf PORTD noch andere Funktionen liegen, dann musst du halt die 
bits maskieren.

von fop (Gast)


Lesenswert?

Ich würde es nicht umdenken nennen. Es ist eher ein Umsortieren. Du 
brauchst aber 8 Plätze im Array, nicht 7, da es einen ungültigen Zustand 
gibt.

0 = 000 = A
1 = 001 = U
2 = 010 = 1
3 = 011 = E
4 = 100 = -
5 = 101 = 4
6 = 110 = 2
7 = 111 = 3

von fop (Gast)


Lesenswert?

1
#define SEG_A PD0
2
#define SEG_B PD1
3
#define SEG_C PD2
4
#define SEG_D PD3
5
#define SEG_E PD4
6
#define SEG_F PD5
7
#define SEG_G PD6
8
9
#define CHR__ (0U)
10
#define CHR_1 ((1U<<SEG_B)|(1U<<SEG_C))
11
#define CHR_2 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_G)|(1U<<SEG_E)|(1U<<SEG_D))
12
13
...
14
#define CHR_8 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
15
16
const unsigned char Gray2SevenCode[8] = {
17
#ifndef NEGATIVE_LOGIC
18
    CHR_A,
19
    CHR_U,
20
    CHR_1,
21
    CHR_E,
22
    CHR__,
23
    CHR_4,
24
    CHR_2,
25
    CHR_3
26
#else
27
    ~CHR_A,
28
    ~CHR_U,
29
    ~CHR_1,
30
    ~CHR_E,
31
    ~CHR__,
32
    ~CHR_4,
33
    ~CHR_2,
34
    ~CHR_3
35
#endif
36
};
37
38
...
39
#ifndef NEGATIVE_LOGIC
40
    PORTD=(PORTD & ~CHR_8)|Gray2SevenCode[PINA & 7U];
41
#else
42
    PORTD=(PORTD | CHR_8)& Gray2SevenCode[PINA & 7U];
43
#endif

von Ingemar F. (dementius)


Lesenswert?

fop schrieb:

> #ifndef NEGATIVE_LOGIC
>     PORTD=(PORTD & ~CHR_8)|Gray2SevenCode[PINA & 7U];
> #else
>     PORTD=(PORTD | CHR_8)& Gray2SevenCode[PINA & 7U];
> #endif
> [/c]
Vor dem ersten PORTD bekomm ich folgende Fehlermeldungen:

expected identifier or '(' before 'volatile'
expected ')' before '(' token

CHR_8 brauch ich ja nicht unbedingt

: Bearbeitet durch User
von fop (Gast)


Lesenswert?

Jein, das CHR_8 nehme ich als Maske, für alle Bits, die zur Ausgabe an 
die Anzeige dazu gehören. Nur für den Fall, dass der 8. Pin mal eine 
andere Bedeutung bekommt.

Ich hatte das Beispiel getippt, ohne es durch den Compiler zu jagen. 
Sollte aber so ähnlich funktionieren. Die letzte Zeile gehört natürlich 
in die Schleife der main() Funktion.

Also nochmal probiert. Folgendes Compiliert durch :
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
#define SEG_A PD0
5
#define SEG_B PD1
6
#define SEG_C PD2
7
#define SEG_D PD3
8
#define SEG_E PD4
9
#define SEG_F PD5
10
#define SEG_G PD6
11
12
#define CHR__ (0U)
13
#define CHR_1 ((1U<<SEG_B)|(1U<<SEG_C))
14
#define CHR_2 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_G)|(1U<<SEG_E)|(1U<<SEG_D))
15
#define CHR_3 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_G))
16
#define CHR_4 ((1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_F)|(1U<<SEG_G))
17
#define CHR_8 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
18
#define CHR_A ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
19
#define CHR_E ((1U<<SEG_A)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
20
#define CHR_U ((1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F))
21
22
#define INLSB PA0
23
#define INMSK (7U)
24
25
const uint8_t Gray2SevenCode[8] =
26
{
27
#ifndef NEGATIVE_LOGIC
28
    CHR_A,
29
    CHR_U,
30
    CHR_1,
31
    CHR_E,
32
    CHR__,
33
    CHR_4,
34
    CHR_2,
35
    CHR_3
36
#else
37
    CHR_A ^ CHR_8,
38
    CHR_U ^ CHR_8,
39
    CHR_1 ^ CHR_8,
40
    CHR_E ^ CHR_8,
41
    CHR__ ^ CHR_8,
42
    CHR_4 ^ CHR_8,
43
    CHR_2 ^ CHR_8,
44
    CHR_3 ^ CHR_8
45
#endif
46
};
47
48
49
int main(void)
50
{
51
    /* Eingaenge definieren */
52
    DDRA &= ~(INMSK << INLSB); /* Datenrichtung */
53
    PORTA |= (INMSK << INLSB); /* PullUps */
54
    /* Ausgaenge definieren */
55
#ifndef NEGATIVE_LOGIC
56
    PORTD &= ~CHR_8;    /* Startwert */
57
#else
58
    PORTD |= CHR_8;     /* Startwert */
59
#endif
60
    DDRD |= CHR_8;      /* Datenrichtung */
61
    while (1)
62
    {
63
        PORTD = (PORTD & ~CHR_8) | Gray2SevenCode[(PINA >> INLSB) & INMSK];
64
    }
65
}

von Axel S. (a-za-z0-9)


Lesenswert?

fop schrieb:
> Also nochmal probiert. Folgendes Compiliert durch

Zu umständlich. Ich würde den ganzen Schmonzes mit NEGATIVE_LOGIC 
weglassen. Das verwirrt doch unseren TE bloß. Eher so:

1
...
2
3
const uint8_t Gray2SevenCode[8] =
4
{ CHR_A, CHR_U, CHR_1, CHR_E,
5
  CHR__, CHR_4, CHR_2, CHR_3 };
6
7
int main(void)
8
{
9
    /* Eingaenge definieren */
10
    DDRA &= ~(INMSK << INLSB); /* Datenrichtung */
11
    PORTA |= (INMSK << INLSB); /* PullUps */
12
13
    /* Ausgaenge definieren */
14
    DDRD |= 0xFF;             /* Datenrichtung */
15
16
    while (1)
17
    {
18
        PORTD = Gray2SevenCode[(PINA >> INLSB) & INMSK];
19
    }
20
}

Falls er seine LED doch lieber mit L statt mit H einschalten will, dann 
genügt es, eine einzige Zeile zu ändern:

1
        PORTD = ~Gray2SevenCode[(PINA >> INLSB) & INMSK];


Außerdem noch ein paar Anmerkungen:

1. es ist ziemlich verwirrend, eine entweder-oder Codevariante als
1
#ifndef BEDINGUNG
2
#else
3
#endif

zu schreiben. So ziemlich jeder erwartet den if Zweig zuerst. Also 
einfach #ifdef BEDINGUNG und dann die beiden Blöcke tauschen.

2. wenn du ohnehin alle Bits setzen willst, dann brauchst du nicht mit 
logischen Operatoren rumzumachen, sondern kannst den Wert direkt 
zuweisen. Alle Anfänger, die deinen Code mal zu verstehen versuchen, 
werden es dir danken.

3. es ist ungeschickt, CHR_8 als Maske zu nehmen. Denn es ist zwar mit 
dieser Codierung gegeben, daß CHR_8 alle Bits gesetzt hat, aber das 
muß ja nicht so bleiben (genau deswegen verwendet man ja ein #define, 
damit man den Code verwenden kann ohne die Interna zu kennen). Wenn du 
also explizit alle Bits setzen willst, dann schreib das auch so hin und 
verlaß dich nicht auf Spezifika der gerade gewählten Codierung.

Stell dir dazu einfach vor, der TE wöllte das nächste Mal keine 
7-Segment-Anzeige verwenden, sondern 7 einzelne LED, je eine für jeden 
Zustand. Dann müßte er außer der Übersetzungstabelle noch eine ganz 
andere Stelle im Code ändern.

von Georg (Gast)


Lesenswert?

Axel S. schrieb:
> der TE wöllte das nächste Mal keine
> 7-Segment-Anzeige verwenden, sondern 7 einzelne LED, je eine für jeden
> Zustand.

Dann kann man das ja als HAL aufeinander aufbauen. Es gibt eine Routine 
Setze_LED, und die Routine Setze_Display verwendet diese. Dann muss man 
auch kein 8bit-Port für das Display verwenden, sondern kann beliebige 
Pins nehmen. Die paar Befehle mehr sollten ja keine Rolle spielen.

Georg

von Axel S. (a-za-z0-9)


Lesenswert?

Georg schrieb:
> Axel S. schrieb:
>> der TE wöllte das nächste Mal keine
>> 7-Segment-Anzeige verwenden, sondern 7 einzelne LED, je eine für jeden
>> Zustand.
>
> Dann kann man das ja als HAL aufeinander aufbauen.

Hast du eigentlich verstanden, worum es mir in Punkt 3 ging?
Kleiner Tip: das wesentliche hast du nicht zitiert.

von Ingemar F. (dementius)


Lesenswert?

Axel S. schrieb:
> fop schrieb:
>> Also nochmal probiert. Folgendes Compiliert durch
>
> Zu umständlich. Ich würde den ganzen Schmonzes mit NEGATIVE_LOGIC
> weglassen. Das verwirrt doch unseren TE bloß. Eher so:
Ja, ist alles neu für mich in Sachen Mikrocontroller.

Im Grunde geht es um folgende Aufgabenstellung und Problem:

In einem Aufzug wird die Position über Initiatoren als Gray-Code 
erfasst. Dabei entspricht die unterste Position dem Signal "001" (also 
U). Es gibt 6 Etagen und wenn der Aufzug außer Betrieb ist wird die 
Position "000" gesetzt und es erscheint die Anzeige "A".

Deswegen das ganze mit 7-Segment Anzeige und keine einzelnen LED.

von Eric B. (beric)


Lesenswert?

1
#define SEG_A PD0
2
#define SEG_B PD1
3
#define SEG_C PD2
4
#define SEG_D PD3
5
#define SEG_E PD4
6
#define SEG_F PD5
7
#define SEG_G PD6
8
9
#define CHR__ (0U)
10
#define CHR_1 ((1U<<SEG_B)|(1U<<SEG_C))
11
#define CHR_2 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_G)|(1U<<SEG_E)|(1U<<SEG_D))
12
#define CHR_3 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_G))
13
#define CHR_4 ((1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_F)|(1U<<SEG_G))
14
#define CHR_8 ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
15
#define CHR_A ((1U<<SEG_A)|(1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
16
#define CHR_E ((1U<<SEG_A)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F)|(1U<<SEG_G))
17
#define CHR_U ((1U<<SEG_B)|(1U<<SEG_C)|(1U<<SEG_D)|(1U<<SEG_E)|(1U<<SEG_F))

Dann doch eher so
1
#define _A (1U<<PD0)
2
#define _B (1U<<PD1)
3
#define _C (1U<<PD2)
4
#define _D (1U<<PD3)
5
#define _E (1U<<PD4)
6
#define _F (1U<<PD5)
7
#define _G (1U<<PD6)
8
9
#define CHR_1 (      _B | _C                     )
10
#define CHR_2 ( _A | _B |      _D | _E |      _G )
11
#define CHR_3 ( _A | _B | _C | _D |           _G )
12
#define CHR_4 (      _B | _C |           _F | _G )
13
#define CHR_8 ( _A | _B | _C | _D | _E | _F | _G )
14
#define CHR_A ( _A | _B | _C |      _E | _F | _G )
15
#define CHR_E ( _A |           _D | _E | _F | _G )
16
#define CHR_U (      _B | _C | _D | _E | _F      )
(mit oder ohne "SEG")

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.