www.mikrocontroller.net

Forum: Projekte & Code AVR: Dreh-Encoder mit Interrupts


Autor: hammer_c (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ihr!

Wer seinen Dreh-Encoder (Rotary-Encoder, Drehimpulsgeber oder wie auch 
immer) abfragen und softwaretechnisch entprellen möchte, dabei aus 
Performance-Gründen ohne Verzögerungsschleifen oder Timern arbeiten muß 
und zusätzlich noch die zwei externen Interrupts frei hat, für den ist 
mein Code genau das richtige. Das Ganze basiert auf einem Automaten mit 
2 Zuständen und benötigt so auch lediglich 1 Bit Speicherplatz. 
Funktioniert bei mir perfekt. Schauts euch mal an.

Verbesserungsvorschläge und Danksagungen herzlichen Willkommen! ;)

ciao Christian

Autor: Winfried Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

hast Du auch eine entsprechende Lösung in C?
Das wäre mir sehr hilfreich.

Gruß Winfried

Autor: hammer_c (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Winfried,

nein leider nicht... alles nur in Assembler bei mir :) ... du solltest 
aber anhand der Kommentare ziemlich schnell C-Code daraus machen 
können... ansonsten als Inline-ASM reinnehmen...

aber was viel schlimmer ist; ich sehe gerade, daß der Code einen Fehler 
hat:

in der siebten Zeile nach "; INT1 (B)" (also Zeile 103)steht "rjmp 
e_int1"... das ist natürlich falsch, weil er sonst immer wieder nach 
oben springt... richtig ist "rjmp e_int11"... sorry dafür, muss beim 
Umbenennen der Sprungmarken passiert sein! anbei noch einmal die 
korrigierte Fassung...

ciao Christian

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ja schön jede Zeile beschrieben, was da gemacht wird, nur warum 
es gemacht wird, ist mir nicht klar ?

Es wäre also schön, wenn Du das Prinzip beschreiben könntest, wie Dein 
Programm arbeitet.

Dann könnte man es auch in C umschreiben.

Nur jede Instruktion stur nach C zu konvertieren, ohne es zu verstehen, 
dürfte viel zu fehlerträchtig sein und daher kaum erfolgreich sein.


Allgemein ist das Triggern auf beide Flanken nicht einfach.
Man sollte immer erst den Pegel testen, ob auch wirklich die gewollte 
Flanke einen Interrupt ausgelöst hat oder es nur eine Störung war. Dann 
muß man nach dem Umschalten wieder testen, ob nicht vielleicht gerade 
wärend des Umschaltens eine Flanke aufgetreten ist.


Peter

Autor: hammer_c (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich werde mal versuchen, es zu erklären...

also das ganze basiert wie gesagt auf einem Automaten, den ich anhand 
der Pegel-Wechsel beim Drehen des Encoders entworfen habe. Mein 
ursprünglicher Automat hatte glaube ich 9 Zustände, die ich auf 
lediglich 2 minimieren konnte (fragt bitte nicht, wie der Automat einmal 
aussah! :))... den aktuellen Automaten findet ihr im Anhang... für 
diejenigen unter euch, die mit Automatentheorie nicht so vertraut sind: 
Die Kreise sind die Zustände (mit den entsprechenden Namen drin (hier 
binär)), die Pfeile sind die Übergänge von einem Zustand in den anderen 
und an den Pfeilen stehen die möglichen Eingaben und die entsprechenden 
Ausgaben, die den Automat veranlassen den Zustand zu wechseln (in der 
Form "Eingabe, Ausgabe(n)")...

ich habe die Eingaben in folgender Form geschrieben: A und B stehen für 
die entsprechenden Pins des Encoders von denen High oder Low kommt (bzw 
INT0 und INT1 am controller)... die Zahl in der Klammer gibt an, ob der 
aktuelle Pegel Low (0) oder High (1) ist...

so bedeutet "A fällt (1), Minus" am Pfeil von Zustand0 nach Zustand1 
also, daß der Zustand von 0 nach 1 gewechselt wird, wenn am Pin A des 
Encoders eine fallende Flanke erzeugt wird, der Pegel aber trotzdem High 
ist (wenn z.B. wieder zurückgeprellt wurde o.Ä.) und das als Ausgabe 
dann ein Minus erfolgt (sprich: Encoder wurde nach Links gedreht) 
(soviel zu Peters Hinweis, auf die gewollte Flanke zu testen)... das 
"Steigend" und "Fallend" in der Ausgabe bedeutet, daß ab sofort der 
entsprechende Eingang (INT0 (A) oder INT1 (B) vom controller) auf die 
steigende oder fallende Flanke reagieren soll...

Man sollte zum besseren Verständnis sich das Datenblatt eines Encoders 
(bzw dessen Ausgangssignale) anschauen und dann einfach mal Schritt für 
Schritt durchgehen... Beispiel: nehmen wir an, der Encoder steht 
ursprünglich in einer Rast-Position, in der A = Low (0) sowie B = Low 
(0)... dann wird durch die Initialisierung zunächst einmal der richtige 
Start-Zustand bestimmt (hier Zustand 0) und INT0 und INT1 sollen auf die 
steigende Flanke reagieren (denn wenn beide LOW sind wird ja wohl beim 
nächsten Bewegen des Encoders ne steigende Flanke kommen)... wird der 
Encoder jetzt nach Rechts (im Uhrzeigersinn) gedreht, wird zunächst auf 
INT0 (A) eine steigende Flanke kommen und dann auf INT1 (B)... im 
Automaten sieht das dann so aus: "A steigt (1)" führt von Zustand 0 in 
den Zustand 1 und es wird INT0 ab jetzt auf die fallende Flanke 
reagieren, anschließend wird mit der Eingabe "B steigt (1)" im Zustand 1 
gekreist und dabei B (INT1) auf die fallende Flanke geschaltet und Plus 
"ausgegeben" (bzw gemacht halt)... auch das Prellen des Encoders wird 
mit der Automaten-Logik aufgefangen... einfach mal ausprobieren!

Der Code ist also nix anderes als der AVR-Assembler gerecht gemachte 
Automat...

noch mal zu Peter; die Geschichte, daß man testen sollte ob während des 
Umschaltens eine Flanke auftritt habe ich ehrlich gesagt nicht 
bedacht... ich denke aber mal, daß das so selten auftritt, daß man es 
hier vernachlässigen kann...

wenn noch Fragen sind, dann los...

ciao Christian

Autor: wohnwagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist schon eine Menge Kode nur fuers Ablesen eines Encoders.

Ich habe meine Kode leider nicht so schnell dabei, aber habe andere 
Loesung gewaehlt.

Nennen wir die Encoder Signale Xa und Xb

Xa wird auf Int0 UND Int1 angeboten. Int0 wird zur Erkennung aufgehenden 
Flanken konfiguriert. Int1 wird fuer abgehende Flanken verwendet.

Xb wird angeboten ueber ums eben welche andere IO pin.

Nun teste ich bei Interrupthaendler Int0 und Int1 der Wert von Xb.

Int1: Xb == 1 ? -> Positive Drehung sonst Negative Drehung

Int0: Xb == 0 ? -> Positive Drehung sonst Negative Drehung

Kann man in etwa 10 ASM commands ausschreiben.

Nachteil ist das ich nicht die ganze Resolution vom Encoder verwende.

Autor: Jacob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze in C findest du im Code für den h-mpeg mp3player...
http://www.h-mpeg.de und dann auf Downloads.

Autor: Werner Schwarz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn man die Layouts und die Schaltpläne, die auf der Seite
http://www.h-mpeg.de öffnen mit einer korrekt lizensierten Eagle-Version 
öffnen will, dann gibt es den berühmten
Load-Error, der auf die Erstellung dieser Dateien mit einer Raubkopie 
hinweisen!!!

Werner

Autor: Benedikt Lippert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, bin grad auf diesen Code gestoßen.
Hätte da mal eine Frage dazu:

Der Automat ist im Zustand 0 und es kommt eine steigende Flanke an A.
Dann wechselt der Automat in den Zustand 1, aber woher weis der Automat 
welche Aktion er bei steigender Flanke ausführen muss?
Es gibt zwei :
1. im Pfeil von 0 nach 1
2. im Pfeil von 0 nach 0

oder muss er beide abarbeiten?

Das gleiche Problem ist wenn der Automat jetzt mit steigender Flanke in 
Zustand 1 wechselt und der Kontakt prellt(also eine negative Flanke 
erzeugt)
Wechselt der Automat dan wieder in Zustand 0, da es ja am Pfeil von 1 
nach 0 eine Anweisung gibt, das bei fallender Flanke wieder nach 0 
gewechselt werden soll?

Wäre schön wenn mir das jemande erklären könnte, da ich mit dieser 
Darstellung noch keine Erfahrung gemacht habe während meiner 2jährigen 
Lehrzeit.

mfg Benedikt

Autor: Benedikt Lippert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir den keiner meine Fragen beantworten?

mfg Benedikt

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hammer_c wrote:
> Ok, ich werde mal versuchen, es zu erklären...

Mal ne ganz andere Frage: mit was ist denn dieser hübsche Automat 
gezeichnet? Ist das Visio?
Danke, Grüße, holli

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Benedikt Lippert (Gast)

>Der Automat ist im Zustand 0 und es kommt eine steigende Flanke an A.
>Dann wechselt der Automat in den Zustand 1, aber woher weis der Automat
>welche Aktion er bei steigender Flanke ausführen muss?

Dieser Automat mit nur zwei Zuständen ist sinnlos. Ein Drehgeber hat 
vier Codes, Gray-Codes. Beim Übergang zwischen benachbarten Codes wir 
der Pulszähler incementiert oder dekrementiert. Beim Übergang zwischen 
nichtbenachbarten Codes muss ein Fehler signalisiert werden.

MFG
Falk

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie oft denn noch?! Encoder an zwei Interruptleitungen ist 
SCHWACHSINN. Und dieses 
"Wenn-Leitung-A-sich-ändert-dann-werte-Leitung-B-aus" ist noch größerer 
Schwachsinn. Wenn man doch sowieso schon nen Timer laufen hat, dürfte es 
doch möglich sein, da noch ne schnucklige kleine Entprellroutine 
mitlaufen zu lassen...

Autor: abdal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... habe das mit den beiden Interrupts und der Auswertung der Drehgeber 
mit c getestet (imagecraft ICC) und es klappt wirklich wunderbar:

##############################################################
##############################################################
##############################################################

// PHASEA u -B sind die beiden Encoder Eingänge
#define PHASEA (PIND & 1<<PIND1)  // PIND.1 ist
#define PHASEB (PIND & 1<<PIND2)  // PIND.2 ist

// phasen-check: bestimmung ob interrupt mit fallender oder steigend. 
//flanke. Hier verwende ich interrupt1 auch alf fallende Flanke für den 
//Taster
void check_phase(void)
{
switch (PHASEA+PHASEB)
     {
     case 0: EICRA  = 0x3E; break; //Int0:Fall/Int1:Rise/Int2:Rise/
     case 2: EICRA  = 0x3A; break; //Int0:Fall/Int1:Fall/Int2:Rise/
     case 4: EICRA  = 0x2E; break; //Int0:Fall/Int1:Rise/Int2:Fall/
     case 6: EICRA  = 0x2A; break; //Int0:Fall/Int1:Fall/Int2:Fall/
     }
}

// Interrupt-Routine 1
#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{
 //external interupt on INT1
switch (PHASEA+PHASEB)
  {
  case 0: if (EICRA==0x3E | EICRA==0x3A) count++; else count--; break;
  case 6: if (EICRA==0x3E | EICRA==0x3A) count--; else count++; break;
  }
check_phase();
}

// Interrupt-Routine 1
#pragma interrupt_handler int2_isr:iv_INT2
void int2_isr(void)
{
 //external interupt on INT2
switch (PHASEA+PHASEB)
   {
   case 0: if (EICRA==0x3E | EICRA==0x2E) count--; else count++; break;
   case 6: if (EICRA==0x3E | EICRA==0x2E) count++; else count--; break;
   }
check_phase();
}


//main
void main(void)
{

init_devices();
check_phase();

while (1)
    {
    printf(count);
    }
}


##############################################################
##############################################################
##############################################################

PS: Wenn einer eine bessere Lösung mit einem Interrupt hat bitte!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abdal wrote:

> PS: Wenn einer eine bessere Lösung mit einem Interrupt hat bitte!

Ich denke, die ist ganz ordentlich:

http://www.mikrocontroller.net/articles/Drehgeber#...

Ist vor allem universell für alle Encodertypen, d.h. für nichtrastende 
(jeder Phasenwechsel) oder für rastende mit 2 bzw. 4 Phasenwechseln.


Peter

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, und die ist sogar ohne Interrupts, was ein Vorteil und kein Nachteil 
ist.

Autor: Andreas Hickmann (hicki) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> abdal wrote:
>
>> PS: Wenn einer eine bessere Lösung mit einem Interrupt hat bitte!
>
> Ich denke, die ist ganz ordentlich:
>
> http://www.mikrocontroller.net/articles/Drehgeber#...
>
> Ist vor allem universell für alle Encodertypen, d.h. für nichtrastende
> (jeder Phasenwechsel) oder für rastende mit 2 bzw. 4 Phasenwechseln.
>
>
> Peter

Hi,

der Code in Bascom, wäre für Viele hier im Forum auch sehr vorteilhaft.
Wäre nett, wenn das bitte einer schreiben könnte.

Vielen Dank Andreas

Autor: F. Fo (foldi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Hickmann schrieb:
> Hi,
>
> der Code in Bascom, wäre für Viele hier im Forum auch sehr vorteilhaft.
> Wäre nett, wenn das bitte einer schreiben könnte.
>
> Vielen Dank Andreas

Du hast dich doch gerade freiwillig gemeldet, oder?
:-)
Meine Wohnung müsste auch mal wieder geputzt werden, wäre nett, wenn 
hier mal jemand vorbei kommen könnte ...

Autor: Andreas Hickmann (hicki) Benutzerseite
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Frank O. schrieb:

> Meine Wohnung müsste auch mal wieder geputzt werden, wäre nett, wenn
> hier mal jemand vorbei kommen könnte ...

Es ist wirklich schade, dass hier im Forum oft nur Mist geschrieben 
wird.

Gruß Andreas

Autor: F. Fo (foldi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Hickmann schrieb:
> Frank O. schrieb:
>
>> Meine Wohnung müsste auch mal wieder geputzt werden, wäre nett, wenn
>> hier mal jemand vorbei kommen könnte ...
>
> Es ist wirklich schade, dass hier im Forum oft nur Mist geschrieben
> wird.
>
> Gruß Andreas

Andreas, bleib mal locker!

Verstehst du keinen Spaß?

Ich übersetze mal deinen Satz für mein Verständnis:
"Also, ich möchte das in Bascom haben. Haut mal rein und programmiert 
mir das!"
Das ich dann spaßeshalber auch "meine Wünsche" hier anbringe, das 
solltest du mal als das nehmen was es ist, es war lediglich ein Spaß.
Du forderst hier die Leute auf für dich etwas zu programmieren. Weil du 
es nicht kannst oder einfach keinen Bock hast. Helfen wird dir sicher 
immer jemand, wenn du hängst, aber diese Aufforderung muss ja quasi 
einen Scherz nach sich ziehen.
Es ist wirklich schade, dass du so wenig Humor hast.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Hickmann schrieb:
> Es ist wirklich schade, dass hier im Forum oft nur Mist geschrieben
> wird.
Und Bascom.

Autor: F. Fo (foldi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Hickmann schrieb:
> Frank O. schrieb:
>
>> Meine Wohnung müsste auch mal wieder geputzt werden, wäre nett, wenn
>> hier mal jemand vorbei kommen könnte ...
>
> Es ist wirklich schade, dass hier im Forum oft nur Mist geschrieben
> wird.
>
> Gruß Andreas

Andreas, bleib mal locker!

Verstehst du keinen Spaß?

Ich übersetze mal deinen Satz für mein Verständnis:
"Also, ich möchte das in Bascom haben. Haut mal rein und programmiert 
mir das!"
Das ich dann spaßeshalber auch "meine Wünsche" hier anbringe, das 
solltest du mal als das nehmen was es ist, es war lediglich ein Spaß.
Du forderst hier die Leute auf für dich etwas zu programmieren. Weil du 
es nicht kannst oder einfach keinen Bock hast. Helfen wird dir sicher 
immer jemand, wenn du hängst, aber diese Aufforderung muss ja quasi 
einen Scherz nach sich ziehen.
Es ist wirklich schade, dass du so wenig Humor hast.

Autor: Vehikelfranz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Bascom ist das mit ein paar Zeilen zu machen.....

erst mal brauchst Du mindestens einen Interrupt
mir reicht einer, Du kannst natürlich auch zwei nehmen,
wenn die auflösung feiner sein soll, aber je nach Chip
kann man ja die Änderung auswerten und nicht nur up oder down
in diesem Fall ein Atmega48:


config Pind2 = Input
config Pind3 = Input


Config Int0 = Change
Enable interrupts
Enable Int0
On Int0 Updn

Updn:
If Pind2 = Pind.3 then incr X
If Pind2 <> Pind.3 then decr X
return

.......wobei mit X die zu ändernde Variable
gemeint ist. Die Werte müssen natürlich noch begrenzt werden,
aber das bleibt jedem selber überlassen......
Wichtig ist das Prinzip, die Flanke des einen Kanals auszuwerten
und dann zu schauen ob der andere Kanal gleich oder anders ist.

If Pind2 = Pind.3 then incr X else decr X müsste auch gehen


man kann statt mit Interrupts notfalls auch mit Debounce arbeiten,
aber da sollte die Laufzeit des Hauptprogramms sehr kurz sein,
oder man hüpft alle paar Zeilen ins Unterprogramm mit der Auswertung
sonst hakt das fürchterlich.Nur in Notfällen sinnvoll!

mfG
Franz

Autor: Andreas Hickmann (hicki) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Fanz,

endlich mal eine sinnvolle Antwort. Vielen Dank.
Werde ich gleich mal testen.

Gruß Andreas

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> In Bascom ist das mit ein paar Zeilen zu machen.....

Wie schrieb schon Sven P. 2008 :

"Wie oft denn noch?! Encoder an zwei Interruptleitungen ist
SCHWACHSINN. Und dieses 
"Wenn-Leitung-A-sich-ändert-dann-werte-Leitung-B-aus" ist noch größerer 
Schwachsinn. "

Blöd wenn man den Thread nicht bis zu
http://www.mikrocontroller.net/articles/Drehgeber#...
gelesen hat.

Autor: Vehikelfranz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nicht behauptet, dass das die beste und einzige Möglichkeit
ist einen Drehgeber auszuwerten, aber das ist in Bascom eine sehr 
interessante Variante und wenn der Encoder ein bisschen entprellt ist,
(10k Pull-Up und 100nF nach Gnd) dann reicht das allemal um
mit einem kleinen Drehencoder mit Taster ein Menue zu steuern
 rauf, runter, weiter.....

Es gibt Fälle, da hat man Timer frei, aber keine Interrupts
ich hatte aber das Problem, keine Timer sondern die Interrupts
frei gehabt zu haben, und da hat sich das angeboten.

....mir ist auch der "ENCODER"-Befehl in Bascom bekannt,
aber der ist auch nicht immer die erste Wahl, wenn der
Geber ständig abgefragt werden soll, unabhängig davon,was
das Programm gerade macht.

und auch wenn es um Höchstgeschwindigkeit geht, dann ist die
Interrupt-Variante die schnellste, weil da die Abtastung immer
absoluten Vorrang hat.

Versuche mal den Wert eines hochauflösenden Inkrementalgebers
mit einem Atmega und Bascom auf ein Display zu schreiben....
Wenn man das Signal nicht vorher per Hardware in Takt und Richtung
aufbereitet was man ja in solch einem Fall meist vermeiden möchte,
dann ist die Interruptmethode die einzig brauchbare, weil sich sogar
das Schreiben ins Display dem Interrupt unterordnet.
Das funktioniert bis zu einigen Kilohertz.Der einzige echte
Nachteil der Interrupt-Methode ist das Zappeln, das auftreten kann,
wenn der Kanal des Gebers der den Interrupt auslöst zappelt,
aber das ist dann kein Fehler der Auswertemethode sondern eine
Fehlfunktion des Gebers.

Also lieber MaWin,
hier hat jemand,danach gefragt, ob nicht irgendwer dieses Verfahren
in Bascom hätte.... Und weil ich genau dieses zufällig sowieso
irgendwo in einigen meiner Programme genau so drin habe, und es ganz
hervorragend funktioniert (und ich auch schon andere getestet habe)
habe ich es hier in diesem kürzlich wieder ausgegrabenen Thread
gepostet.

Wenn Du also dieses oder andere Programme oder Verfahren aus
irgend einem Grund der ja durchaus berechtigt sein kann,
nicht gut findest, dann antworte bitte sachlich und korrekt
oder machs halt einfach besser......
Aber hier von Schwachsinn oder noch größerem Schwachsinn zu
reden oder zu zitieren und von blöd zu reden schiesst doch
ein bisschen übers Ziel hinaus!

Es kommt immer auf den jeweiligen Fall an, wie die optimale
Lösung aussieht.

mfG
Franz

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vehikelfranz schrieb:
> Es kommt immer auf den jeweiligen Fall an, wie die optimale
> Lösung aussieht.
sehr, sehr wenig.
ein quadratur-signal ist ein quadratur-signal.

> dann antworte bitte sachlich und korrekt
> oder machs halt einfach besser......

genau das wurde hier im thread schon mehrfach getan.

wer halt zu faul zum lesen ist, der muss sich dann sowas anhören. 
nochmal vorkauen, was an anderen stellen schon zig-fach geschrieben 
wurde, ist nach der grundschule einfach nur unsitte.
zu der stufe solltest du dann mal kommen.

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.