Forum: Mikrocontroller und Digitale Elektronik Programmieren mit CodeVisionAVR


von Vitalij K. (kingvita1989)


Lesenswert?

Hey Leute!

Habe folgendes Problem: Möchte ein simples Programm schreiben für den 
Mega8L Controller. Das drei LEDs jeweils an Port0 bis Port2 an und 
ausmacht. Wie mach ich das habe zwar schon paar Sachen gefunden jedoch 
gehen die Befehle bei Code Vision nicht ... Kennt sich einer mit 
CodeVision aus wie man da die Ports ansteuert etc. bin für jede hilfe 
sehr dankbar gerne auch links die C Programmierung erklären ambesten für 
CodeVision AVR. Außerdem wäre es sehr nett wenn einer so ein Prog für 
mich schreibt bzw. erklärt wie ich mit Code Vision das machen kann über 
die befehle outp u. ldi geht das leider nicht.

Danke schon mal im Vorraus

von Vitalij K. (kingvita1989)


Lesenswert?

Kann mir denn keiner helfen oder benutzt keiner CodeVisionAVR?

von crazy horse (Gast)


Lesenswert?

eilig? Dann helfen eigene Grundlagen am schnellsten weiter, denn sonst 
musst du beim nächsten kleinen Problem wieder 1/4h warten....
CodeVision ist ein C-Compiler, was du da machen willst, ist Assembler.
Programme schreibe ich grundsätzlich nur gegen Bares. Wenn du einzelne 
spezielle Probleme hast, helfe ich dir gerne.

von Vitalij K. (kingvita1989)


Lesenswert?

Ja ich will ja bei CodeVisionAVR Programmieren weiß nur nicht wie man 
z.b Ports zu weißt bzw. Register kann mir vllt einer einen anfang 
schreiben damit ich das prinzip verstehen kann wäre echt nett sonst komm 
ich nie weiter suche schon paar tage im inet aber mit codevision gibs 
fast nix

von crazy horse (Gast)


Lesenswert?

du brauchst auch (fast) nichts speziellen zu CV, ist halt ein normaler 
C-Compiler. Und wenn du dann noch den CodeWizard von CV benutz, bist du 
mit deinem Programm schon fast fertig.

von Markus L. (lucky79)


Lesenswert?

wenns nicht unbedingt CodeVision sein muss, dass lade dir das WinAVR 
Package runter und installier das mal, dazu gibts viele viele Tutorials 
im Netz.

Auszug für Dein Problem:
1
PORTB |= 0x07;

schreint in das Register PORTB deb Wert 0x03 => 0b00000111 was soviel 
heißt wie PB2 PB1 und PB0 auf 1.
Funktion: schaltet die LEDs aus...

Das Gegenteil erreichst du mit
1
PORTB &= ~0x03;

das schaltet PB2, PB1 und PB0 auf 0 => LEDs leuchten.

Beschaltung:

VCC --> LED --> R --> AVR PORTBx

Immer sorum schalten, da ein Port mehr Strom aufnehmen als treiben kann 
(sdiehe Datenblatt).



Ich glaube im CodeVision funktioniert das ähnlich (aber ohne Gewähr)

Grüße,
Markus

von Vitalij K. (kingvita1989)


Lesenswert?

#include <Mega8.h>
void main(void) {

PORTD.0=1111110; // Port D0 auf Masse

}



Ist das Prog richtig kann ich dadurch die LED an Port D0 anmachen? Oder 
Wie muss ich das bei Code Vision schreiben?

von crazy horse (Gast)


Lesenswert?

erstmal musst du dem Port sagen, dass es ein Ausgang sein soll.
Entweder so wie oben, allerdings mit DDRx. Oder mit der CV-spezifischen 
(nicht ganz C-conformen, aber sehr angenehmen) Biterweiterung.

DDRD.0=1;  //als Ausgang
PortD.0=0;  ((Ausgang auf low schalten

von Vitalij K. (kingvita1989)


Lesenswert?

habe das Prog soweit erweitert


#include <Mega8.h>
void main(void) {

DDRD.0=1; // Als Ausgang setzen
PORTD.0=0; // Ausgang auf low (Masse) schalten
}



kann ich das jetzt auf den Controller brennen und die LED wird 
eingeschatet sein?

oder fehlt da noch was ?

von Vitalij K. (kingvita1989)


Lesenswert?

@crazy horse

kannst du mir da weiter helfen eventuell das progschreiben. Das die LED 
an PORTD0 an /aus macht. danke schon mal

von crazy horse (Gast)


Lesenswert?

das ist doch völlig sinnfrei. Du musst doch auf irgenwas reagieren, 
zumindest mal blinken lassen oder sowas.
Soll sie nur leuchten, schliess sie doch ganz ohne Controller und 
Software an.

von Vitalij K. (kingvita1989)


Lesenswert?

ja dann eben blinken wie muss ich das programm dann dafür schreiben etwa 
so?

#include <Mega8.h>
void main(void) {

DDRD.0=1; // Als Ausgang setzen
PORTD.0=0; // Ausgang auf low (Masse) schalten LED an
PORTD.0=1  // Ausgang auf high schalten LED aus
}


kannst du mir weiterhelfen bitte

von crazy horse (Gast)


Angehängte Dateien:

Lesenswert?

du bist ja echt penetrant :-)

von Vitalij K. (kingvita1989)


Lesenswert?

Danke schön !!! sehr nett mal sehen ob es läuft...

von Vitalij K. (kingvita1989)


Lesenswert?

while (1)
      {PORTD.0=0;
       delay_ms (500);
       PORTD.1=0;
       delay_ms (500);
       PORTD.0=1;
       PORTD.1=1;
       delay_ms (500);


      };
}


danke für den code aber hab da noch paar fragen... muss das nicht

PORTD.0=0;
delay_ms(500);
PORTD.0=1;
delay_ms(500);
PORTD.0=1
PORTD.0=0;
delay_ms(500);


heißen oder wieso schreibst du PORTD.1.=1 Das heißt doch PortD1 ist auf 
high 5v oder nicht?

von crazy horse (Gast)


Lesenswert?

ich denke, du willst auch mit PortD.1 und PortD.2 was spielen?
"PORTD.1.=1 Das heißt doch PortD1 ist auf high 5v" Genau das.

von Vitalij K. (kingvita1989)


Lesenswert?

ja hab das programm jetzt in den controller geschoßen  geht aber nicht 
wie machst du das denn einfach speicher als asm oder h. und dann bei 
ponyprog laden...? kann man irgendwie bei code vision eine hex datei 
erzeugen?

von JojoS (Gast)


Lesenswert?

Vitalij, ist 1989 dein Geburtsjahr? Wenn ja, dann solltest du nur den 
WinAVR komplett runterladen und das AVR Tutorial. Dann das Internet 
abschalten und das Tutorial mal richtig durcharbeiten, danach wird die 
LED blinken. Aber nicht wenn du irgendwelches zusammengegoogeltes Zeug 
durcheinander wirfst.

von Willi W. (williwacker)


Lesenswert?

Vitalij K. wrote:
> ja hab das programm jetzt in den controller geschoßen  geht aber nicht
> wie machst du das denn einfach speicher als asm oder h. und dann bei
> ponyprog laden...? kann man irgendwie bei code vision eine hex datei
> erzeugen?

Du musst in CV ein Projekt erzeugen, Deine C-Datei dem Projekt 
hinzufügen, unter Projekteinstellungen den korrekten Controller 
auswählen und dann kompilieren (fehlerfrei sach ich mal) und dann kommt 
die hex-Datei ganz von alleine. Und dann klappts auch mit dem Blinken 
...

von Willi W. (williwacker)


Lesenswert?

Ach ja, eins noch: warum hast Du es auf einmal so eilig? 19 Jahre ging 
es ohne CV und dann wirst Du bereits nach 10 Minuten ohne Antwort 
unruhig?

Einfach mal diesen Thread durchsuchen, da gibt es mehrere Anfängerfragen 
- und auch andere - zum CV.

von Vitalij K. (kingvita1989)


Lesenswert?

Danke für alle tips hab jetzt ein Programm geschrieben welches drei LED 
nacheinander blinken lässt:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 19.03.2008
Author  :
Company :
Comments:


Chip type           : ATmega8L
Program type        : Application
Clock frequency     : 4,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out 
Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 
State0=0
PORTD=0x00;
DDRD=0x07;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {



       PORTD.0=0;
       delay_ms (100);
       PORTD.0=1;

       PORTD.1=0;
       delay_ms (100);
       PORTD.1=1;

       PORTD.2=0;
       delay_ms (100);
       PORTD.2=1;



      };
}


möchte aber jetzt über einen Taster sie wieder ausschalten können:

Macht man das mit dem if-Befehl, wenn ja wäre ich für ein Beispiel sehr 
dankbar.

ich dachte da ansowas in der art hat aber nicht geklappt


 if (PORTB.0=0)  // Taster an PORTB.0 angeschloßen durch drücken ist 
PORTB.0 auf low (GND)

      {

       PORTD.0=1;  //LED an PORTD.0 geht aus

      };

von Johannes M. (johnny-m)


Lesenswert?

> if (PORTB.0=0)
Das ist ja auch Unsinn! Der "="-Operator ist ein Zuweisungs-Operator. Du 
willst hier aber sicher keine Zuweisung, sondern einen Vergleich machen. 
Dazu musst Du dann den Vergleichsoperator "==" benutzen.
1
if(PORTB.0 == 0)
2
{}
oder kürzer
1
if(!PORTB.0)
2
{}

von Vitalij K. (kingvita1989)


Lesenswert?

Habe jetzt das Programm geändert um den Effekt besser zusehen. Aber das 
mit dem Taster die eine LED ausschalten funktioniert leider nicht mache 
ich was bei dem IF-Befehl falsch ?

while (1)
      {


       PORTD.0=0;      //LED 1 an


       PORTD.1=0;      //LED 2 an


       PORTD.2=0;      //LED 3 an


      if (PORTB.0==0)  // Taster an PORTB.0 angeschloßen durch drücken 
ist PORTB.0 auf low (GND)

      {

       PORTD.0=1;  //LED an PORTD.0 geht aus

      };



      };

von Sven (Gast)


Lesenswert?

@ Vitalij K.:

Hast Du den CodevisionAVR Compiler gekauft ?

Gruß Sven

von Vitalij K. (kingvita1989)


Lesenswert?

jap unzwar hier-> http://www.delcomp.com/codevision/download.htm


kann mir denn einer weiter helfen bei meinem problem mit dem taster bzw. 
if-befehl

von Kai E. (kai20)


Lesenswert?

Hallo Vitalij,

mit deinem Programm schaltest du die LED sehr sehr kurz aus,
sodass du es nicht siehst.
Gehe mal dein Programm durch und versuche doch mal nachzuvollziehen,
was genau geschieht...

Es wäre sicherlch sinnvoller, wenn du dich etwas in das AVR Tutorial
und in die C Programmierung einliest und dann erst mit einem einfachen
Programm beginnst.

Grüße,
Kai

von Vitalij K. (kingvita1989)


Lesenswert?

@KAI

Ich habe mich in AVR Tutorial eingelesen leider funktionieren die 
befehle bei CodeVision nicht :

mein Programm macht ja nix anderes als die drei LEDs einschalten

       PORTD.0=0;      //LED 1 an


       PORTD.1=0;      //LED 2 an


       PORTD.2=0;      //LED 3 an

und dann wollte ich über den Taster die erste LED ausschalten in dem ich 
das mit dem If-Befehl vergleiche oder muss das anders geregelt werden im 
AVR-Tutorial wird das ja über kopieren gemacht

 in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 
einlesen
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife


aber wie geht das bei CodeVision ich dachte über den IF-Befehl so

if (PORTB.0==0)  // Taster an PORTB.0 angeschloßen durch drücken ist 
PORTB.0 auf low (GND)

      {

       PORTD.0=1;  //LED an PORTD.0 geht aus

      };
BITTE um hilfe komme nicht weiter

von Karl H. (kbuchegg)


Lesenswert?

Vitalij K. wrote:
> @KAI
>
> und dann wollte ich über den Taster die erste LED ausschalten in dem ich
> das mit dem If-Befehl vergleiche oder muss das anders geregelt

Nö. Das dürfte schon stimmen.
Nur was du übersiehst ist, daß dein Prozessor diese Schleife
ein paar Zehntausendmal in der Sekunde abarbeitet.

D.h. Wenn die Taste gedrückt ist, dann schaltet sie der
nächste Schleifendurchgang gleich wieder ein, woraufhin
sie das if wieder ausschaltet, usw. Deine LED blinkt
also in Wirklichkeit. Rasend schnell, aber sie blinkt!
1
int main()
2
{
3
  DDRD = 0x07;
4
5
  DDRB = 0x00;
6
  PORTB = 0x01;     // Pullup Widerstand an PB0 einschalten
7
8
  while (1)
9
  {
10
    if( PORTB.0 == 0 )  // Ist Taste1 gedrückt ?
11
      PORTD.0 = 1;      // Ja: LED 1 aus
12
    else
13
      PORTD.0 = 0;      // Nein: LED 1 an
14
  }
15
}

von Vitalij K. (kingvita1989)


Lesenswert?

Habe das Programm jetzt so umgeschrieben aber die erste LED geht immer 
noch nicht aus wo liegt der fehler?


#include <mega8.h>

void main(void)
{

DDRD= 0x07;         //PORTD.0 bis PORTD.2 ist auf Ausgang gesetzt

DDRB=0x00;          //PORTB.0 ist auf Eingang gesetzt
PORTB=0x01;         //Pullup widerstnd an PORTB.0 ist an


while (1)
{


if (PORTB.0==0)     //Ist PORTB.0 auf Eingang?
{

PORTD.0=1;          //JA dann LED1 aus

}


else
{

PORTD.0=0;           //NEIN dann LED1 weiterhin an

};

};

}

von crazy horse (Gast)


Lesenswert?

Du wirst ohne Kenntnis der Prozessorarchitektur und ohne wirklich ganz 
elementare C-Kenntnisse nicht weiterkommen.
Nimm die Hinweise von allen Seiten ernst und arbeite dich durch. Damit 
meine ich nicht durchlesen, sondern verstehen.
Mein letzter Tip in dieser Sache: willst du einen Eingang lesen, musst 
du das PINx-Register als Datenquelle wählen. PORTx liest immer nur das, 
was reingeschrieben wurde, nicht den wirklichen Eingangspegel.
Also  nicht
if (PORTB.0==0)

sondern
if (PINB.0==0)

von Karl H. (kbuchegg)


Lesenswert?

Vitalij K. wrote:
> Habe das Programm jetzt so umgeschrieben aber die erste LED geht immer
> noch nicht aus wo liegt der fehler?

Mist. Mein Fehler.

Wenn man den externen Status an einem Port abfragen will, dann
macht man das über das PIN Register, nicht PORT
1
#include <mega8.h>
2
 
3
void main(void)
4
{
5
  DDRD = 0x07;         //PORTD.0 bis PORTD.2 ist auf Ausgang gesetzt
6
 
7
  DDRB = 0x00;          //PORTB.0 ist auf Eingang gesetzt
8
  PORTB = 0x01;         //Pullup widerstnd an PORTB.0 ist an
9
 
10
  while (1)
11
  {
12
    if (PINB.0 == 0)     //Ist PORTB.0 auf Eingang?
13
    {
14
      PORTD.0 = 1;          //JA dann LED1 aus
15
    }
16
    else
17
    {
18
      PORTD.0 = 0;           //NEIN dann LED1 weiterhin an
19
    }
20
  }
21
}


Und arbeite an deiner Quelltextformatierung! Der Stil in dem
du zur Zeit schreibst ist einfach nur grauslich. Ein guter
Stil hilft auch bei der Übersicht in einem Programm. Jede
2.te Zeile als Leerzeile auszuführen bewirkt nur eines: Das
Programm wird völlig unnötig in die Länge gezogen.

von Vitalij K. (kingvita1989)


Lesenswert?

JA wo kann ich das denn alles nachlesen im AVR-Tutorial ist ja nix auf 
CodeVision bezogen . Kannst du mir paar links schicken oder einbeispiel 
geben und erklären was was ist.....

von Kai E. (kai20)


Lesenswert?

Hallo nochmal,

bist du sicher, dass überhaupt dein Programm ausgeführt wird,
also z.B. deine Fuse Bits korrekt gesetzt/gelöscht sind ?
Also für z.B. externe Clock ein Quarz angeschlossen ist etc ?

Füge einfach mal VOR dem while(1)

PORTD.0=0;
delay_ms(500);
PORTD.0=1;
delay_ms(500);
PORTD.0=0;

hinzu.
Wenn die LED den Zustand nicht ändert, wird dein Programm gar nicht 
ausgeführt...

Grüße,
Kai

von Johannes M. (johnny-m)


Lesenswert?

> JA wo kann ich das denn alles nachlesen im AVR-Tutorial ist ja nix auf
> CodeVision bezogen . Kannst du mir paar links schicken oder einbeispiel
> geben und erklären was was ist.....
AVR-GCC-Tutorial
Bezieht sich zwar auf den GCC, geht aber (bis auf die Einbindung der 
Bibliotheken und einiger Funktionen) auch mit CodeVision.

von Karl H. (kbuchegg)


Lesenswert?

Vitalij K. wrote:
> JA wo kann ich das denn alles nachlesen im AVR-Tutorial ist ja nix auf
> CodeVision bezogen .

Das macht herzlich wenig. Die Prinzipien, wie ein Megaxx funktionioniert
sind immer noch die Gleichen.

Und soweit wirst du schon noch abstrahieren können, dass ein

   PORTB = ( 1 << PB0 );

einem

   PORTB.0 = 1;

entspricht. In beiden Fällen wird das Bit 0 am Port B auf 1
gesetzt. Beim Codevision steckt das Bit 0 hier:   PORTB.0
                                                       ***
und beim gcc steckt es in der Syntax hier:  1 << PB0
                                                 ***

von Vitalij K. (kingvita1989)


Lesenswert?

@Karl heinz Buchegger  viele dank für die Hilfe nur leider funktioniert 
das Programm immer noch nicht

die LEDs leuchten alle, jedoch geht die erste LED beim betätigen des 
Tasters nicht aus eine Idee warum nicht?

von Karl H. (kbuchegg)


Lesenswert?

Vitalij K. wrote:
> @Karl heinz Buchegger  viele dank für die Hilfe nur leider funktioniert
> das Programm immer noch nicht
>
> die LEDs leuchten alle, jedoch geht die erste LED beim betätigen des
> Tasters nicht aus eine Idee warum nicht?

Was weis ich, Verkabelung?
(Dein Blinktest hat doch funktioniert, oder nicht?. Nur damit
man ausschliessen kann, dass das Pgm gar nicht gebrannt wurde)

Was it mit dem hier?
1
#include <mega8.h>
2
 
3
void main(void)
4
{
5
  DDRD = 0xFF; 
6
  DDRB = 0x00;
7
  PORTB = 0xFF;
8
 
9
  while (1)
10
  {
11
    PORTD = PINB;
12
  }
13
}

Ein paar Taster am Port B an paar LED am Port D, und wenn
du an den Tastern rumspielst, müsste sich auf der gleich-zahligen
LED was tun. (Also LED 0 müsste auf Taster 0 reagieren, Led 1 auf
Taster 1, usw.)

Die Taster muessen nach Masse schalten. D.h. der Port Pin am Port B
ist bei nicht gedrückten Taster auf +5V (mit Voltmeter nachmessen)
und wenn die Taste gedrückt ist, dann ist der Pin auf 0V (ebenfalls
mit Voltmeter nachmessen)

von Kai E. (kai20)


Lesenswert?

Hi nochmal,

im Forum unter Linksammlung - Tutorials und Beispiele - C sind einige 
Links,
es macht Sinn, dich dort durchzuarbeiten !

Kai

von Vitalij K. (kingvita1989)


Lesenswert?

@ Kai

Das Programm wird ausgeführt die LED veränder ihren zustand hab ich grad 
ausprobiert

von Marc M. (bytewood) Benutzerseite


Lesenswert?

@Vitalij

Wie schon so oft gesagt, lies und verstehe das AVR-GCC-Tutolial

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Nicht jeder C-Compiler versteht den direkten Zugriff auf ein Bit à la 
PORTB.x=1 oder PORTB.1=0.

Aber der Codevision versteht auch PORTB|=(1<<x) bzw. PORTB&=~(1<<x), wie 
es im AVR-GCC-Tutorium steht.

Also kannst Du die Beispiele aus dem Tutorium genauso anwenden, wie sie 
auch drin stehen.

von Vitalij K. (kingvita1989)


Lesenswert?

Hey Leute abgesehn von dem Programm mit dem Taster. Gibt es ne 
Möglichkeit bei dem Programm was ich für das LED-Lauflicht geschrieben 
habe die geschwindigkeit per Trimmer oder noch besser per Poti 
einzustellen. Falls ja hat einer ne idee wie man das mach hardwaremäßig 
und auch mit dem code:

hier mein Lauflicht Programm

#include <mega8.h>
#include <delay.h>

void main(void)
{

PORTD=0x00;
DDRD=0x07;


while (1)
      {
       PORTD.0=0;
       delay_ms (100);
       PORTD.0=1;

       PORTD.1=0;
       delay_ms (100);
       PORTD.1=1;

       PORTD.2=0;
       delay_ms (100);
       PORTD.2=1;
      };
}

von Johannes M. (johnny-m)


Lesenswert?

Hmmm, ich bin sicher, dass schon mehrfach auf das AVR-GCC-Tutorial 
hingewiesen wurde...

von crazy horse (Gast)


Lesenswert?

ich glaube auch, dass dein Bonus nun aufgebraucht ist.
Setz dich hin, mach mal was selbst. zeige, was du gemacht hast (ausser 
irgendwas zusammenkopiertes) und dann gehts auch mit der Hilfe weiter.

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.