Hallo zusammen,
Kann mir jemand verraten weshalb ich nicht von dem Linkslauf in den
Rechtslauf umschalten kann. Hab ich die Bedingungen falsch gesetzt. Ich
bitte dringend um Hilfe!!
1
#include<t89c51ac2.h> // Header für Controller "AT89C51AC3"
Deine AUswertung von 'eingang' ist mehr als suspekt.
1) Schreib das doch mit vernüftiger Schreibweise und nicht
mit Hex-Zahlen
#define PIN_4 4
if( eingang & (1 << PIN_4) )
ergibt dann TRUE, wenn der Eingang am Bit 4 eine 1 hat
if( !( eingang & (1 << PIN_4) ) )
ergibt dann TRUE, wenn der Eingang am Bit 4 eine 0 führt
Anstelle von 'PIN_4 nimmt man dann natürlich einen
vernünftigen Namen, der die FUnktion des Eingangspins wiederspiegelt
Ist da zb ein Roter Schalter am Port angeschlossen, dann
könnte man nehmen
#define RED_SWITCH 4
if( eingang & (1 << RED_SWITCH) )
dann kann auch ein Blinder greifen, dass hier wohl eine AUswertung
des roten SChalters erfolgen wird.
Ist an diesem Pin eine Lichtschranke, die auslöst, wenn die Katzen-
klappe ihren oberen Totpunkt erreicht hat, dann könnte das heißen
#define KLAPPE_OBEN 4
if( eingang & (1 << KLAPPE_OBEN) )
und wieder kann ein Blinder greifen, dass hier wohl die Abfrage
sein wird, mit der die Endstellung der Katzenklappe überwacht
wird.
2) In der Hauptschleife vergleichst du das Eingangsbyte mit 0xFE
Innerhalb der Funktion aber mit 0xEF
Nimm solche Dinge nicht auf die leichte SChulter. Ob Programme leicht zu
verstehen sind, ob man Fehler leicht findet, hängt nicht unwesentlich
davon ab, wieviel Geschick du in ein LESBARES Programm steckst. Deine
Hex-Zahlen sind aber nicht lesbar. Das ist einfach nur eine Zahl, die
einem beim Programmlesen nichts erzählt, die einem nichts sagt. Ganz
abgesehen davon, dass es leicht ist, an 2 verschiedenen Programmstellen
einen Zahlendreher einzubauen ohne es zu merken. Mit ordentlichen Namen
passiert das nicht.
aus der äusseren while Schleife geht es nur dann raus, wenn reslo zu 0
wird.
reslo kann aber nur dann 0 werden, wenn
* P1_0 einen Wert von 0 hat
nur in dem Fall findet dann auch die Abfrage von eingang statt.
* Kommt da der richtige Wert, dann fängt sich das Programm in einer
while Schleife die solange läuft wie P1_0 gleich 0 ist.
* P1_0 muss aber 0 gewesen sein, sonst wärst du überhaupt nie auf die
Abfrage gekommen.
Ist das so gewollt?
STK500-Besitzer schrieb:> Wird "eingang" auch irgendwo noch verändert?
Nicht das ich wüsste, dies ist ein quellcode von meinem Lehrer. Dieser
aber nicht fertig war. Ich habe versucht mittels polling einen Rechts
und Linkslauf anzusteuern. Ehrlich gesagt kenn ich mich nicht wirklich
aus und kann jetzt hier groß mitreden. Um jede Hilfe bin ich äußerst
dankbar.
Lg
Dazu müsste man erst mal wissen, was diese ganzen Eingänge steuern. Das
ist (in meinen Augen) ein heilloses Ducheinander.
Wie wählst du aus, ob Rechts/Linslauf?
Wie findet sich das im Programm wieder?
(SChmeiss das Programm weg und schreib es neu. Da blickt doch kein
Mensch mehr durch, wie das mit den Eingangsabfragen gedacht ist)
Karl Heinz Buchegger schrieb:> Dazu müsste man erst mal wissen, was diese ganzen Eingänge steuern. Das> ist (in meinen Augen) ein heilloses Ducheinander.>> Wie wählst du aus, ob Rechts/Linslauf?> Wie findet sich das im Programm wieder?>> (SChmeiss das Programm weg und schreib es neu. Da blickt doch kein> Mensch mehr durch, wie das mit den Eingangsabfragen gedacht ist)
Es wäre schön wenn ich das könnte, ich fühl mich nicht wirklich in der
Lage gibt es hier vielleicht schon fertige Programme in c.
Gerd schrieb:> gibt es hier vielleicht schon fertige Programme in c.
wird dann der Autor des fertigen Programmes auch gegenüber deinem Leher
erwähnt und bekommt eine Note? Dann mach ich auch mit.
Gerd schrieb:> Karl Heinz Buchegger schrieb:>> Dazu müsste man erst mal wissen, was diese ganzen Eingänge steuern. Das>> ist (in meinen Augen) ein heilloses Ducheinander.>>>> Wie wählst du aus, ob Rechts/Linslauf?>> Wie findet sich das im Programm wieder?>>>> (SChmeiss das Programm weg und schreib es neu. Da blickt doch kein>> Mensch mehr durch, wie das mit den Eingangsabfragen gedacht ist)>> Es wäre schön wenn ich das könnte, ich fühl mich nicht wirklich in der> Lage
Na komm.
Du wirst doch wohl einen Eingang abfragen können! Sonst muss ich mich
schon fragen, warum du überhaupt auf die Idee kommst, du könntest da
irgendwas programmieren.
Und die Ansteuerung des Schrittmotors ist doch ganz simpel
Nacheinander die 4 Werte an einem Port ausgeben und dazwischen ein wenig
warten. Das kann man auch eleganter machen, wie es dein Lehrer dir
vorgegeben hat, aber fürs erste ist es auch so ok.
Das ist doch nun wirklich keine Raketentechnik.
fertig. WEnn da nicht noch irgendwelche Endschalter im SPiel sind,
sondern es erst mal nur darum geht, dass sich der Motor überhaupt
rechts/links dreht, dann wars das dann schon.
Jeder der eine LED abhängig davon ob ein Taster gedrückt ist einschalten
kann, kriegt das hin.
> Jeder der eine LED abhängig davon ob ein Taster gedrückt ist einschalten> kann, kriegt das hin.
Leider sind noch Endschalter mit im Spiel ich baue Model So zusagen ein
Rolltor einer Garage hierbei nutze ich Ribkontakte als Endschalter was
muss ich bei der Programmierung dann beachten etwa mit Polling so wie
ich es oben bereits versucht habe.
Gerd schrieb:>> Jeder der eine LED abhängig davon ob ein Taster gedrückt ist einschalten>> kann, kriegt das hin.> Leider sind noch Endschalter mit im Spiel
Dann gibt es eben noch jeweils eine Zusatzbedingung
1
...
2
3
Endlosschleife {
4
5
Wenn der Schalter für Rechtslauf eingeschaltet ist
6
UND der Endschalter für den rechten Anschlag nicht eingeschaltet ist
7
8
DANN gibt die 4 Werte für Rechtslauf in der richtigen
9
Reihenfolge einmal aus
10
11
...
Ich wollte dir die Sache für deine ersten Schritte einfach machen, aber
mir kommt vor, du stehst da wie die Maus vor der Schlange. Vor einem
Bild einer Schlange, denn du hast schon Angst vor etwas, noch ehe du es
probiert hast.
Also soweit bin ich jetzt mal. Kann mir jemand sagen ob das soweit sinn
macht und wie ich jetzt genau die Bedingungen mit den Endschaltern rein
bekomm?
Ein Beispiel das sich an meinem Quelltext orientiert würde mir sehr
weiterhelfen
Vielen Dank im Voraus.
Gerd schrieb:> Also soweit bin ich jetzt mal. Kann mir jemand sagen ob das soweit sinn> macht und wie ich jetzt genau die Bedingungen mit den Endschaltern rein> bekomm?>> Ein Beispiel das sich an meinem Quelltext orientiert würde mir sehr> weiterhelfen>> Vielen Dank im Voraus.
Wenn du deine Port_Pins schon nicht so benennst, dass man als
Außenstehender direkt sieht, was wo dran hängt, beschreib das doch bitte
in drei kurzen Sätzen.
Wo legst du in deinem Programm fest, was Eingang und was Ausgang ist?
Gerd schrieb:> P2 ist der Ausgang
Dann steht zu vermuten, dass von dem Ausgang P2 nur das untere Nibble
benutzt wird und darüber direkt die Phasensignale für den Schrittmotor
ausgegeben werden. Richtig?
Warum legst du nicht einfach ein Array mit den Phasensignalen an und
nimmst einen Phasenzähler, der bei Linkslauf inkrementiert und bei
Rechtslauf dekrementiert wird.
Vorausgesetzt, deine beiden Signale für Linkslauf und Rechtslauf (P1_0
und P1_1) treten nicht gleichzeitig auf, könnte das dann als Pseudocode
so aussehen
PhaseCode [0..3] = (0x0c, 0x09, 0x03, 0x06)
TSTEP=25000
while (1)
{
if (P1_0) Phase++ 'Linkslauf
else if (P1_1) Phase-- 'Rechtslauf
P2 = PhaseCode[Phase & 0x03)
delay(TSTEP)
}
Hinz schrieb:> Warum legst du nicht einfach ein Array mit den Phasensignalen an und> nimmst einen Phasenzähler, der bei Linkslauf inkrementiert und bei> Rechtslauf dekrementiert wird.
Machs ihm nicht zu schwer.
Der Mann hat schon Schwierigkeiten genug mit einem simplen logischen
Und.
Du überforderst ihn gerade.
was haltet ihr von dem Quelltext. Es scheint mir als wie es so
funktionieren könnte. Also wenn ich den Taster P1_0 betätige wird der
Rechtslauf betätigt, wenn jemand P1_1 zwischenzeitlich betätigt wird
eine Verriegelung vorgenommen weil nur Eine Laufrichtung eingeschlagen
werden kann das gleiche gilt auch anderst herum. Kann mir jemand sagen
wie ich die direkte Umschaltung mache.
lg
1
#include<t89c51ac2.h> // Header für Controller "AT89C51AC3"
Dazu solltest du dich mal fragen, wie es eigentlich dazu kommt, dass
Schritte übersprungen werden.
Das passiert nicht, weil die Steuerung die Schritte nicht erzeugt,
sondern weil der Motor mit der Schritt-Geschwindigkeit nicht mehr
mitkommt. Das kann sein, weil die Schrittgeschwindigkeit grundsätzlich
schon zu hoch ist, das kann aber auch sein, weil der Motor banal gesagt,
es nicht schafft, die Last in der vorgegebenen Zeit eben um einen
Schritt zu bewegen. Und genau so wie auch du zb einen LKW nicht durch
Seilziehen aus dem Stand heraus auf 5 km/h beschleunigen kannst (du
kannst die 5km/h erreichen, wenn man dir genug Zeit lässt und du den LKW
2 Stunden lang immer ein kleines bischen schneller ziehen kannst)
genauso schafft es auch ein Schrittmotor nicht, aus den Stand heraus
eine gewisse Geschwindigkeit zu erreichen, sondern er muss erst mal mit
kleinen Drehzahlen anfangen um dann sukzessive schneller werden zu
könnnen.