Hallo Gemeinde.... Ich werd noch mal Irre... Der code funktioniert soweit nur hab ich das problem das wenn ich die rote oder die grüne Led einschalte das der AVR nicht die vollen 5V am port ausgibt sondern nur ca. 1,5V... Beim Lauflicht (Sub Warten) hab ich allerdings die vollen 5V pro port wenn ich es einschalte, beim Flashen ebenso. Nur eben bei der Einzelansteuerung nicht.... Vielleicht könnt Ihr mir weiter helfen... Ich währe euch sehr dankbar... Danke schon mal für eure Hilfe.... Gruß Flo P.S. Code hängt dran
> If Pind.0 = 1 Then Gosub Warten Else Gosub Aus > If Pind.1 = 1 Then Set Portc.1 Else Reset Portc.1 Das liegt an deinen "else". Wenn Pind.0=0 ist werden alle LEDs ausgeschaltet. Egal ob Pind.1=1 ist. Dann wird bei Pind.1=1 Portc.1 eingeschaltet und in der Loop dann gleich wieder aus.
Das ist BASIC, oder? Da kenne ich mich jetzt nicht so aus, aber folgende Frage hätte ich:
1 | If Pind.0 = 1 Then Gosub Warten Else Gosub Aus 'Leute steigen ein (farbwechsel) |
2 | If Pind.1 = 1 Then Set Portc.1 Else Reset Portc.1 'Einsteigen beendet (Türen Schließen sich) |
3 | If Pind.2 = 1 Then Set Portc.2 Else Reset Portc.2 'Fahrt beginnt (fahrt läuft) |
4 | If Pind.3 = 1 Then Gosub Flash Else Gosub Aus 'Turbomodus (Bypass offen) |
Du drückst also den Taster an Port D1, und erwartest, dass die LEDs an sind, richtig? Die Abfrage auf Port D3 schaltet aber doch alle LEDs wieder aus. Du müsstest dein Programm so ändern, dass der Rest der Schleife nicht abgearbeitet wird, sondern wieder von vorne beginnt, wenn eine Taste gedrückt wurde. In C wäre das eine switch-Anweisung, heisst das in BASIC nicht case-Anweisung? Ralf
Der Code funktioniert doch bestens?! In der deiner Hauptschleife:
1 | Do |
2 | |
3 | If Pind.0 = 1 Then Gosub Warten Else Gosub Aus ' (1) |
4 | If Pind.1 = 1 Then Set Portc.1 Else Reset Portc.1 ' (2) |
5 | If Pind.2 = 1 Then Set Portc.2 Else Reset Portc.2 ' (3) |
6 | If Pind.3 = 1 Then Gosub Flash Else Gosub Aus ' (4) |
7 | |
8 | Loop |
passiert folgendes: (Annahme: Knopf 2 gedrückt --> Pind.1 = 1) - (1) Pind.0 = 0, also alles ausschalten - (2) Pind.1 = 1, also PortC.1 auf H, alles andere bleibt - (3) Pind.2 = 0, also PortC.2 auf L, alles andere bleibt - (4) Pind.3 = 0, also alles ausschalten neue Schleife... PortC.1 ist also nur von Stufe (2) bis Stufe (4) an, vielleicht 35..40% der Zeit -> also sind etwa 1.5 .. 2.0V zu erwarten, im Mittel. Mit einem Osziloskop würdest du eine schöne PWM sehen... Ahoi, Martin
vielleicht hätte ich noch erwähnen sollen das es alles Schalter sind die an den port´s hängen.... Wie gesagt... ich brauche die vollen 5V wenn ich die rote oder die grüne LED einschalte... Gruß Flo
ach ja... noch was.... Es ändert sich auch nichts selbst wenn ich das setzen und rücksetzen der ports in Sub´s schreibe... ich weis echt nicht mehr weiter... ich verzweifel noch mal an dem ding...
>vielleicht hätte ich noch erwähnen sollen das es alles Schalter sind die >an den port´s hängen.... Das ist völlig Wurst. Deine "else" sind schuld. Damit hast du dir einen Rechteckgenerator gebaut wenn Pind.1 oder Pind.2 an sind und Pind.0 oder Pind.3 aus ;)
@Holger... ja scheiße... und wie krieg ich das hin das, das so läuft wie ich es will?? Gruß FLo
Hat keiner mehr ne iddee wie ich das in den griff kriegen könnte??!! Gruß Flo
Was ist denn jetzt dein Problem? Willst du es vorgekaut bekommen? Dann musst du es sagen, und dir wird geholfen. Es wurde doch gesagt, wo das Problem liegt, was fehlt denn noch? Man reagiert hier halt kritisch, wenn der Eindruck entsteht, dass die Fragesteller nur zu faul sind, um das Handbuch des Compilers/Interpreters etc. zu lesen, oder sich selbst Gedanken zu machen, oder einfach mal die Neugier spielen zu lassen und zu PROBIEREN. Konkrete Frage, konkrete Antwort, so lief es doch am Anfang deines Beitrags. Und jetzt erwartest du, dass man dir die fertige Lösung liefert, oder was? Wie wärs hiermit:
1 | (1) If Pind.0 = 1 AND Pind.3 = 0 Then |
2 | Gosub Warten |
3 | ElseIf Pind.1 = 0 AND Pind.2 = 0 |
4 | Gosub Aus |
5 | endIf |
6 | (2) Portc.1 = Pind.1 'Vereinfachung |
7 | (3) Portc.2 = Pind.2 'Vereinfachung |
8 | (4) If Pind.3 = 1 AND Pind.0 = 0 Then |
9 | Gosub Flash |
10 | ElseIf Pind.1 = 0 AND Pind.2 = 0 |
11 | Gosub Aus |
12 | EndIf |
Ob die Vereinfachung in 2 und 3 funktioniert, weiss ich nicht, ich komme aus der 8051er-Ecke und programmiere ASM und C. Ob es generell funktioniert, kann ich dir daher nicht sagen, aber damit dürftest du weiterkommen. Du darfst halt nur dann alles ausschalten, wenn kein Schalter aktiviert ist => Logisch, oder? :) Andersrum darfst du "Flash" und "Warten" nur dann aufrufen, wenn die jeweils andere Bedingung nicht eingetreten ist, sonst rufst du ja immer beides auf, wenn beide Schalter aktiv sind. Das heisst, dass du eigentlich noch prüfen musst, ob D0 und D3 gleichzeitig aktiv sind, und dafür musst du auch noch n Fall abbilden. Und zum Schluss ist die Prüfung von C1 und C2 immer noch falsch, weil "AUS" unabhängig von diesen beiden Schaltern aufgerufen werden kann, d.h. die beiden Schalter musst du eigentlich für den Aufruf von "AUS" auch noch berücksichtigen. So, damit hättest du eigentlich exakt 16 Fälle (=vier Schalter) zu berücksichtigen. Das macht man nicht mehr mit IF-Statements, sondern mit Select-Case-Statements. Damits nicht zu einfach wird, darfst du die Verwendung hier nachlesen: http://avrhelp.mcselec.com/bascom-avr.html Ich hoffe, du bekommst es jetzt allein gebacken, ich klopp mich jetzt nämlich in die Heia... :) Ralf
Moin Ralf.... Ich danke dir... es funzt.... wenn der fertige Code erwünscht ist dann einfach bescheid sagen dann stell ich ihn euch zur verfügung... Es sind 3 versch. RGB Lauflichter mit einstellbarer Geschwindigkeit. Sehr gut für anfänger wie mich.... :-) :-) :-) Gruß Flo
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.