Was mach ich nur falsch :-(

Gast #1204772
Lesenswert?

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
Gast #1204798
Lesenswert?

> 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.
Gast #1204800
Lesenswert?

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
Gast #1204804
Lesenswert?

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
Gast #1204817
Lesenswert?

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...
Gast #1204819
Lesenswert?

>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 ;)
Gast #1205292
Lesenswert?

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
Gast #1206323
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren