Frequenzmesser

Gast #3423867
Lesenswert?

Hallo Forum, ich habe folgendes kleines Programm geschrieben.
1
.dseg
2
  frequ_hoch:
3
    .byte 1
4
  frequ_mittel:
5
    .byte 1
6
  frequ_nieder:
7
    .byte 1
8
  frequ_hoch_temp_temp:
9
    .byte 1
10
  frequenz_status:
11
    .byte 1
12
  zaehl_ergeb_spei:
13
    .byte 27
14
  zaehl_spei_schr_z:
15
    .byte 1
16

17
.cseg    
18
frequenzmessen_vor:
19
  ldi tmp1,0
20
  out TCCR1A,tmp1
21
  ldi tmp1,0b00000010
22
  out TCCR1B,tmp1
23
;Timer Interupt Mask
24
  in tmp1,TIMSK
25
  ori tmp1,0b00100100
26
  out TIMSK,tmp1
27
  ldi tmp1,0
28
  sts frequ_hoch,tmp1
29
  sts frequ_mittel,tmp1
30
  sts frequ_nieder,tmp1
31
  ret
32
 ;---------------------------------- 
33
frequenz_int1:
34
  push tmp6
35
  in tmp6,sreg
36
  push tmp6
37

38
  lds tmp6,frequ_hoch_temp_temp
39
  inc tmp6
40
  sts frequ_hoch_temp_temp,tmp6
41

42
  pop tmp6
43
  out sreg,tmp6
44
  pop tmp6
45
  reti
46
;-----------------------------------    
47
frequenz_start_stop:
48
  push tmp5
49
  push tmp6
50
  in tmp6,sreg
51
  push tmp6
52
  push xl
53
  push xh
54
  
55
  lds tmp6,zaehl_spei_schr_z
56
  cpi tmp6,27
57
  brlo frequenz_start_stop_10
58
  ldi tmp6,0
59

60
frequenz_start_stop_10:
61
  ldi xl,low(zaehl_ergeb_spei)
62
  ldi xh,high(zaehl_ergeb_spei)
63
  add xl,tmp6
64
  clr tmp5
65
  adc xh,tmp5
66

67
  in tmp5,TCNT1L
68
  rcall frequenz_start_stop_100
69
  in tmp5,TCNT1H
70
  rcall frequenz_start_stop_100
71
  lds tmp5,frequ_hoch_temp_temp
72
  rcall frequenz_start_stop_100
73

74
  ldi tmp5,0
75
  sts frequ_hoch_temp_temp,tmp5
76
  sts zaehl_spei_schr_z,tmp6
77

78
  pop xh
79
  pop xl
80
  pop tmp6
81
  out sreg,tmp6
82
  pop tmp6
83
  pop tmp5
84
  reti
85

86
frequenz_start_stop_100:
87
  st x+,tmp5
88
  inc tmp6
89
  ret
90
;-----------------------------------   
91

92
frequenz_berechnung:
93
  ldi xl,low(zaehl_ergeb_spei)
94
  ldi xh,high(zaehl_ergeb_spei)
95
  mov yl,xl
96
  mov yh,xh
97
  
98
  ldi tmp5,3
99
  add yl,tmp5
100
  clr tmp3
101
  adc yh,tmp3
102
  
103
;Adressen für die indirekten Zeiger sind berechnet
104
frequenz_berechnung_10:    
105
  ld tmp5,x
106
  ld tmp8,y
107

108
  adiw x,1
109
  adiw y,1
110

111
  ld tmp6,x
112
  ld tmp9,y
113

114
  adiw x,1
115
  adiw y,1
116

117
  ld tmp7,x
118
  ld tmp10,y
119

120
  adiw x,1
121
  adiw y,1
122

123
  sub tmp5,tmp8
124
  sbc tmp6,tmp9
125
  sbc tmp7,tmp10
126
  
127
  brtc frequenz_berechnung_20
128
  neg tmp5
129
  neg tmp6
130
  neg tmp7
131
  
132
frequenz_berechnung_20:
133
  lds tmp4,frequ_nieder
134
  add tmp4,tmp5
135
  sts frequ_nieder,tmp4
136

137
  lds tmp4,frequ_mittel
138
  add tmp4,tmp6
139
  sts frequ_mittel,tmp4
140

141
  lds tmp4,frequ_hoch
142
  add tmp4,tmp7
143
  sts frequ_hoch,tmp4
144

145
  inc tmp5
146
  cpi tmp5,9
147
  brsh frequenz_berechnung_40
148
  rjmp frequenz_berechnung_10
149

150
frequenz_berechnung_40:
151
  ldi tmp5,0
152

153
frequenz_berechnung_50:
154
  lds tmp7,frequ_hoch
155
  lsr tmp7
156
  sts frequ_hoch,tmp7
157
  
158
  lds tmp7,frequ_mittel
159
  ror tmp7
160
  sts frequ_mittel,tmp7
161
  
162
  lds tmp7,frequ_nieder
163
  ror tmp7
164
  sts frequ_nieder,tmp7
165
  
166
  inc tmp5
167
  cpi tmp5,4
168
  brlo frequenz_berechnung_50
169

170
  
171
frequenz_berechnung_100:
172
  ldi tmp3,199
173
  rcall frequenz_darstellen
174
  ret

In "frequenzmessen_vor" werden Voreinstellungen gemacht.

In "frequenz_int1" wird der Zähler "frequ_hoch_temp_temp" bei jedem 
Zähler 1 überlauf um eins erhöht.

In "frequenz_start_stop" wird eine 9 x 3 Tabelle mit den Low und High 
Bytes des Zähler 1 und dem Byte "frequ_hoch_temp_temp" gefüllt.

In "frequenz_berechnung" soll nun der Durchschnittswert der Tabelle 
berechnet werden. Dazu werden zuerst die einzelnen Dreiergruppen geladen 
und voneinander abgezogen. Müßte normalerweise, wenn sich die Frequenz 
nicht ändert immer den gleichen Wert ergeben. Die Ergebnisse der 
Subtraktion werde aufaddiert und dann durch 8 geteilt. Und das sollte 
dann einen Wert ergeben von dem ich die Frequenz berechnen kann. Nur so 
weit bin ich noch nicht da dieser Wert schon nicht stabil ist, sondern 
im ganzen Bereich umherspringt. Was mach ich falsch?
Vielen Dank im vorraus.
(Firma: matzetronics) #3423883
Lesenswert?

Ich wühl' mich da jetzt nicht durch - aber es hilft ungemein, 
Unterprogramme und bei Assembler sogar einzelne Zeilen mit einem 
Kommentar zu versehen. Nicht nur für uns Ahnungslose, sondern auch für 
dich selber, damit du in 3 Wochen auch noch verstehst, was du da 
eigentlich programmiert hast.

Und noch ein Tipp: Wenn du Kontrollstrukturen in z.B. Timerregistern 
schreibst, ist solche eine Schreibweise wesentlich besser:
1
       ldi   r16,(1<<COM1A)|(1<<COM1B)
2
       out   TCCR0A,r16
als das Bitgewurschtel, wo jeder nochmal ins Datenblatt gucken muss, obs 
denn auch an der richtigen Stelle ist.
Gast #3423949
Lesenswert?

Hoffe jetzt ist es besser

1
.dseg
2
  frequ_hoch:
3
    .byte 1
4
  frequ_mittel:
5
    .byte 1
6
  frequ_nieder:
7
    .byte 1
8
  frequ_hoch_temp_temp:
9
    .byte 1
10
  frequenz_status:
11
    .byte 1
12
  zaehl_ergeb_spei:
13
    .byte 27
14
  zaehl_spei_lese_z:
15
    .byte 1
16
  zaehl_spei_schr_z:
17
    .byte 1
18

19
.cseg    
20
frequenzmessen_vor:
21
  ldi tmp1,0
22
  out TCCR1A,tmp1
23
  ldi tmp1,0b00000010
24
  out TCCR1B,tmp1
25
;Timer Interupt Mask
26
  in tmp1,TIMSK
27
  ori tmp1,0b00100100
28
  out TIMSK,tmp1
29
  ldi tmp1,0
30
  sts frequ_hoch,tmp1
31
  sts frequ_mittel,tmp1
32
  sts frequ_nieder,tmp1
33
  ret
34
 ;---------------------------------- 
35
frequenz_int1:
36
  push tmp6
37
  in tmp6,sreg
38
  push tmp6
39

40
;Lade Zählbyte für event. Timer1 Überlauf
41
;und erhöhe es um 1
42
  lds tmp6,frequ_hoch_temp_temp
43
  inc tmp6
44
  sts frequ_hoch_temp_temp,tmp6
45

46
  pop tmp6
47
  out sreg,tmp6
48
  pop tmp6
49
  reti
50
;-----------------------------------    
51
frequenz_start_stop:
52
  push tmp5
53
  push tmp6
54
  in tmp6,sreg
55
  push tmp6
56
  push xl
57
  push xh
58
  
59
;Lade den Zeiger der auf die akt Speicher-
60
;zelle in der Tabelle zeigt in tmp6
61

62
  lds tmp6,zaehl_spei_schr_z
63
  cpi tmp6,27
64
  brlo frequenz_start_stop_10
65

66
;Ist der Zeiger am Ende angekommen lade 0
67
;in den Zeiger (Tabellenanfang)
68

69
  ldi tmp6,0
70

71
frequenz_start_stop_10:
72

73
;Lade akt. Tabellenadresse in X
74

75
  ldi xl,low(zaehl_ergeb_spei)
76
  ldi xh,high(zaehl_ergeb_spei)
77
  add xl,tmp6
78
  clr tmp5
79
  adc xh,tmp5
80

81
;Speicher Zählerstände ab
82

83
  in tmp5,TCNT1L
84
  rcall frequenz_start_stop_100
85
  in tmp5,TCNT1H
86
  rcall frequenz_start_stop_100
87
  lds tmp5,frequ_hoch_temp_temp
88
  rcall frequenz_start_stop_100
89

90
;Lösche Timer1 Überlaufzähler
91

92
  ldi tmp5,0
93
  sts frequ_hoch_temp_temp,tmp5
94
  sts zaehl_spei_schr_z,tmp6
95

96
  pop xh
97
  pop xl
98
  pop tmp6
99
  out sreg,tmp6
100
  pop tmp6
101
  pop tmp5
102
  reti
103

104
frequenz_start_stop_100:
105
  st x+,tmp5
106
  inc tmp6
107
  ret
108
;-----------------------------------   
109

110
frequenz_berechnung:
111

112
;Lade in X Anfangadresse der Tabelle und
113

114

115
  ldi xl,low(zaehl_ergeb_spei)
116
  ldi xh,high(zaehl_ergeb_spei)
117

118
;in Y die Adresse der folgenden 3 Werte 
119

120
  mov yl,xl
121
  mov yh,xh
122
  ldi tmp5,3
123
  add yl,tmp5
124
  clr tmp3
125
  adc yh,tmp3
126
  
127
;Adressen für die indirekten Zeiger sind berechnet
128
frequenz_berechnung_10:    
129

130
Lade 6 Werte in die Register tmp5 - tmp10
131

132
  ld tmp5,x
133
  ld tmp8,y
134

135
  adiw x,1
136
  adiw y,1
137

138
  ld tmp6,x
139
  ld tmp9,y
140

141
  adiw x,1
142
  adiw y,1
143

144
  ld tmp7,x
145
  ld tmp10,y
146

147
  adiw x,1
148
  adiw y,1
149

150
;Berechne die Differenz aus den 2 x 3 Werten
151

152
  sub tmp5,tmp8
153
  sbc tmp6,tmp9
154
  sbc tmp7,tmp10
155

156
; Ist ein Übertrag entstanden Negiere
157
  
158
  brtc frequenz_berechnung_20
159
  neg tmp5
160
  neg tmp6
161
  neg tmp7
162
  
163
;Addiere die 8 Differenzen
164

165
frequenz_berechnung_20:
166
  lds tmp4,frequ_nieder
167
  add tmp4,tmp5
168
  sts frequ_nieder,tmp4
169

170
  lds tmp4,frequ_mittel
171
  add tmp4,tmp6
172
  sts frequ_mittel,tmp4
173

174
  lds tmp4,frequ_hoch
175
  add tmp4,tmp7
176
  sts frequ_hoch,tmp4
177

178
  inc tmp5
179
  cpi tmp5,9
180
  brsh frequenz_berechnung_40
181
  rjmp frequenz_berechnung_10
182

183
;Teile die Adierten Werte durch 8
184
;=Mittelwert
185

186
frequenz_berechnung_40:
187
  ldi tmp5,0
188

189
frequenz_berechnung_50:
190
  lds tmp7,frequ_hoch
191
  lsr tmp7
192
  sts frequ_hoch,tmp7
193
  
194
  lds tmp7,frequ_mittel
195
  ror tmp7
196
  sts frequ_mittel,tmp7
197
  
198
  lds tmp7,frequ_nieder
199
  ror tmp7
200
  sts frequ_nieder,tmp7
201
  
202
  inc tmp5
203
  cpi tmp5,4
204
  brlo frequenz_berechnung_50
205

206
;Springe zur Darstellung der Frequenz
207
  
208
frequenz_berechnung_100:
209
  ldi tmp3,199
210
  rcall frequenz_darstellen
211
  ret
#3424045
Lesenswert?

anfänger0815 schrieb:

> und voneinander abgezogen. Müßte normalerweise, wenn sich die Frequenz
> nicht ändert immer den gleichen Wert ergeben.

Das lässt sich ja testen.
Sind die Werte (im wesentlichen) immer gleich?

Dann wüsste man schon mal, warauf man genauer schauen muss: auf die 
Datenerfassung oder die Berechnung.

Auf Deutsch: schau dir halt mal die Werte an, die deine Datenerfassung 
liefert. Wenn die schon nicht plausibel sind, dann brauchst du dich erst 
mal um die ganze Subtraktion bzw. Mittelwertbildung nicht kümmern. Sind 
die Werte aber gut, dann kann man das alles in den Simulator laden und 
dort in Einzelschritten nachgehen und die Berechnung kontrollieren.
#3424051
Lesenswert?

>   in tmp1,TIMSK
>   ori tmp1,0b00100100
>   out TIMSK,tmp1

Das eine ist wohl der Overflow Interrupt.
Aber was ist der andere? Ist das ein Capture Interrupt?

Ich hab jetzt ehrlich gesagt keine Lust, mir aus dem Datenblatt 
rauszusuchen, welcher Interrupt das ist. Warum verwendest du da keine 
Bitnamen? Dann müsste man an dieser Stelle nicht das Datenblatt suchen.
#3424060
Lesenswert?

Aus dem Bauch heraus denke ich aber, dein Problem liegt in den gezählten 
Overflows.

Diesen Zähler setzt du nach jeder Messung wieder auf 0, den 
Timer-Counter lässt du aber weiter laufen.
Das ist ungefähr so, als ob du mit einer Uhr stoppen würdest (nur 
Sekunden) und zwar registrierst, dass du über 100 Sekunden kommst, dann 
aber die Hunderterstelle jeweils wieder auf 0 setzt.

d.h. du kriegst Werte von
1
   88
2
  123
3
   79
4
  101
5
   56
und wenn du da jetzt die Differenzen nimmst, dann kommt Unsinn raus. Du 
müsstest eigentlich Werte haben
1
   88
2
  123
3
  179
4
  201
5
  256
und dann kannst du auch mit den Differenzen rechnen.

Ist aber nur so ein Bauchgefühl. Wie gesagt: ich würde mir erst mal die 
aufgezeichneten Daten ansehen.
Gast #3424073
Lesenswert?

Das mit den Bitnamen habe ich noch nie gemacht. Müßte ich vielleicht 
langsam mal machen. Ich bin von Kindesbeinen auf gewohnt des so zu 
machen wie ich es halt mache. Tut mir scho leid. Werde mich aber mal 
drüber machen wie des so geht.
#3424086
Lesenswert?

anfänger0815 schrieb:
> Das mit den Bitnamen habe ich noch nie gemacht.

Dann wirds Zeit

Was ist (auf einem Mega16) der Unterschied zwischen
1
  in tmp1,TIMSK
2
  ori tmp1,0b00100100
3
  out TIMSK,tmp1]

und
1
  in tmp1,TIMSK
2
  ori tmp1, (1<<TICIE1) | ( 1<<TOIE1)
3
  out TIMSK,tmp1

Antwort: technisch gesehen - keiner
Die 2-te Form ist für Menschen aber besser lesbar. Du musst dir dazu 
noch nicht mal viel merken, denn die Bitnamen stehen im Datenblatt genau 
an der Stelle dabei, an der du dir sonst die Bits rausliest.

Und nach 3 mal machen hast du dir auch gemerkt, dass TOIE1 für "Timer 
Overflow Interrupt Enable vom timer 1" steht und TICIE1 für "Timer Input 
Capture Interrupt Enable vom timer 1" steht. D.h. beim Code lesen, 
kannst du ganz leicht im Code lesen, was du eigentlich eingeschaltet 
hast. Aus den binär-Bits siehst du das aber nicht so schnell.
Gast #3424172
Lesenswert?

Jetzt habe ich die ganze Geschichte umgeschrieben, den Timer 1 Überlauf 
mal "ausgeschaltet". Ein Problem habe ich jetzt aber immer noch, dei 
Anzeige ist zwar ruhiger aber zeigt zu viel an. Und da hätte ich gleich 
noch eine Frage: Wie verhält es sich mit dem Überlauf, wenn ich von 
einem Timerwert vor dem Überlauf einen Timerwert nach dem Überlauf 
abziehe? Ich denke mir ich muß dann per neg-Befehl ein Zweierkomplement 
machen. Aber wie mache ich des bei einer 3-Byte langen Zahl? Bei dem 
Komplement wird doch 1 hinzu addiert. Wie mach ich das wenn es dann 
einen Überlauf nach der Addition gibt?

1
.dseg
2
  frequ_hoch:
3
    .byte 1
4
  frequ_mittel:
5
    .byte 1
6
  frequ_nieder:
7
    .byte 1
8
  frequ_hoch_temp_temp:
9
    .byte 1
10
  frequenz_status:
11
    .byte 1
12
  zaehl_ergeb_spei:
13
    .byte 27
14
  zaehl_spei_lese_z:
15
    .byte 1
16
  zaehl_spei_schr_z:
17
    .byte 1
18

19
.cseg    
20
frequenzmessen_vor:
21
  ldi tmp1,0
22
  out TCCR1A,tmp1
23
;Vorverteiler durch 8
24
  ldi tmp1,0b00000010
25
  out TCCR1B,tmp1
26
;Timer Interupt Mask
27
  in tmp1,TIMSK
28
  ori tmp1, (1<<TICIE1 | 1<<TOIE1)
29
  out TIMSK,tmp1
30
  ldi tmp1,0
31
  sts frequ_hoch,tmp1
32
  sts frequ_mittel,tmp1
33
  sts frequ_nieder,tmp1
34
  ret
35
 ;---------------------------------- 
36
frequenz_int1:
37

38
;Bei Überlauf des Timer 1, Byte +1
39

40
  push tmp6
41
  in tmp6,sreg
42
  push tmp6
43

44
  lds tmp6,frequ_hoch_temp_temp
45
  inc tmp6
46
  ldi tmp6,0
47
  sts frequ_hoch_temp_temp,tmp6
48

49
  pop tmp6
50
  out sreg,tmp6
51
  pop tmp6
52
  reti
53
;-----------------------------------    
54
frequenz_start_stop:
55
  push tmp5
56
  push tmp6
57
  in tmp6,sreg
58
  push tmp6
59
  push xl
60
  push xh
61

62
;Tabelle mit Daten Füllen, 9 X 3 Datensatze  
63
  
64
  lds tmp6,zaehl_spei_schr_z
65
  cpi tmp6,27
66
  brlo frequenz_start_stop_10
67
  ldi tmp6,0
68

69
frequenz_start_stop_10:
70
  ldi xl,low(zaehl_ergeb_spei)
71
  ldi xh,high(zaehl_ergeb_spei)
72
  add xl,tmp6
73
  clr tmp5
74
  adc xh,tmp5
75

76
  in tmp5,TCNT1L
77
;Bis hierher 21 Takte
78
  rcall frequenz_start_stop_100
79
  in tmp5,TCNT1H
80
  rcall frequenz_start_stop_100
81
  lds tmp5,frequ_hoch_temp_temp
82
  rcall frequenz_start_stop_100
83
  sts zaehl_spei_schr_z,tmp6
84

85
  pop xh
86
  pop xl
87
  pop tmp6
88
  out sreg,tmp6
89
  pop tmp6
90
  pop tmp5
91
  reti
92

93
frequenz_start_stop_100:
94
  st x+,tmp5
95
  inc tmp6
96
  ret
97
;-----------------------------------   
98

99
frequenz_berechnung:
100

101
;Tabellenanfang nach X
102

103
  ldi xl,low(zaehl_ergeb_spei)
104
  ldi xh,high(zaehl_ergeb_spei)
105

106
;Durchlaufzähler mit 0 laden
107
  
108
  ldi tmp4,0
109
  
110
;Ersten sechs Werte auslesen
111
 
112
frequenz_berechnung_10:    
113
  ld tmp5,x+
114
  ld tmp6,x+
115
  ld tmp7,x+
116
  ld tmp8,x+
117
  ld tmp9,x+
118
  ld tmp10,x+
119

120
;X-Zeiger um drei Stellen zurück
121
;für nächsten Auslesezyklus  
122
  
123
  clc
124
  sbiw x,3
125

126
;Differenz Berechnen  
127
  
128
  sub tmp5,tmp8
129
  sbc tmp6,tmp9
130
  sbc tmp7,tmp10
131

132
;Wenn Übertrag dann negieren  
133
  
134
  brcc frequenz_berechnung_20
135
  neg tmp5
136
  neg tmp6
137
  neg tmp7
138

139
;Aufaddieren der einzelnen Werte  
140
  
141
frequenz_berechnung_20:
142
  lds tmp8,frequ_nieder
143
  lds tmp9,frequ_mittel
144
  lds tmp10,frequ_hoch
145

146
  add tmp8,tmp5
147
  adc tmp9,tmp6
148
  adc tmp10,tmp7
149
    
150
  sts frequ_nieder,tmp8
151
  sts frequ_mittel,tmp9
152
  sts frequ_hoch,tmp10
153

154
;Sind schon 8 Durchläufe gemacht worden
155
  
156
  inc tmp4
157
  cpi tmp4,8
158
  brsh frequenz_berechnung_40
159
  rjmp frequenz_berechnung_10
160

161

162
frequenz_berechnung_40:
163
  ldi tmp5,0
164

165
;Ergebnis durch 8 Teilen, Mittelwert  
166
  
167
frequenz_berechnung_50:
168
  lds tmp7,frequ_hoch
169
  lsr tmp7
170
  sts frequ_hoch,tmp7
171
  
172
  lds tmp7,frequ_mittel
173
  ror tmp7
174
  sts frequ_mittel,tmp7
175
  
176
  lds tmp7,frequ_nieder
177
  ror tmp7
178
  sts frequ_nieder,tmp7
179
  
180
  inc tmp5
181
  cpi tmp5,3
182
  brlo frequenz_berechnung_50
183

184
  
185
frequenz_berechnung_100:
186
  ldi tmp3,199
187
  rcall frequenz_darstellen
188
  ret
Gast #3424915
Lesenswert?

Hi

>Warum nicht?

Weil das 2er-Komplement einer 24-Bit-Zahl etwas anders ist, als das 
2er-Komplement der einzelnen Bytes. Bei einer 24-Bitzahl muss das so
1
neg24:                com r16
2
                      com r17
3
                      com r18
4
                      subi r16,Low(-1)
5
                      sbci r17,byte2(-1)
6
                      sbci r18,byte3(-1)
7
                      ret

aussehen. Die Register solltest du allerdings an dein Programm anpassen.

MfG Spess
Gast #3425172
Lesenswert?

Des mit dem Zweierkomplement ist leuchtet schon ein,ich verstehe die 
Befehle nicht so richtig:

                      subi r16,Low(-1)
                      sbci r17,byte2(-1)
                      sbci r18,byte3(-1)

Was subi und sbci machen ist mir klar, aber was dann nach dem Komma 
kommt erschließt sich mir nicht so ganz.
Gast #3428010
Lesenswert?

Könte man den Code:
1
neg24:                com r16
2
                      com r17
3
                      com r18
4
                      subi r16,Low(-1)
5
                      sbci r17,byte2(-1)
6
                      sbci r18,byte3(-1)
7
                      ret
auch so schreiben:
1
neg24:                com r16
2
                      com r17
3
                      com r18
4
                      ldi r19,1
5
                      add r16,r19
6
                      ldi r19,0
7
                      addc r17,r19
8
                      addc r18,r19
9
                      ret

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren