www.mikrocontroller.net

Forum: Compiler & IDEs UART-Senden fehlgeschlagen


Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>

void main (void)
{



UCSRB |= (1<<RXEN);                         //Empfangen aktivieren
UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

  UBRRH = 00;                         //Baudrate einstellen 9600 bei 8 
MHz
  UBRRL = 51;


while (!(UCSRA & (1<<RXC)));    //warten bis senden fertig


  PORTB = UDR;        //schicke ein a über die schnittstelle

}



Warum leuchten die an PortB angeschlossenen Leuchtdioden nicht bis auf 
eine auf, wenn ich     0x7F über mein Terminal schicke?

Danke!

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was passiert, wenn du 0x80 (d.h. ~0x7F) schickst? ;)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wär's wenn du die Port-Bits überhaupt erst einmal als Ausgang 
konfigurierst?

Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke erstmal.

Sorry, die PortBins habe ich bereits als Ausgänge definiert, habe 
allerdings vergessen diese neuere version hier zu posten ;)

Also ich hatte wohl einen denkfehler, denn ich kann ja nicht in das 
Terminal 0x7F eingeben, da jedes einzeln eingegebene Zeichen: 0 und x 
und 7 und F jeweils das UDR (welches ja nur 8 Bit hat) belegt. Das 
heißt, ich kann nur einen wert eingeben.
Aber: wie kann ich dann andere werte eingeben (also nicht nur 1 Ziffer)?


danke

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ JKK

Erzähl' mal etwas mehr...

Woher weiss der ???, dass er mit 8 MHz laufen soll bzw. tut er das auch 
sicher?
http://www.mikrocontroller.net/articles/AVR_Checkl...

Wie ist die physikalische Verbindung zwischen µC und PC, d.h. liegt 
kommt das Signal TX vom PC irgendwann auf den Eingang RX vom µC? Ist auf 
dem PC auch 9600 8N1 kein Handshake eingestellt?
http://www.mikrocontroller.net/articles/AVR_Checkl...

Und ein paar Feinheiten zu deinem Programm...
#include <avr/io.h>

int main (void)                   // <=== (1)
{
  DDRB = 0xFF;                    // PORTB Ausgang <=== (2)

  UCSRB |= (1<<RXEN);             //Empfangen aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // 8N1
  UBRRH = 0;                      //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;

  while (1)                       // <=== (3)
  {
     while (!(UCSRA & (1<<RXC))); //warten bis senden fertig
     PORTB = UDR;                 //Zeichen auf PORTB-LEDs anzeigen
  }
}

(1) siehe C Standard

(2) siehe Antwort von Andreas Kaiser und 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

(3) siehe 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
Punkt (5)

Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
außerdem wenn ich "9" ins terminal ausgebe, leuchten die leds nicht 
binär 9. Warum?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JKK wrote:
> außerdem wenn ich "9" ins terminal ausgebe, leuchten die leds nicht
> binär 9. Warum?


Weil, wenn du auf deiner Tastatur "9" drückst, der ASCII Code
für "9" übertragen wird. Vergiss dass auf deiner Taste eine 9
steht, die eine Zahl darstellt. Das sind einfach nur Buchstaben
die übertragen werden. Und für jeden 'Buchstaben' wird sein
ASCII Code übertragen. Für den Buchstaben "9" eben der
Code 0x39 oder eben binär 00111001

Such dir im Web eine ASCII Tabelle und kontrollier mal mit
deinen LED, ob das was du drückst auch angezeigt wird.

Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, das habe ich mir vorhin auch schon gedacht, dass es mit dem 
ASCII-Code zutun hat.

Aber wie kann ich dann einen String empfangen? Sprich Zeicheneingabe und 
sobald ENTER gedrückt wird (am Terminal) soll er es auf den Port 
ausgeben.


Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JKK wrote:
> Aber wie kann ich dann einen String empfangen?

Indem du (zb. in einer Schleife) Zeichen für Zeichen
empfängst und jedes empfangene Zeichen zb in einem
Array ablegst.

> Sprich Zeicheneingabe und
> sobald ENTER gedrückt wird (am Terminal)

Das ENTER wird genauso übertragen. Ist ein Zeichen wie
jedes andere. Aber dein µC Programm erkennt daran, dass
der String jetzt komplett übertragen wurde, dass also
das Array alle Zeichen enthält.

In guter alter C-Manier sollte jetzt im Array noch ein
'\0' Character angehängt werden, damit das Ganze auch
formal zu einem C-String wird.

> soll er es auf den Port
> ausgeben.

Was soll er auf den Port ausgeben?
Einen String kannst du nicht auf einem Port ausgeben. Ein
String besteht aus mehreren Zeichen.
(OK. Man könnte das Ganze Zeichen für Zeichen ausgeben.
Technisch kein Problem, aber trotzdem relativ sinnlos).

Was du wahrscheinlich willst:
Du übertragst den String "123"
und der µC soll das Bitmuster für die Zahl 123 am Port
ausgeben.

Du musst zwischen den Dingen trennen: Übertragen wird
immer ein Text. Den fängst du in einem char-Array auf
und hast daher einen String.

Deine nächste Frage ist daher:
Wie kann ich einen String, der eine Zahl beinhaltet, in
die Zahl umwandeln.

Und die Antwort: Schau dir mal die Funktion atoi() an.

Übrigens würde ich dir empfehlen, anders weiter zu machen:
Fang mal damit an, eine Sendefunktion zu schreiben, die
dir einen C-String zum PC schicken kann.
Diese Funktion benutzt du dann, um zu kontrollieren, ob dein
empfangener String korrekt ist.
Erst dann, wenn du weist, dass der empfangene String korrekt
ist, beschäftigst du dich dann mit der Umsetzung in eine Zahl.

Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Tipp, aber irgendwie verstehe ich noch nicht so 
ganz, wie ich nun atoi in mein Programm einbaue. Auch die Beispiele, die 
man im Netz dazu findet, bringen mich nicht wirklich weiter.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann schreib dein Programm doch mal soweit du kommst. Um das atoi() kann 
man sich kümmern, wenn es soweit ist.

Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <stdlib.h>

int main (void)                   // <=== (1)
{

  char Input ;
  int i=0;
  DDRB = 0xFF;                    // PORTB Ausgang <=== (2)

  UCSRB |= (1<<RXEN);             //Empfangen aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // 8N1
  UBRRH = 0;                      //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;

  while (1)                       // <=== (3)
  {

   while (!(UCSRA & (1<<RXC))); //warten bis senden fertig
                      //Zeichen auf PORTB-LEDs anzeigen

    Input = UDR;
    PORTB = atoi(Input);



  }
}


die atoi heißt doch  "Ascii-to-integer"....Aber ich verstehe den 
Zusammenhang noch nicht ganz. ich möchte wie ihr oben beschribene habt, 
bis zum Enter-Eingeben den Zahlenstring (z.b. dez.128) binär auf den 
PortC ausgeben.
Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sagte doch, du benötigst ein char-ARRAY um dort den
String zwischenzuspeichern.

Wenn du mit String - Verarbeitung in C auf Kriegsfuss stehst,
dann solltest du den Ankauf von Literatur in Erwägung ziehen.
Das sind absolute C-Grundkenntnisse.
Solange du auf dein Buch wartest, kannst du das allernotwendigste
auch hier nachlesen:
http://www.mikrocontroller.net/articles/FAQ#Wie_fu...
#include <avr/io.h>
#include <stdlib.h>

int main (void)                   // <=== (1)
{
  char c;
  char Input[200];
  int i=0;
  DDRB = 0xFF;                    // PORTB Ausgang <=== (2)

  UCSRB |= (1<<RXEN);             //Empfangen aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // 8N1
  UBRRH = 0;                      //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;

  while (1)                       // <=== (3)
  {

    while (!(UCSRA & (1<<RXC))); //warten bis senden fertig
                      //Zeichen auf PORTB-LEDs anzeigen
    c = UDR;

    if( c != '\n' )
    {
      Input[i] = c;
      i++;
    }

    else
    {
      Input[i] = '\0';
      PORTB = atoi(Input);
      i = 0;
    }
  }
}

Autor: BlauZahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm anscheinend funktioniert das beispiel von k.h.buchegger auch 
nicht...

Habe es nun reingeladen und wenn ich beispielsweise ins Terminal "193" + 
ENTER eingebe, ändert sich nix an meinen LEDs (die nachwievor alle 
leuchten)

danke

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionieren ist, was du definierst. Was machen tut es hoffentlich, 
oder?

Du hast immer noch nicht diese Fragen beantwortet:

Woher weiss der ???, dass er mit 8 MHz laufen soll bzw. tut er das auch
sicher?
http://www.mikrocontroller.net/articles/AVR_Checkl...

Wie ist die physikalische Verbindung zwischen µC und PC, d.h. liegt
kommt das Signal TX vom PC irgendwann auf den Eingang RX vom µC? Ist auf
dem PC auch 9600 8N1 kein Handshake eingestellt?
http://www.mikrocontroller.net/articles/AVR_Checkl...

Nur wenn beide Fragen positiv beantwortet sind, hat der µC überhaupt 
eine Chance, das Programm sinnvoll auszuführen.

Und selbst dann gilt:

"Die Hälfte seines Lebens debuggt der Programmierer vergebens!"

Debuggen kann heissen, an strategischen Stellen zusätzliche, markante 
Aktionen ausführen lassen. Dadurch sieht man, bis wohin sich der µC im 
Programmcode vorgehangelt hat.
#include <avr/io.h>
#include <stdlib.h>

// 0 Debugging AUS
// 1 Debugging AN
#define DEBUG 1

#if DEBUG
#ifndef F_CPU
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert 
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb 
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
   "nachträgliche" Definition hinweist */
#warning "F_CPU war noch nicht definiert, wird nun mit 8000000 definiert"
#define F_CPU 8000000UL /* Quarz mit 8 Mhz */
#endif

// siehe AVR-GCC-Tutorial 
// Abschnitt Warteschleifen
#include <util/delay.h> 

// 10*25ms = 250ms warten
#define DELAY_250MS()           \
   for (int j = 0; j < 10; j++)
     delay_ms(25);

#define DELAY_1000MS()          \
   for (int j = 0; j < 40; j++) \
     delay_ms(25);
   

static void fehlersuchen(unsigned char x)
{
   static unsigned char lx = 0;

   switch(x)
   {
      case 0:
         // Effekt 1
         // LED Lauflicht, wenn ein '\n' erkannt wurde
         for(int i = 0; i < 8; i++)
         {
            PORTB = ~(1 << i);
            // 10*25ms = 250ms warten
            for (int j = 0; j < 10; j++)
               delay_ms(25);
         }
         for(int i = 7; i >= 0; i--)
         {
            PORTB = ~(1 << i);
            for (int j = 0; j < 10; j++)
               delay_ms(25);
         }
         // 40*25ms = 1000ms warten
         for (int j = 0; j < 40; j++)
            delay_ms(25);
         break;
      case 255:
         // Effekt 2
         // Eine LED blinkt, wenn auf ein Zeichen gewartet wird
         for (int j = 0; j < 10; j++)
           delay_ms(25);
         PORTB ^= 0x80;
         for (int j = 0; j < 10; j++)
           delay_ms(25);
         break;
      default:
         // Effekt 3
         // LED zeigt die Zahl der empfangenen Zeichen im Puffer Input an
         for (int j = 0; j < 10; j++)
           delay_ms(25);
         PORTB = ~x;
         for (int j = 0; j < 10; j++)
           delay_ms(25);
         break;
   }
}
#else
#define fehlersuchen(x)
#endif

int main (void)                   // <=== (1)
{
  char c;
  char Input[200];
  int i=0;
  DDRB = 0xFF;                    // PORTB Ausgang <=== (2)
  PORTB = 0xFF;                   // alle LED aus #1

  UCSRB |= (1<<RXEN);             //Empfangen aktivieren
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // 8N1
  UBRRH = 0;                      //Baudrate einstellen 9600 bei 8 MHz
  UBRRL = 51;

  while (1)                       // <=== (3)
  {
    while (!(UCSRA & (1<<RXC)))
    {
       // warten bis senden fertig
       fehlersuchen(255);
    }
    c = UDR;

    if( c != '\n' )
    {
      Input[i] = c;
      i++;
      fehlersuchen(i);
    }
    else
    {
      fehlersuchen(0);
      Input[i] = '\0';
      PORTB = ~atoi(Input); // #1
      i = 0;
    }
  }
}

Da hier im Beispiel im Debugmodus einfache Warteschleifen benutzt 
werden, muss man jetzt zwischen den einzelnen Tastendrücken 1-2 Sekunden 
warten, damit keine Zeichen verloren gehen. Dafür sieht es lustig aus 
;-)

#1

> ...ändert sich nix an meinen LEDs (die nachwievor alle leuchten)

Deine LEDs scheinen wie auf dem STK500 beschaltet zu sein, d.h. LED an, 
wenn PORT-Pin LOW ist.

Autor: JKK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also...ich verwende ein STK500. Einen ATMega8515 und ich habe die 
Taktfrequenz des Controllers über die Fuses (Internal RC Osc.) auf 8 MHz 
gesetzt.

Kurze Zwischenfrage, zwecks verunsicherung:  welchen Unterschied gibt es 
zwischen "Taktfrequenz durch Fuses setzen" und "Project -> Configuration 
Options -> frequenzy"?


Die LEDs leuchten am STK500 anfangs alle. Dann stelle ich im 
HyperTerminal ein 9600 baud, usw. Flusssteuerung "keine", und lokales 
Echo "an".

Dann tut sich nix! D.h. die LEDs leuchten genauso wie vorher, nämlich 
alle.


danke

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JKK wrote:
> also...ich verwende ein STK500. Einen ATMega8515 und ich habe die
> Taktfrequenz des Controllers über die Fuses (Internal RC Osc.) auf 8 MHz
> gesetzt.

Internal RC Osc. ist keine gute Ausgangsvoraussetzung für eine 
funktionierende UART-Kommunikation zumindest nicht bei 9600 Baud. 
Näheres kannst du im obigen Link nachlesen und in den Tutorialartikeln 
über UART und in der Baudratentabelle im Datenblatt (max. Fehler sollte 
< 2% sein).

> Kurze Zwischenfrage, zwecks verunsicherung:  welchen Unterschied gibt es
> zwischen "Taktfrequenz durch Fuses setzen" und "Project -> Configuration
> Options -> frequenzy"?

Damit der µC mit einer bestimmten Taktquelle läuft, muss diese 
Taktquelle körperlich vorhanden sein. Das stellst du durch das Design 
des Boards (externer Quarz etc.) oder Jumpereinstellungen etc. sicher.

Und die Taktquelle muss vom µC angesprochen werden z.B. muss sie 
definiert zum Schwingen angeregt werden. Das stellst du durch die 
Fuses sicher.

Und letztendlich kann man den Wert mit dem die Taktquelle schwingt an 
verschiedenen Stellen im Programmcode benötigen. Z.B. um genaue 
Warteschleifen zu machen.

Da man den Wert i.d.R. nicht umständlich messen will sondern ihn 
normalerweise vom Boarddesign und den Fuses her ganz genau kennt, setzt 
man den Wert direkt oder indirekt über "Project -> Configuration Options 
-> frequency" als vorher definiertes Makro F_CPU im Programmcode ein.

> Die LEDs leuchten am STK500 anfangs alle. Dann stelle ich im
> HyperTerminal ein 9600 baud, usw. Flusssteuerung "keine", und lokales
> Echo "an".

Mit dem neuen Programmcode sollten die LEDs ziemlich schnell ausgehen 
und dann wild blinken, während auf Zeichen gewartet wird.

> Dann tut sich nix! D.h. die LEDs leuchten genauso wie vorher, nämlich
> alle.

Das richtige Programm ist übersetzt und in den ATMega8515 geladen und 
ein RESET hast du auch schon gemacht?

Autor: EinsteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm von welchem Programmcode sprechen wir eigentlich? Ich rede von dem 
von Karl-Heinz Buchegger um 16:34 Uhr.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BlauZahn wrote:
> hmm anscheinend funktioniert das beispiel von k.h.buchegger auch
> nicht...

Das kann gut sein.
Ich habe den Code mehr oder weniger blind getippt, also ohne
ausprobieren zu können.

Genau aus diesem Grund hab ich dir auch weiter vorne einen
Stufenplan gegeben, wie man sowas systematisch angeht:

* zuerst eine Ausgabefunktion schreiben, die Texte ausgeben
  kann
  Vorausssetzungen, die funktionieren muessen: keine
  für sich alleine testbar: ja

* dann die String Empfangsfunktion schreiben, die einen
  String empfängt und den empfangenen String wieder
  zurückschickt
  Voraussetzungen: Die Stringsendefunktion muss funktionieren, aber
  das wurde ja bereits im vorhergehenden Schritt sicher gestellt

* und erst dann eine Zahl umwandeln und am Port ausgeben lassen
  Voraussetzungen: die Empfangsfunktion muss funktionieren
  aber das wurdee im vorhergehenden Schritt sicher gestellt

Du musst anfangen solche Schritt-für-Schritt Entwicklungen ernst
zu nehmen bzw. deine Arbeit selbst in solchen Schritten zu
organisieren. Jeder Schritt baut immer auf vorhegehenden,
getesteten Schritten auf. Dadurch hast du immer eine Möglichkeit
mit kleinen Veränderungen bzw. Ergänzungen von einem funktionierenden
Schritt zum nächsten zu kommen. Dadurch weist du aber auch immer,
wo der Fehler in etwa zu suchen ist, falls einer auftaucht.

Einfach ein Programm runterzuklopfen hat den Nachteil, dass
du dann mit einem nicht funktionierenden Programm dastehst
und nicht weist wo du zu suchen anfangen sollst.

>
> Habe es nun reingeladen und wenn ich beispielsweise ins Terminal "193" +
> ENTER eingebe, ändert sich nix an meinen LEDs (die nachwievor alle
> leuchten)

Das kann zb. die Ursache haben, dass dein Terminal beim Druck
auf ENTER einen CR/LF oder nur ein LF oder nur ein CR wegschickt.
Hängt von der Konfiguration des Terminals ab.

Teste doch mal mit deinem ersten Programm (Tastendruck direkt
auf die LEDs) welches Zeichen gesendet wird, wenn du auf
ENTER drückst.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JKK wrote:
> also...ich verwende ein STK500. Einen ATMega8515 und ich habe die
> Taktfrequenz des Controllers über die Fuses (Internal RC Osc.) auf 8 MHz
> gesetzt.

Keine gute Idee

>
> Die LEDs leuchten am STK500 anfangs alle. Dann stelle ich im
> HyperTerminal ein 9600 baud, usw. Flusssteuerung "keine", und lokales
> Echo "an".

Das lokale Echo schaltest du gleich wieder mal aus.
Dafür lässt du jetzt erst mal den µC das Echo machen.
Dadurch siehst du nämlich, ob die Übertragung funktioniert.
Der µC soll alles was er empfängt direkt wieder zurückschicken ...

#include <avr/io.h>

void main (void)
{
  char c;

  UCSRB |= (1<<RXEN) | (1<<TXEN);
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

  UBRRH = 00;                 //Baudrate einstellen 9600 bei 8 Mhz
  UBRRL = 51;

  while( 1 ) {
    while (!(UCSRA & (1<<RXC)))
      ;                         //warten bis ein Zeichen ankommt

    c = UDR;
    PORTB = c;                  //emfpangenes Zeichen ausgeben ...

    while (!(UCSRA & (1<<UDRE)))  //ist die Sendestufe bereit?
      ;
    UDR = c;                    //... und wieder zurückschicken
  }
}

(Kann jemand anderer den Code mal testen. Ich hab hier kein
Entwicklungssystem damit ich den Test selbst machen kann).

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke!

Also dein Code funktioniert bis auf die LEDs. Der Controller scickt also 
das eingegebene Zeichen sofort wieder zurück. (Habe es mit einem Oszi 
getestet)

Autor: EinSteigÄr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm....liegt wohl am Fehlenden Data Direction Register ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EinSteigÄr wrote:
> ähm....liegt wohl am Fehlenden Data Direction Register ;)

Jep.
Hab nicht drauf geachtet und einfach das erste Pgm im
Thread genommen und umgeändert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.