PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger Code problem



.:tuxianer:.
23.07.2007, 18:34
hi,
ich wollte ein Script schreiben, das die LED#s blinken lässt, wenn ein Schalter gedrückt ist. Ich habe folgenden Code geschrieben:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Portd.7 = Output
Config Portc.1 = Output
Config Portc.0 = Output
Config Pina.7 = Input

Taster Alias Pina.7
Rot Alias Portd.7
Gelb Alias Portc.1
Gruen Alias Portc.0

Porta.7 = 1
Rot = 0
Gelb = 0
Gruen = 0


Do

If Taster = 1 Then

Rot = 0
Waitms 50
Rot = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Gruen = 0
Waitms 50
Gruen = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Else

Rot = 0
Gelb = 0
Gruen = 0

End If


Loop

End

Nur läuchten nun beim Drücken des tasters alle 3 Led's und beim Loslassen blinken sie,...was mach ich falsch?

PicNick
23.07.2007, 18:57
Deine "Taster=1" Befehle unterbrechen das Leuchten einer Farbe immer nur für 50 mS. das ist nicht wirklich lange, da siehst du nix blinken.
Schreib mal Waitms 500 ( halbe Sekunde), dann wirst du mehr erkennen

.:tuxianer:.
23.07.2007, 19:00
daran liegts nicht...wenn ich das IF zeugs weg lasse blinken sie ja auch...

PicNick
23.07.2007, 19:06
Ich vermute mal, daß du den Input-Pin mit dem Pullup auf +5 V ziehst und mit dem Taster bei Betätigung auf GND. Das wär zumindest üblich.
Dann ist deine Abfrage aber genau verkehrt
If Taste = 0 Then ' TASTE GEDRÜCKT
ELSE
' nicht gedrückt.

Sauerbruch
23.07.2007, 19:10
Bei den meisten Boards muss man sowohl bei den Tastern als auch bei den LED´s "umdenken": Die Taster sind i.d.R. nach Masse geschaltet, d.h. wenn Du ihn drückst, geht der Eingang auf Low. Deshalb ist ja auch der PullUp-Widerstand so wichtig, den Du mit "Porta.7=1" gesetzt hast. Der zieht den Eingang auf ein sauberes high, wenn der Taster offen ist.
In Kurzform: Taster gedrückt = Eingang low, Taster offen = Eingang high.
Das erklärt schonmal, weshalb die LEDs blinken, wenn der Taster nicht gedrückt ist.

Dass sie alle angehen wenn der Taster nicht gedrückt ist wird wohl daran liegen, dass sie von den Ausgängen nicht nach "Minus", sondern nach "Plus" geschaltet sind. Damit leuchten die LEDs, wenn der Ausgang low ist.

Ändere Deinen Code doch mal dahin ab, dass Du Rot, Gelb und Gruen als 1 setzt, die Blink-Schleife laufen lässt, wenn Pina.7 0 ist, und unter "Else" Rot, Gelb und Gruen auf 0 setzt.


Oops - @ PickNick: Da haben wir wohl ziemlich gleichzeitig geschrieben... O:)

.:tuxianer:.
23.07.2007, 19:10
immer noch das gleiche

.:tuxianer:.
23.07.2007, 19:16
@Sauerbruch:

so???
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Portd.7 = Output
Config Portc.1 = Output
Config Portc.0 = Output
Config Pina.7 = Input

Taster Alias Pina.7
Rot Alias Portd.7
Gelb Alias Portc.1
Gruen Alias Portc.0

Porta.7 = 1
Rot = 1
Gelb = 1
Gruen = 1


Do

If Taster = 0 Then

Rot = 0
Waitms 50
Rot = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Gruen = 0
Waitms 50
Gruen = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Else

Rot = 0
Gelb = 0
Gruen = 0

End If


Loop

End


da passiert immer noch das gleiche...


ich habe im Grunde die Schaltung mit 3 Led's:


https://www.roboternetz.de/wissen/images/3/30/Avrtutorial_grundschaltung_mitquarz.gif

chr-mt
23.07.2007, 19:29
Einzelne Pins konfigurieren sollte man übrigens mit config pin.x
Siehe Bascom Hilfe.

Du läßt immer noch alle Leds leuchten, wenn der Schalter offen ist:
Rot = 0
Gelb = 0
Gruen = 0

Gruß
Christopher

.:tuxianer:.
23.07.2007, 19:37
Wenn ich es so abändere immer noch das gleiche:





Else

Rot = 0
Gelb = 0
Gruen = 0

End If


Loop

End

Sauerbruch
23.07.2007, 19:39
@tuxianer:

im Schaltplan isses genau so: Taster nach masse, LED´s nach +5V. Wenn Du jetzt noch im "Else"-Teil Rot, Gelb und Gruen auf 1 setzt (wie chr-mt schrieb), müsste es klappen...

Rot = 0: LED an
Rot = 1: LED aus!!

Ist komisch aber wahr...

.:tuxianer:.
23.07.2007, 19:41
sp?



$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Portd.7 = Output
Config Portc.1 = Output
Config Portc.0 = Output
Config Pina.7 = Input

Taster Alias Pina.7
Rot Alias Portd.7
Gelb Alias Portc.1
Gruen Alias Portc.0

Porta.7 = 1
Rot = 1
Gelb = 1
Gruen = 1


Do

If Taster = 0 Then

Rot = 0
Waitms 50
Rot = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Gruen = 0
Waitms 50
Gruen = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Else

Rot = 1
Gelb = 1
Gruen = 1

End If


Loop

End


ob ich die im Else Teil auf 0 oder eins schalte mahct keinen Unterschied...immer noch das gleiche...

.:tuxianer:.
23.07.2007, 19:43
OK es geht doch...es hat nciht richtig programmiert, was mit dem problem zusammenhängt ohne die Kondensatoren gehts!

.:tuxianer:.
23.07.2007, 20:10
N och nen Problem:




$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Portd.7 = Output
Config Portc.1 = Output
Config Portc.0 = Output
Config Pina.7 = Input

Taster Alias Pina.7
Rot Alias Portd.7
Gelb Alias Portc.1
Gruen Alias Portc.0

Porta.7 = 1
Rot = 1
Gelb = 1
Gruen = 1

Programmstart:
If Pina.7 = 0 Then

Goto Led_lauf

Else

Goto Blinken

End If


Blinken:
Rot = 0
Gelb = 0
Gruen = 0
Wait 50
Rot = 1
Gelb = 1
Gruen = 1
Goto Programmstart


Led_lauf:
Rot = 0
Waitms 50
Rot = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Gruen = 0
Waitms 50
Gruen = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50
Goto Programmstart


End

Wenn ich den schalter beim Startengedrückt halte Laufen die Leds durch...wenn ich ihn jedoch loslasse bleiben die Led's dauerhaft an, auch wenn ich ihn wieder drücke...

Sauerbruch
23.07.2007, 20:51
...ich weiß ja nich´ ob man beim Konfigurieren der Ein- und Ausgänge nicht immer "Config PortX.Y schreiben sollte (auch wenn´s ein Eingang werden soll). Man möge mich korrigieren, wenn´s anders ist, aber versuch´s doch mal mit "Config Porta.7 = Input" anstatt "Config Pina.7 = Input". Oder gleich direkt über´s Register: DDRA.7 = 0

.:tuxianer:.
23.07.2007, 20:58
das Problem bleibt leider in gleicher weise bestehen...

.:tuxianer:.
23.07.2007, 21:51
keiner ne idee wo der fehler liegen könnte?

Sauerbruch
23.07.2007, 21:53
...wieder nur ´ne vage Vermutung meinerseits: Vielleicht isses ja ein Problem, dass Du nach der "Alias"-Festlegung (Taster = Pin7.a) später nicht "Taster", sondern Pina.7 abfragst? (gleich nach Programmstart...)

Bin ja auch noch Anfänger, aber ich würd´s mal mit

Programmstart
If taster = 0 then
...

probieren.

Ansonsten hab´ ich meine Programme, wenn sie nicht so richtig wollten, öfters mal in Einzelprogramme zerlegt um zu sehen, wo´s denn eigentlich hakt. Das bringt auch manchmal Licht ins Dunkel...

.:tuxianer:.
23.07.2007, 22:37
ich glaub das liegt am Bkinken an sich...nur der Blinkcode alleine geht glaube auch nicht...könnte es daran liegen? das es sich bei dem Wait oder so aufhängt?

Sauerbruch
23.07.2007, 23:09
das es sich bei dem Wait oder so aufhängt?

Ich hab´ Derinen Code nochmal genauer angesehen - Du hast "wait 50" geschrieben. Das wären 50 Sekunden, was ja ienem Aufhängen schon sehr nahe kommt... =P~

Wie PickNick ein paar Kilometer weiter oben schonmal vorgeschlagen hatte - nimm doch mal waitms 500, das wären dann 2 Hz, denn 50ms (die Du wahrscheinlich haben wolltest) kann das Auge m.E. wirklich nicht mehr auflösen...

.:tuxianer:.
24.07.2007, 12:38
ok ich werds nochmal ptobieren...

MeckPommER
24.07.2007, 13:04
und wenn das Programm dann das tut, was es soll, würde ich im Hinblick auf kommende Projekte dringend empfehlen, das Programm "sauberer" zu machen.
- Tasterabfrage mit IF ... ELSE ... ENDIF in eine Do-Loop Schleife
- keine GOTO sondern GOSUB mit RETURN
- für die Programmteile "blinken" und "durchlauf" Prozeduren schreiben, die dann mit CALL angesprochen werden

Das mag kleinlich klingen, aber es ist enorm wichtig, wenn man bei etwas größeren Projekten noch die Übersicht behalten möchte.
Die Verwendung den Alias ist aber schonmal sehr gut (würde ich auch bei dem Taster durchhalten) damit du, wenn du mal die Pinbelegungen änderst, nicht das ganze Proekt nochmal durchforsten musst, wo welche Ports und Pins angesprochen werden.

Gruß MeckPommER

.:tuxianer:.
24.07.2007, 16:45
Ich bin neu in der sprache wie funtzt das mit Gosub und wo ist der Unterschied zu goto? Und wie realisiere ich das mit den Prozzeduren und call?

MeckPommER
25.07.2007, 13:22
Der Unterschied zwischen goto und gosub/return ist, das ein goto einfach zu einem Lable springt. Danach musst du halt am ende der routine "per hand" wieder zurückspringen.
Springst du mit gosub in ein Unterprogramm und beendest dies mit einem return, springt das Programm automatisch wieder zurück zum Befehl nach dem gosub.

Der enorme Vorteil liegt darin, das du das Unterprogramm von verschiedenen Stellen im Hauptprogramm aus aufrufen kannst, ohne das dein Programmablauf beeinflusst wird (z.b. immer zum Startpunkt des Hauptprogramms zurückkehrt)

Das mit den Prozeduren ist natürlich noch etwas eleganter, da du dann deinem Unterprogramm auch bestimmte Variablen sauber übergeben kannst. Somit kannst du dein Programm gut strukturieren und einfache Programmteile übersichtlich zu immer komplexeren Aufgabenlösungen ordnen.
Bascom hat eine Hilfe eingebaut, die zumeist auch ein kleines Beispielprogramm beinhaltet. Da steht auch alles über Prozeduren, Funktionen, gosub, etc. ... Ruhig mal reinschauen und nachmachen. Die Atmels können ca. 10000 Mal neu gebrutzelt werden, da ist viel Spielraum für Fehlversuche :)

Viel Erfolg wünscht
MeckPommER

.:tuxianer:.
25.07.2007, 17:16
ok ich habs noch mal mit zwei Schaltern und gosub gemacht...





$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Portd.7 = Output
Config Portc.1 = Output
Config Portc.0 = Output
Config Pind.0 = Input
Config Pind.1 = Input

Taster Alias Pind.0
Taster2 Alias Pind.1
Rot Alias Portd.7
Gelb Alias Portc.1
Gruen Alias Portc.0

Portd.0 = 1
Portd.1 = 1
Rot = 1
Gelb = 1
Gruen = 1

Do
If Taster = 0 Then Gosub Led_lauf


If Taster2 = 0 Then Gosub Blinken
Loop

Blinken:
Rot = 0
Gelb = 0
Gruen = 0
Waitms 500
Rot = 1
Gelb = 1
Gruen = 1
Waitms 500
Return


Led_lauf:
Rot = 0
Waitms 50
Rot = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50

Gruen = 0
Waitms 50
Gruen = 1
Waitms 50

Gelb = 0
Waitms 50
Gelb = 1
Waitms 50
Return


End