Archiv verlassen und diese Seite im Standarddesign anzeigen : Controller Programmierung Verständniss+Problem
hallo hab getsern meinen At mega 32 fertig mit der Platine verlötet funktioniert einwandfrei \:D/
>bin anfänger in Bascom hab aber schon erfahrung in programmierung also bin nicht ganz blöd<
habe momentan fast genau sowas
http://www.rn-wissen.de/images/3/30/Avrtutorial_grundschaltung_mitquarz.gif
ich bin vorher nach einem turtorial gegangen
wo der taster als input genommen wird und bei druck auf den taster leuchtet die LED solange man den taster hält...
mein versuch das prog etwas zu erweitern und bei druck auf den taster einen ablauf zu zu erzeugen...
Problem: die led blinkt von selbst los bei druck auf taster leuchtet sie normal :D
sieht bei mir so aus:
,,,,
Config Portc.0 = Output
Config Pina.7 = Input
Porta.7 = 1
Do
If Pina.7 = 1 Then
Portc.0 = 1
Waitms 100
Portc.0 = 0
Waitms 100
Portc.0 = 1
Wait 1
Portc.0 = 0
Wait 1
Portc.0 = 1
Else
Portc.0 = 0
End If
Loop
End
meine bitte währe mir einen tipp zu geben und mich evtl auf eine seite zu verweisen wo ich das lernen kann besser mit befehlen umzugehen hab nur die standart sachen gefunden
____________
gruß deable
Sauerbruch
08.04.2010, 12:03
Moin deable,
mit den Befehlen liegst Du schon ganz gut - nur muss man bei "typischem" Anschluss von einem Taster und einer LED zweimal umdenken:
Dein Taster zieht den Eingang ja nicht auf +5V, sondern auf GND. Das macht man eigentlich immer so, weil die Controller PullUp-Widerstände eingebaut haben, die den Anschluss erstmal auf einen sauberen High-Pegel ziehen. Natürlich könntest Du den Taster auch auf +5V legen und mit einem externen PullDown-Widerstand arbeiten - aber so spart man halt ein Bauteil.
Den Tastendruck erkennst Du also daran, dass PINA.7 = 0 wird (Umdenken Nr. 1).
Bei gedrücktem Taster wird also nur der Teil hinter dem "else" ausgeführt - aber warum ist die LED dann an?
Das liegt darn, dass die LED nicht vom I/O-Port nach Masse geht, sondern von +5V zum I/O-Port! Heißt im Klartext, dss die LED angeht, wenn der Port 0 wird (Umdenken Nr. 2).
Auch hierfür gibt´s einen guten Grund: Der Strom, den ein I/O-Port nach Masse ableiten kann wenn er LOW ist, ist größer als der Strom den er abgeben kann, wenn er HIGH ist. Wenn man also ohne Treiberstufe o.ä. "Endverbraucher" wie LEDs direkt ansteuern möchte, ist es daher ratsam, sie zwischen +5V und dem PORT zu schalten.
hallo Sauerbruch
funktioniert jetzt bestens
wollte mal aussprechen das ich das sehr gut finde das leute wie du sich hier die zeit nehmen und so gut weiterhelfen
danke ^^
_________
gruß d3a6le
ich hoffe das ist in odnung wenn ich noch eine fragen hier aufliste....
ich möchte versuchen den controller jetzt so zu programmieren das die led bei einem einfachen druck die x abfolge macht und bei 2sec halten die y abfolge macht .. ist das realisierbar?
welcher befehl passt
habe an sowas gedacht wie:
If Pina.7 = 0 for 2 Then
Portc.0 = 0
or if Pina.7 = 0 then.....
Sauerbruch
08.04.2010, 14:05
ich hoffe das ist in odnung wenn ich noch eine fragen hier aufliste....
Klar ist das in Ordnung - dafür ist so´n Forum ja da!
Wenn man es sich leisten kann, dass der Controller währenddessen nichts anderes macht als Warten, kann man Zeiten in Bascom ganz gut mit den Befehlen
wait x (X Sekunden)
waitms x (X Millisekunden)
waitus x (X Mikrosekunden)
messen. Die sind zwar nicht 100% genau, aber für solche Taster-Geschichten allemal ausreichend. Man könnte also ein wait 2 schreiben, und danach den Taster erneut abfragen. Ist er immernoch gedrückt -> Aktion 1, andernfalls Aktion 2. Das hat natürlich den gravierenden Nachteil, dass auch nach einem kurzen Druck die vollen 2 Sekunden gewartet werden, was vielleicht extrem nervig sein könnte.
Etwas aufwendiger aber komfortabler ist es, eine Variable z.B. alle 0,1 Sekunden hochzählen zu lassen, so lange wie der Taster gedrückt ist. Nachdem der Taster losgelassen wurde fragt man sie ab, und ist sie unter 20 -> Aktion 1, ansonsten Aktion 2. Als Code könnte das so aussehen:
...
...
Dim Z as Byte
Do
..
..
If PIND.7 = 0 then
Zahl = 0
While PIND.7 = 0
Zahl = Zahl + 1
waitms 100
Wend
If Zahl < 20 then
...
...
...
Else
...
...
...
End if
End if
Loop
Wenn Du in Bascom auf den Button mit dem blauen Fragezeichen klickst, geht die Hilfe auf. Und dort gibt es das Kapitel "Bascom Language Reference". Da kann man nicht nur sehen, was es alles an interessanten Möglichkeiten gibt, sondern es sind zu fast allen Befehlen auch einleuchtende Beispiele angegeben. Da solltest Du unbedingt mal reinschauen!
ich bevorzuge die komfortable variante :)
bei dem code hab ich jedoch probleme
ich zähl mal mein verständiss und gleichzeitig nicht verständiss auf
Dim Z as Byte : was bedeutet das?
If PIND.7 = 0 then : wenn taster gedrückt dann zahl = 0 (zahl alias??? ist ja eng eig.)
während der taster gedrückt ist +1 sec
wartet 100 ms
wend verstehe ich auch trotz help nicht
Sauerbruch
08.04.2010, 15:32
Sorry - das kommt davon, wenn man > 1 Sache gleichzeitig macht :-)
Es muss natürlich heißen
Dim Zahl as Byte
Wenn der Controller mit Variablen arbeiten soll, muss für jede Variable 1. ein Name (fast beliebig) und 2. ein geeigneter Variablen-Typ festgelegt werden. Gängige Typen sind z.B.
Bit (0 oder 1)
Byte (8 Bits, d.h. die Variable kann Werte von 0 bis 255 annehmen)
Word (16 Bits, d.h. die Variable kann Werte von 0 bis 65.535 annehmen)
Integer (16 Bit, kann Werte von-32.768 bis +32.767 annehmen)
Mit "Dim Zahl as Byte" wird eine Byte-Variable angelegt.
While-Wend-Schleifen werden so lange durchaufen, wie die While-Bedingung erfüllt ist. In diesem Code heisst das, dass alle 100ms die Variable "Zahl" um eins erhöht ist - solange PIND.7=0 bleibt.
Lässt Du den Taster los ist PIND.7=1, und die While-Wend-Schleife wird augenblicklich verlassen. Dann muss man nur noch checken ob die Variable Zahl < 20 oder > 20 ist, und schon weiß man, ob der Taster länger als 2 Sek. gedrückt wurde oder eben nicht.
Die Variable behält ihren Wert aber erstmal weiter - und deshalb muss man sie unbedingt zurücksetzen, wenn der nächste Tsterdruck erfolgt. Sonst würde der Controller ganz gelassen vom alten Wret aus weiterzählen - und die Variable hätte einen falsch hohen Wert. Deshalb steht zwischen "If PIND.7=0" und der While-Wend-Schleife die Anweisung "Zahl = 0".
Jetzt klarer??
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.