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?
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...
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.