Was mach ich nur falsch :-(

Gast #1204772
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
> 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
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
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
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
Gast
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
>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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.