Archiv verlassen und diese Seite im Standarddesign anzeigen : Pins, Ports und Fragen beim Lernen...
squelver
11.06.2007, 09:19
Hallo ihr :)
Ich steh seit Wochenende n bischen auf dem Schlau bzw. verstehe etwas nicht.
Ich habe einige Testprogramme in C getestet und mit den Port's rumprobiert, auch Tutorials hab ich mitgemacht, nur was ich nicht ganz vertehe.
Wie ich beim Mega 8 die Ports B/ C/ D und DDR definiere, denke ich, hab ich verstanden.
Was ich nicht verstehe:
Wie sieht das aus bzw. was muss ich machen, wie schreiben, wie die Bits ansprechen, damit ich von z.B. PORTB jeden einzelnen Pin verwalten kann.
Also dass ich z.B. PORTB / B0 für nen Taster als Eingang und PORTB / B2 als Ausgang definiere \:D/
Mir ist aufgefallen, das wenn ich den PORTB so als Ausgang definiere, dann funtionieren alle PIN's (B0 - B5) als Ausgang, aber wie einzeln ansprechen?
Sicher wurde das schon öfter beschrieben, ich habe leider bisher keine vernünftige Erklärung dazu finden können.
Vielen Dank im Voraus...
Gruß Andreas
Ich weiss jetzt nicht welchen Compiler du benutzt bei CodeVision gibt es da 2 Möglichkeiten.
DDRC=0b00000101;
PORT C0 und C2 sind Ausgang, alle anderen Eingang.
oder
DDRC.0=1;
DDRC.2=1;
Das Ergebnis ist das gleiche, da die Ports nach einem Controllerreset auf 0 stehen.
Ich denke mal in AVR GCC wird das ähnlich funktionieren.
squelver
11.06.2007, 09:41
Ich weiss jetzt nicht welchen Compiler du benutzt bei CodeVision gibt es da 2 Möglichkeiten.
DDRC=0b00000101;
PORT C0 und C2 sind Ausgang, alle anderen Eingang.
oder
DDRC.0=1;
DDRC.2=1;
Das Ergebnis ist das gleiche, da die Ports nach einem Controllerreset auf 0 stehen.
Ich denke mal in AVR GCC wird das ähnlich funktionieren.
Klasse, dann war ich ja schon sehr dicht dran \:D/
Ich denke, das DDRC.0=1; wird es sein, ich werd heut abend gleich probieren *freu*, hab da bestimmt ein paar Stunden mit verbracht, die Lösung zu finden, musste dann aufgeben, weil ich nichts darüber auf meinem Rechner liegen und erst heut früh meinen neuen Internetanschluss bekommen habe :mrgreen:
Das Fettgeschriebene hab ich gesucht:
DDRC.0=1;
Danke dafür, melde mich, wenn ichs getestet habe ;)
Andreas
MartinFunk
11.06.2007, 12:42
Hi,
Das wird nicht funktionieren:
PORTX.0 = 1 ist eine spezielle funktion von CodeVision!
so setzt man bits: PORTX |= (1<<Y); Y ist dein Bit!!
so löscht man bits: PORTX &= ~ (1<<Y);
MfG Martin
squelver
11.06.2007, 12:57
Hi :)
Das Beispiel von WKrug hab ich öfter in meinen Testprogrammen vorgefunden :-k
Ich arbeite mit dieser Software:
http://www.myavr.de/shop/artikel.php?artID=19
Was meinst dazu?
MartinFunk
11.06.2007, 13:01
Hi,
ich kenne diese software nicht! aber mit den befehlen von mir müsste es unter jedem compiler funktionieren!
MfG Martin
squelver
11.06.2007, 13:05
Dann kläre mich bitte auf, so --> PORTX |= (1<<Y); <-- kann ich mir nur denken, was da ungefähr passiert (php kenntnisse)
Aber wie wende ich das anhand meines Beispiels (ganz oben) an?
Ich möchte, ohne irgendwelche Zusatzfunktionen und Schleifen) jeden einzelnen Pin eines Portes im Quellcode ein- und ausschalten können.
Lasse ich mir via LED's anzeigen ;)
Gruß Andreas
MartinFunk
11.06.2007, 13:24
PORTA |= (1<<2);
ist abgekürtzt: PORTA = PORTA | (1<<2);
Durch 1<<2 wird die zahl 1 binär 00000001 um zwei stellen nach links verschoben also 00000100.
jetzt wird das ergebnis mit PORTA verodert
00000[highlight=red:fd71d6c119]1[/highlight:fd71d6c119]00
01011[highlight=red:fd71d6c119]0[/highlight:fd71d6c119]11 PORTA
-------------
01011[highlight=red:fd71d6c119]1[/highlight:fd71d6c119]11
ebenso funktioniert es beim löschen.
PORTA &= ~(1<<2);
ist abgekürtzt: PORTA = PORTA & ( ~(1<<2));
erst wird wie der die zahlt eins um 2 stellen nach links verschoben
dann wird sie mit "~" invertiert (einsen werden zu nullen und nullen zu einsen).
und dann wird das ergebnis mit PORTA verundet
11111[highlight=red:fd71d6c119]0[/highlight:fd71d6c119]11
01011[highlight=red:fd71d6c119]1[/highlight:fd71d6c119]11 PORTA
-------------
01011[highlight=red:fd71d6c119]0[/highlight:fd71d6c119]11
MfG Martin
Das Beispiel von Martin wird auch funktionieren.
Du Schiebst eine 1 um 0,1,2,3... nach Links (1<<2)und machst dann eine Oder verknüpfung mit dem entsprechenden Register.
Als Alternative könnte ich noch Inline Assembler anbieten.
#asm ("SBI DDRC,0");
Das Beispiel geht so auch in CodeVision.
Allerdings muss dan DDRC mit einer Assembler Direktive vorher initialisiert werden.
Aus diesem Ausdruck wird lediglich 1 Assembler Kommando generiert, ist also sehr schnell.
Oh Martin war schneller.
squelver
11.06.2007, 13:42
Soweit ist das sehr gut erklärt, muss das nur verinnerlichen und heut abend ausprobieren ;)
Nur warum muss man das Bit löschen? Passiert das nicht von allein?
Wo definiere ich für ein einzelnes Bit , ob es ein Ausgang bzw. Eingang ist?
@wkrug
Assembler hab ich mir angeschaut und testweise auch n Quellcode davon gebrannt und rumgetestet, einiges scheint einfacher zu erstellen.
Will aber erstmal ohne Assembler auskommen :)
EDIT:
Hab mittlerweile Infos zum Definieren und Auswerten der einzelnen Port gefunden, scheint garnicht so schwer zu sein \:D/
squelver
11.06.2007, 16:16
Neue Frage:
Das hab ich aus einem Programmbeispiel:
DDRA=0x13; //Pin 0, 1 und 4 als Output
DDRB=0x04; //Pin 2 als Output
Wie setz sich das zusammen oder wo kann man das nachlesen, wie z.B. "0x13" zusammengesetzt ist?
Dahinter steht zwar als Kommentar: "//Pin 0, 1 und 4 als Output" , aber woher weiss ich, was z.B. "0x12" aussagt?
Da werdem den Port Hex-Zahlen zugewiesen.
http://de.wikipedia.org/wiki/Hexadezimalsystem
Die Umrechnung kannst Du im Calc von Windows machen aber wenn Du das mehr als 3 mal gemacht hast bekommst Du das auch im Kopf hin.
0x12 = 00010010
Hallo copious,
hier ist eine kleine Tabelle hex->bin
0=0000
1=0001
2=0010
3=0011
4=0100
5=0101
6=0110
7=0111
8=1000
9=1001
A=1010
B=1011
C=1100
D=1101
E=1110
F=1111
demnach ist 0x13 = 0b00010011
MfG Mark
EDIT:--------------------
irgendwie bin ich immer zu spät^^
squelver
11.06.2007, 17:13
Klasse :) danke euch, hab vorhin sogar was darüber gefunden, hatte ich eigentlich schon in der Schule, aber bin schon viiiiiiiiiieeeel zu lange raus :mrgreen:
Andreas
squelver
12.06.2007, 08:28
Jippi, ich denke ich habs raus, ist überhaupt nicht schwer \:D/
Für den Einstieg werde ich erstmal binäre Werte angeben, anstelle Hex-Werten, ist für mich einfacher nachzuvollziehen, um einzelene Pins an den Ports zu beeinflussen ;)
Für den Einstieg werde ich erstmal binäre Werte angeben, anstelle Hex-Werten, ist für mich einfacher nachzuvollziehen, um einzelene Pins an den Ports zu beeinflussen
Bei den Ports mach ich das auch immer so, gerade wenn ich mehrere gleichzeitig verändern will - ich finde das ist einfacher.
squelver
12.06.2007, 09:12
Für den Einstieg werde ich erstmal binäre Werte angeben, anstelle Hex-Werten, ist für mich einfacher nachzuvollziehen, um einzelene Pins an den Ports zu beeinflussen
Bei den Ports mach ich das auch immer so, gerade wenn ich mehrere gleichzeitig verändern will - ich finde das ist einfacher.
Da braucht man nicht ständig in die Liste gucken und man sieht quasi 1 zu 1, welcher Pin am Port geschaltet wird \:D/
squelver
13.06.2007, 09:34
Welche Möglichkeiten gibt es, einen Schaltzustand zu definieren?
Momentan leuchtet die LED nur, wenn ich den Taster gedrückt halte.
Wie bekomme ich das hin z.B. 1x drücken = LED bleibt an und wieder 1x drücken = LED geht wieder aus?
MFG
Wie bekomme ich das hin z.B. 1x drücken = LED bleibt an und wieder 1x drücken = LED geht wieder aus?
Zuerst brauchst du mal eine Entprell Routine.
ein Taster schließt und öffnet während einer Betätigung mehrmals und somit wäre dein Zustand der LED hinterher nicht eindeutig.
Als nächstes musst Du den Zustand der Taste abspeichern und erst wieder reagieren wenn die Taste von 0 nach 1 wechselt, wenn der Taster gegen GND schaltet natürlich von 1->0.
Beispiel:
In deinem Programm wird zyklisch die Taste über die Entprell Routine abgefragt. Ändert sich der Zustand von vorher 0 -> 1 (1 -> 0 bei GND)wird deine LED ein bzw. aus geschaltet.
Das ist ein Weg der Realisierung.
Man kann das auch über Interrupts, Timerabfragen oder sonstwas hinkriegen.
Es kommt halt darauf an, was der Controller sonst noch zu tun hat und ob da noch Timer frei sind, oder ohnehin Zyklisch Interrupts produzieren.
squelver
13.06.2007, 12:58
Was hälst du davon? (Hat mir einer unserer Programmierer vorgeschlagen)
if (readInput && taste && led){
led = false;
readInput = false;
}
if (readInput && taste && !led){
led = true;
readInput = false;
}
if (!taste) {
readInput = true;
}
Ist eigentlich das was ich Dir vorgeschlagen habe.
Dein Programmierer hat nur gleich die LED toggleroutine mit in die Tastenabfrage eingebaut.
Dein Speicher für den vorherigen Tastendruck ist dabei die Variable readInput.
Was noch fehlt ist die Entprellung.
Ohne die wird's nicht sauber funktionieren.
squelver
13.06.2007, 13:20
Ist eigentlich das was ich Dir vorgeschlagen habe.
Dein Programmierer hat nur gleich die LED toggleroutine mit in die Tastenabfrage eingebaut.
Dein Speicher für den vorherigen Tastendruck ist dabei die Variable readInput.
Was noch fehlt ist die Entprellung.
Ohne die wird's nicht sauber funktionieren.
Mein Kollege ,hat Javascript, PHP und C drauf, mit Controllern aber nichts zu tun ;)
Wenn es das ist, was du meinst, dann hab ich ja schon mal was funktionierendes \:D/
Ich bin noch nicht soweit, um selbst sowas schreiben zu können 8-[
An welcher Stelle integriert man diese Entprellung?
Guck mal hier im Forum rum, da gibts entprell Routinen jeder coleur.
Eventuell hat ja auch dein Compiler schon eine in ner Lib mit drin.
Die Entprell routine sollte deinen readInput Parameter und anstatt deiner TASTE , !TASTE funktion beeinflussen.
squelver
20.06.2007, 07:38
Danke dafür :)
Ich hab ne neue Frage:
Anschluss an Mega8:
- Taster 1 an PORTD.2 soll bei Tastendruck an PORTB.0 LED 1 zum leuchten bringen
- Taster 2 an PORTD.3 soll bei Tastendruck an PORTB.1 LED 2 zum leuchten bringen
#define F_CPU 3686400 // Taktfrequenz des myAVR-Boards
#include <avr\io.h> // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
main()
{
DDRB = 0b11111111; // PORTB = Ausgang
DDRD = 0b11111111; // PORTD = Eingang
PORTD = 0b00001100; // PORTD = PULL-UP
do
{
switch (PIND)
{
case 0b00000100: PORTB = 0b00000001; break;
case 0b00001000: PORTB = 0b00000010; break;
default: PORTB = 0b00000000;
}
}
while (true);
}
Warum leuchten die LEDs entgegengesetzt?
Also bei Tastendruck 1 leuchtet LED 2 und bei Tastendruck 2 leuchtet LED 1?
Was muss ich anders machen?
Gruß Andreas
PS: Bei if funzt alles ohne Probleme ;)
Ein Problem seh ich darin, dass der PortD nicht als Eingang geschalten ist, da hast du wahrscheinlich as verwechselt.
Werden die LEDs durch einen low- oder high-Pegel angeschalten? Bei lowaktiven LEDs müsstest du die Zuweisungen an PortB vertauschen.
Willst du eigentlich auch, dass beide LEDs gleichzeitig leuchten können? Dafür müsstest du nämlich noch ein case mit 0b00001100 einfügen, im Moment dürfte immer nur eine leuchten können. (Obwohl, bei lowaktiven LEDs müssten im Moment bei nicht gedrückten Tasten beide leuchten...)
squelver
20.06.2007, 10:14
Das ist das, was mich verwirrt :mrgreen:
Das "default" funzt wie es soll, wenn nichts gedrückt ist, dann bleiben beide aus.
Ich könnte am portB die pins tauschen bzw. die bits, das wäre dann aber zu einfach ;)
Die LED's liegen auf GND \:D/
Was mich stört, dass die LED's unlogisch gegenüber dem Taster leuchten.
Wenn 1 dann sollte auch LED an sein und nicht die im gegenüberliegende LED im anderen case.
Hast du den Port D jetzt eigentlich als Eingang geschalten? Wenn nicht, dann mach das erstmal.
Was passiert, wenn du beide Taster gleichzeitig drückst?
squelver
20.06.2007, 11:01
Vorweg, bin grad nicht zu Haus, hab den Code heut früh nur eben hier reingesetzt, kann jetzt jedenfalls nichts testen ;)
PORTD hab ich als Eingang definiert
Wenn ich nun beide Tasten drücke, dann leuchtet nur die erste LED.
Wenn nichts gedrückt wird, dann ist nach "default" alles aus.
Wenn erste taste nach erstem "case" gedrückt wird, dann leuchtet zweite LED nach zweitem "case" und anders herum :-s
Irgendwo hab ich nen Denkfehler.
Ich könnte die Pins vom PORTB in den case tauschen, dann funzt es, wie es soll, jedenfalls nach dem Board (optisch).
squelver
22.06.2007, 10:28
Hab ne neue Frage:
Was ist mit den Pins TXD und RXD alles möglich?
Wenn ich zwei Controller miteinander kommunizieren lassen möchte, welche Möglichkeiten hat man darüber zu senden und zu empfangen?
Kann man über diese Leitungen von einem Controller if-Bedingungen des anderen erfüllen?
Hallo copious,
die Pins RXD und TXT sind die Empfangs(receive)- und Sende(transmit)pins des U(S)ARTs. Siehe auch https://www.roboternetz.de/wissen/index.php/UART und http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_UART .
Der UART wird meistens dazu benutzt, um Daten mit dem PC auszutauschen. Natürlich kann man es auch zwischen 2 Controllern tun. Man muss nur ein passendes Protokoll festlegen, damit man weiss, wer was wie senden darf.
Kann man über diese Leitungen von einem Controller if-Bedingungen des anderen erfüllen?
Das verstehe ich nicht so ganz. Könntest Du es bitte etwas deutlicher formulieren?
MfG Mark
Ich vermute mal, dass copious damit meint, ob er vom einen AVR aus auf dem anderen eine Aktion auslösen kann.
Ist natürlich möglich. Du sendest eine gewisse Datenfolge an den anderen AVR und dann kannst du diese Daten auf dem anderen AVR auswerten und dementsprechende Aktionen ausführen lassen.
squelver
23.06.2007, 19:27
Hi :)
vielen Dank, meine Fragen sind beantwortet \:D/
squelver
26.06.2007, 07:50
Hallo =)
Ist die Schreibweise i.O.? Funktionieren tut das \:D/
//----------------------------------------------------------------------
#define F_CPU 3686400 // Taktferquenz des myAVR-Boards
#include <avr\io.h> // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
#define test 0b00000101;
main () // Hauptprogramm, startet bei Power ON und Reset
{
DDRB = 0b00000111; // PortB = 0, 1, 2 auf Ausgang
do {
PORTB = test;
}
while(true);
}
//----------------------------------------------------------------------
Andreas
fluchtpunkt
26.06.2007, 12:30
es bietet sich an defines gross zu schreiben, damit man sie nicht mit Variablen verwechselt; wenn du dir den Code in 2 Jahren anguckst und da noch 2000 Zeilen drumrumstehen kommst du sonst nicht drauf das das ein define ist.
squelver
26.06.2007, 12:39
es bietet sich an defines gross zu schreiben, damit man sie nicht mit Variablen verwechselt; wenn du dir den Code in 2 Jahren anguckst und da noch 2000 Zeilen drumrumstehen kommst du sonst nicht drauf das das ein define ist.
Das n guter Tip, dank :)
Zum Verständnis, ist "test" nicht ne Variable oder bringe ich was durcheinander?
SprinterSB
26.06.2007, 12:52
Nein, test ist ein Makro, das von Präprozessor rein textuell durch 0b00000101; ersetzt wird.
Beachte, daß der ; hier zu viel ist und du ihn nicht willst (auch wenn er in diesem Beispiel nicht stört).
squelver
26.06.2007, 13:08
Oh, den ";" hab ich kurz danach bemerkt, nachdem ich das hier gepostet hatte, danke aber für den Hinweis :)
Wäre das mit dem Makro optimal, wenn ich nicht im mainprogramm ändern will, sonder nur quasi in der liste? Weisst was ich mein?
Weil ich, hab heut früh noch einiges dazu gebaut, z.B. test an meheren stellen verwenden werde, aber nur an einer stelle bei änderungen ran muss?
squelver
29.06.2007, 11:04
Hi ihr :)
Also das mit den Makros hab ich mittlerweile verstanden ;)
Nun hab ich wieder was:
Ich hab gestern ne Weile mit if-Bedingungen rumgespielt, kann ohne probleme abfragen eingänge definieren, abfragen und ausgänge unter bestimmten bedingungen schalten.
Was ich aber nicht hinbeomme:
Ist es möglich bzw. hat jemand einen Beispielcode, wie ich mit nur einer Taste (einen Eingang) z.B. eine LED ein-/ ausschalte oder zwischen zwei Leds wechsle, ohne wait oder ähnliches nutzen zu müssen?
Geht das nur mit ner Tastenentprellung?
Den verschiedenen Versuche, die ich gemacht hatte, da flackert die LED beim schalten, weil sich ja die abfragen überschneiden :mrgreen:
Andreas
fluchtpunkt
29.06.2007, 11:54
sowas? Ich hoffe ich hab deine Frage richtig verstanden.
while (1)
{
if (PINB && (1<<PB3))
{
if (++button_counter > DEBOUNCE_TIME )
{
PORTB ^= (1<<PB4);
}
}
else
button_counter = 0;
}
habs aber nich getestet, wenn ich nich ganz verwirrt bin grade sollte es funktionieren. DEBOUNCE_TIME darfst du selbst bestimmen. Das ist uebrigens die Tastenentprellung.
squelver
29.06.2007, 12:14
Hi danke :)
Würdest du mir dieses Beispiel evtl. noch erklären, was da passiert?
squelver
06.07.2007, 07:53
Ich hab den Code gerade eben erst ausprobieren können (musse vor kurzem rechner neu machen), leider werden mir sämtlich Fehlermeldungen angezeigt. Die fehlende öffnende Klammer habe ich schon bemerkt, nur kommt der Compiler nicht mit z.B. DEBOUNCE_TIME klar :-k
fluchtpunkt
06.07.2007, 12:14
nicht wieder alles aus den vorherigen Lektionen vergessen :)
DEBOUNCE_TIME musst du dir per #define noch definieren.
und Klammer fehlt da keine.
squelver
06.07.2007, 12:34
nicht wieder alles aus den vorherigen Lektionen vergessen :)
DEBOUNCE_TIME musst du dir per #define noch definieren.
und Klammer fehlt da keine.
Dann muss ichs nochmal probieren, denn das #define hat bei mir nix gebracht, habs wohl nicht richtig gemacht ;)
PS:
Die Klammer fehlt (fett markiert)
while (1)
{
if (PINB && (1<<PB3))
{
if (++button_counter > DEBOUNCE_TIME )
{
PORTB ^= (1<<PB4);
}
}
else {
button_counter = 0;
}
}
Oder ist das hier nicht notwendig?
Andreas
fluchtpunkt
06.07.2007, 13:00
wenn nur ein einziger Befehl nach if oder else ausgefuehrt werden soll braucht man keine Klammer. Aber setz die ruhig auch dann, ist imho ne schlechte Angewohnheit und Faulheit die wegzulassen.
Also folgender Code wurde von mir gerade erfolgreich kompiliert:
#include <avr/io.h>
#define DEBOUNCE_TIME 2
int button_counter;
int main(void)
{
while (1)
{
if (PINB && (1<<PB3))
{
if (++button_counter > DEBOUNCE_TIME )
{
PORTB ^= (1<<PB4);
}
}
else
button_counter = 0;
}
return 0;
}
squelver
06.07.2007, 13:42
wenn nur ein einziger Befehl nach if oder else ausgefuehrt werden soll braucht man keine Klammer. Aber setz die ruhig auch dann, ist imho ne schlechte Angewohnheit und Faulheit die wegzulassen.
Also folgender Code wurde von mir gerade erfolgreich kompiliert:
#include <avr/io.h>
#define DEBOUNCE_TIME 2
int button_counter;
int main(void)
{
while (1)
{
if (PINB && (1<<PB3))
{
if (++button_counter > DEBOUNCE_TIME )
{
PORTB ^= (1<<PB4);
}
}
else
button_counter = 0;
}
return 0;
}
Hi =)
Vielen Dank, werd ich heut abend sofort ausprobieren :)
Noch eine Frage, warum wird hier "int main(void)" angewendet?
Reicht "main()" nicht aus?
Andreas
fluchtpunkt
07.07.2007, 12:39
man will sich ja schliesslich an den C-Standard halten und keine Warnungen wie:
bla.c:8: warning: return type defaults to `int'
bla.c:8: warning: function declaration isn't a prototype
Zwei Warnungen weniger und ordentlicher Stil sollten einem die acht zusaetzlichen Zeichen wert sein :)
Was int und void an der Stelle bedeutet ist aber klar, oder?
squelver
07.07.2007, 14:01
man will sich ja schliesslich an den C-Standard halten und keine Warnungen wie:
bla.c:8: warning: return type defaults to `int'
bla.c:8: warning: function declaration isn't a prototype
Zwei Warnungen weniger und ordentlicher Stil sollten einem die acht zusaetzlichen Zeichen wert sein :)
Was int und void an der Stelle bedeutet ist aber klar, oder?
Ich bin ja noch ganz am Anfang, hab da bisher nur mit main() geschrieben, hab mir die Bedeutung schon durchgelesen, komme aber noch nicht drauf klar, wann und warum ich das int und void anwenden muss 8-[
fluchtpunkt
07.07.2007, 15:32
dann am besten mal C von A bis Z (http://www.pronix.de/pronix-4.html) lesen
squelver
07.07.2007, 22:24
dann am besten mal C von A bis Z (http://www.pronix.de/pronix-4.html) lesen
Klasse, danke für den Link, werds mir evtl. bestellen \:D/
SprinterSB
08.07.2007, 12:42
Da ist noch ein Schnatzer drin... du meinst bestimmt "&" in Vergleich, und nicht "&&"!
squelver
16.08.2007, 16:20
Ich habe mit dem Script n bischen rumprobiert, habs aber nach kurzer Zeit wieder gelassen, dafür habe ich eine andere Lösung gefunden. Da ich zwei Endschalter habe, habe ich diese mit der einen Taste abgefragt und lasse nun den Motor zur jeweiligen Seite fahren, wo er dann wieder stoppt, bis ich die eine Taste wieder drücke, das funzt schon ne Weile \:D/
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.