-
Hallo,
vielen dank für Eure antworten!!!
Ich glaube ich habe das Programm nicht so gut erklärt, ich werde es jetzt nachholen.
Taster 1 und Taster 2 stehen nicht miteinander in Beziehung. Taster 1 ist nur für LED Lauflicht 1. ,Taster 2 ist nur für LED Lauflicht 2.
Taster 1 wird einmal getastet
-die 13 Leds schalten sich mit einer Zeitverzögerung von 0.2s nacheinander an und bleiben auch an.
Taster 1 wird zum zweiten mal getastet
-alle LEDs schalten sich nacheinander mit einer Zeitverzögerung von 0.2s aus und bleiben auch aus.
das selbe Prinzip macht der 2. Taster für das LED Lauflicht 2 auch.
Das große Problem ist, wenn der Taster 1 betätigt wurde, startet das Lauflicht 1 (Beschreibung Taster 1), wenn der Taster 2 betätigt wird und das Lauflicht 1 noch nicht alle 13 LED an oder aus geschaltet hat, soll trotzdem das Lauflicht 2 loslaufen.
MFG
Matthias
-
Also hat deine Schaltung 26 LEDs?
OOOOOOOOOOOOO Lauflicht 1
OOOOOOOOOOOOO Lauflicht 2
Ist jede LED einfach an einen Ausgang des µCs angeschlossen?
Soll man den Hoch- / Runterzählvorgang auch durch ein zweites Tasten umkehren können, solange es noch nicht fertig ist?
Soll in den 200 ms, die zwischen den Schritten liegt, auch das andere Lauflicht anfangen können?
-
Hallo Bigfood,
-jede LED ist einfach an einen Ausgang des µCs angeschlossen.
-der Hoch-/ Runterzählvorgang soll erst umgekehrt werden wenn der Vorgang abgeschlossen ist (alle LEDs an oder aus), und nicht zwischendurch.
-Soll in den 200 ms , die zwischen den Schritten liegt, auch das andere Lauflicht anfangen können. Antwort Ja
MFG
Matthias
-
Wenn ich jetzt nur Basic könnte...
Hab mal was wildes hässliches zusammengehackt... :/
LEIDER IN C
und auch nicht unbedingt funktionstüchtig...
Aber ich denke, solange du nur immer die Taster überprüfst und dir die Richtung merkst, in die es gerade zählen soll (hier hab ich das add1 und add2 genannt und später einfach zum Lauflichtwert dazugezählt), sollte es gleichzeitig funktionieren... einfach keine 200ms warten, sondern einen zähler runter- bzw hochzählen lassen und dann die nächste led hinzuschalten.
Wahrscheinlich blamiere ich mich mit dem Stück Code total, weil wer rausfindet, dass ich nen Denkfehler drinhab... War auch nur schnell zusammengeschrieben... Hoffe, dass es die Idee vermittelt (und dass die Idee nicht falsch ist)
Code:
unsigned char wait1 = 0;
unsigned char wait2 = 0;
char add1 = 0;
char add2 = 0;
unsigned char ll1 = 0;
unsigned char ll2 = 0;
unsigned char in1 = 0;
//----------
while (1)
{
in1 = PINA; // eingänge einlesen
//----------
if (in1 == 1) // taster 1 gedrückt
{
if (ll1 == 0) // lauflicht leer?
add1 = 1; // vorwärtslauf
else if (ll1 == 13) // lauflicht voll?
add1 = -1; //rückwärtslauf
// ansonsten passiert einfach nix
}
if (in1 == 2) // taster 2 gedrückt
{
if (ll2 == 0) // lauflicht leer?
add2 = 1;
else if (ll2 == 13) // lauflicht voll?
add2 = -1;
// ansonsten passiert einfach nix
}
//----------
if (add1 != 0) // wenn das lauflicht grad mal läuft
{
if (wait1 == 0) // 200 ms sind rum oder is die erste LED...
{
ll1 = ll1 + add1; // lauflicht 1 erhöhen/verringern
wait1 = 200; // wieder von vorn zählen
}
wait1--; // zähler verringern, eine millisek. ist rum...
}
if (add2 != 0) // wenn das lauflicht grad mal läuft
{
if (wait2 == 0)
{
ll2 = ll2 + add2; // lauflicht 2 erhöhen/verringern
wait2 = 200; // wieder von vorn zählen
}
wait2--;
}
//----------
wait (1 ms);
if ((ll1 == 0) || (ll1 == 13)) // wenn endstellung erreicht, dann nix mehr machen...
{
wait1 = 0;
add1 = 0;
}
if ((ll2 == 0) || (ll2 == 13)) // wenn endstellung erreicht, dann nix mehr machen...
{
wait2 = 0;
add2 = 0;
}
//----------
// jetzt hier einfach mal die LEDs setzen. Status is in ll1 und ll2 drin.
// also einfach so viele Ausgänge auf 1 setzen, wie der Wert drin is...
}
-
Hallo Bigfoot,
vielen dank für deine Mühe aber leider habe ich von C keine Ahnung.
Ich habe das Problem selber gelöst, indem ich alle goto durch Return ersetzt habe.
MFg
Matthias
-
freut mich, dass es nun klappt!
c code ist gar nicht so-viel-anders. ob nun "if x bla bla endif" oder if(x) {bla;bla;} is doch egal.
keine angst vor c!
-
Gratulation. Wenn es funktioniert, dann kannst du es ja so lassen.
Natürlich ist der Code nicht optimal aber wenn er seinen Zweck erfüllt, dann kannst du ihn wegspeichern und bei Bedarf optimieren und rumprobieren...
Ja, C-Code ist nicht wirklich sehr viel anders.
Es kann auf alle Fälle nicht schaden, wenn man ihn halbwegs lesen kann, dann kann man viele Beispiele mehr verwenden. Selber schreiben muss man ihn dazu nicht können.
Vielleicht könnte man sogar einen Wiki-Beitrag machen, der die wichtigsten Sprachen (Basic, C und Asm) gegenüberstellt und die jeweiligen Equivalente von Schleifen, Kommentaren und Bedingungen in einer Tabelle gegenüberstellt, sodass Anfänger Codebeispiele in anderen Sprachen einfacher durchschauen und ggf. auch einfacher umsteigen können.
-
@Matthias
Auch wenn dein Programm jetzt funktioniert, habe ich die trotzdem mal ein Programm geschrieben wo du sehen kannst wie man so was macht.
Ich muß ehrlich sagen als ich dein Programm gesehen habe standen mir die Haare zu Berg.
Code:
$regfile = "8515def.dat"
Dim I As Integer
Dim Schalter1an As Bit
Dim Schalter2an As Bit
Dim Bytetemp As Byte
Config Pina.0 = Input
Config Portb = Output
Config Portc = Output
Portb = 0
Portc = 0
Do
' lampen 1
If Pina.0 = 1 Then
If Schalter1an = 1 Then
If Portb = 255 Then
Schalter1an = 0
End If
Else
If Portb = 0 Then
Schalter1an = 1
End If
End If
While Pina.0 = 1 ' WARTEN BIS TASTE WIDER LOSGELASSEN
Wend
End If
' end lampen 1
' lampen 2
If Pina.1 = 1 Then
If Schalter2an = 1 Then
If Portc = 255 Then
Schalter2an = 0
End If
Else
If Portc = 0 Then
Schalter2an = 1
End If
End If
While Pina.1 = 1 ' WARTEN BIS TASTE WIDER LOSGELASSEN
Wend
End If
' end lampen 2
' lampen 1
If Schalter1an = 1 And Portb <> 255 Then
Bytetemp = Portb
Bytetemp = Bytetemp + 1
Portb = Portb Or Bytetemp
End If
If Schalter1an = 0 And Portb <> 0 Then
Shift Portb , Right
' Shift Portb , Left ' anders rum
End If
' end lampen 1
' lampen 2
If Schalter2an = 1 And Portc <> 255 Then
Bytetemp = Portc
Bytetemp = Bytetemp + 1
Portc = Portc Or Bytetemp
End If
If Schalter2an = 0 And Portc <> 0 Then
Shift Portc , Right
' Shift Portc , Left ' anders rum
End If
' end lampen 2
For I = 1 To 5
'Die for Schleife ist nur beim Simulator notwendig, weil der wait befehl mit der LCD Anzeige im Simulator nicht funktioniert.
'Also wenn fertig Schleife durch Wait ersetzen.
' Waitms 0.1
Next I
Loop
mfg Guy
Edit
Hier noch ein Beispiel wie du zum Beispiel die Lampen auch ausschalten kannst.
Code:
If Schalter1an = 0 And Portb <> 0 Then
' Shift Portb , Right
' Shift Portb , Left ' anders rum
Portb = Portb / 2
End If
Mußt dich mal mit binär rechen abgeben. Als Beispiel, bei einer Binärzahl verschiebst du durch Division alles nach Rechts, und durch Multiplikation alles nach links.