PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Port mit Tastendruck dauerhaft schalten



RAM
18.05.2009, 20:46
Hi Leute, brauch mal wieder eure Hilfe...

Ich hab folgendes vor: An einem Mikrocontrollerpin hängt ein Taster. Wird dieser Taster kurz gedrückt, schaltet ein Port auf High, wenn ich den Taster wieder drücke, soll dieser Port wieder auf Low schalten. Kann mir da vielleicht jemand helfen, wie der Bascom-Code dafür vom Prinzip her aussieht? Bin ja nicht gerade die Programmierleuchte...

Danke schon mal im vorraus,

Martin

Willa
18.05.2009, 21:28
Das sollte vom Prinzip ungefähr so gehen (pseudocode):


dim angeschaltet as bit
if taster = 1 and angeschaltet = 0 then
port = 1
angeschaltet = 1
elseif taster = 1 and angeschaltet = 1 then
port = 0
angeschaltet = 0
end if
waitms 1000

for_ro
18.05.2009, 21:34
Oder schau dir mal
Debounce PinX.Y, 0, toggle_port, sub
und
Toggle PortV.W
an.
PinX.Y steht dabei für den Pin, an den der Taster angeschlossen ist, 0 für Taster schaltet nach GND (1 für Taster schaltet nach VCC) und toggle_port ist ein Label, wo der Toggle Befehl steht. PortU.V ist entsprechend der Pin, den du umschalten möchtest.

Gruß

Rolf

RAM
18.05.2009, 21:42
Danke Leute, werd eure Beispiele mal ausprobieren!

Gruß,

Martin

Gary
02.06.2009, 13:48
hi

ich bin auch nen ziemlicher anfänger, hab mir gerade erst nen µC gekauft^^

ich baue gerade die selbe schaltung wie RAM, und habe das programm mal auf meinem controller geladen. nur bei mir blinkt die led jez. bei drücken des taster bleibt der takt stehen und wen ich wieder los lasse blinkt sie weiter

hir is ma das programm das ich aufgespielt habe

$regfile = "m8def.dat"
$framesize = 8
$swstack = 8
$hwstack = 8
$crystal = 8000000

$baud = 9600

Config Portb.0 = Output
Led Alias Portb.0
Config Pinb.1 = Input
Taster Alias Pinb.1
Portb.1 = 1

Do
Dim Angeschaltet As Bit
If Taster = 1 And Angeschaltet = 0 Then
Led = 1
Angeschaltet = 1
Elseif Taster = 1 And Angeschaltet = 1 Then
Led = 0
Angeschaltet = 0
End If
Waitms 100
loop

End

ich nehme mal stark an das ich für "angeschaltet" irgentwas einsetzen soll #-o

nur keine ahnung was^^

MeckPommER
02.06.2009, 14:11
Mit portb.1 = 1 hast du den Pullup eingeschaltet. Wenn du mit dem Taster vom Pin nach Masse schaltest, sieht es so aus, das der Taster 1 liefert, wenn er nicht gedrückt ist und 0, wenn er gedrückt ist.
Deine IF-Konstruktion schaltet also bei jedem Durchlauf von 1 nach 0 und zurück, da Taster ungedrückt = 1 ist.

Gruß MeckPommER

P.S.: ab besten auch gleich die Werte für framesize, stacksize, etc. von 8 raufsetzen auf 40 oder 60 ... sonst wirds dem Controler zu eng ;-)

Gary
02.06.2009, 15:18
ok ich habe die 1 gegen eine 0 getauscht, jetzt funktioniert es.

nur darf ich jez den taster nur ganz kurz drücken sonst registriert der gleich 2 einsen, wie kann ich das verhindern? denn das is echt unpraktisch.

Ceos
02.06.2009, 15:26
du solltest auf flanken reagieren, d.h. du merkst dir den zustand des schalters, wie du dir den zustand der LED merkst und wenn der schalter vorher 0 und jetzt 1 ist reagierst du erst ....

also einfach ein

And letzteTaste = 0 hinzufügen und bei jedem durchlauf am ENDE letzteTaste mit dem wert des aktuellen taster belegen

Willa
02.06.2009, 15:55
Oder du machst es ganz einfach wie in meinem Beispiel oben:

waitms 1000
am ende einfügen. Das geht natürlich nur wenn dein Programm nicht irgendetwas zeitkritisches machen muss.

Gary
02.06.2009, 16:00
ok ich hab jez mehrmals versucht...

von wo bis wo ist ein durchlauf und in welcher zeile genau ist das ende. denn ich tu den befehl eindeutig an die falsche stelle ^^

Willa
02.06.2009, 16:03
Sorry, mein Beispiel war auch nicht 100% korrekt glaube ich.
Nach der Zeile "angeschaltet = 0" fügst du ein waitms 1000 ein.
Nach der Zeile "angeschaltet = 1" fügst du auch ein waitms 1000 ein.

Gary
02.06.2009, 16:14
die "waitms 1000" is schon zuverlässig aber, wen man die led direckt wieder aus schalten will muss man erst noch warten, ich würde das mit den "And letzteTaste = 0" gerne mal ausprobieren

Ceos
02.06.2009, 16:21
das AND letzteTaste = 1 packst du an deine beiden If Abfragen an

folgender pseudocode (bascom iss nich mein ding)

jetztTaster = Taster
If jetztTaster == 1 and letzterTaster == 0
If Licht == 1
LichtAUS
Licht = 0
else
LichtAN
Licht = 1
End If
End If
letzterTaster = jetztTaster

den umweg über den "jetztTaster" musst du machen, sonst würde das ärger geben, wenn der taster während der bearbeitung den wert wechselt!!!

drückst du den knopf, geht der Tasterwert von 0 auf 1, in der abfrage ist letzterTaster noch 0 und jetztTaster 1, die lichtabfrage wird gemacht und geschalten, bleibt der taster gedrückt, sind ständig beide letzterTaster und jetztTaster 1, also ignoriert er das, lässt du ihn los, wird letzterTaster nach einer abfrage auch 0 und wenn du das nächtse mal drückst gehts wieder von vorne los

Gary
02.06.2009, 16:33
der befehl jetzttaster funzt nicht, wen ich das einbringe erstellt bascom keine hex datei, und genau so ist das mit AND letzteTaste = 1 sobalt ich es an die if befele hinten drann henge erstellt bascom keine hex

Ceos
02.06.2009, 17:54
jetztTaster ist auch eine variable und kein befehl!
genauso wie letzterTaster

ausserdem solltest du das "and blabla " an die bedingung anknüpfen und nicht irgendwo ddranhängen!




$regfile = "m8def.dat"
$framesize = 60
$swstack = 60
$hwstack = 60
$crystal = 8000000

$baud = 9600

Config Portb.0 = Output
Led Alias Portb.0
Config Pinb.1 = Input
Taster Alias Pinb.1
Portb.1 = 1
Dim Angeschaltet As Bit
Dim LetzerTaster As Bit
Dim JetztTaster As Bit

Do
JetztTaster = Taster
If JetztTaster = 1 And letzterTaster = 0 And Angeschaltet = 1 Then
Led = 0 '(ist das jetzt LED an oder LED aus ?)
Angeschaltet = 0
Elseif JetztTaster = 1 And letzterTaster = 0 And Angeschaltet = 0 Then
Led = 1
Angeschaltet = 1

End If
letzterTaster = JetztTaster
Loop

End


PS wenn du code schreiben willst, benutz die [ c o d e ]dein quelltext [ / c o d e ] klammern! einfach vorne und hinten dran machen wie du siehst und natürlich die leerzeichen dazwischen weglassen


kann es sein dass dir nciht ganz klar ist WAS du da geschriebn hast ? deine if abfragen sind total wirr und unlogisch, du musst mal verscuhen dir die if abrfragen in deutsch vorzustellen und ne tabelle mit den zuständen aufzeichnen

If JetztTaster = 1 And letzterTaster = 0 And Angeschaltet = 1 Then

wenn taster jetzt 1 und letztes mal 0 und led AUS, dann led AN

Elseif JetztTaster = 1 And letzterTaster = 0 And Angeschaltet = 0 Then

sonst wenn taster jetzt 1 und letztes mal 0 und led AN, dann led AUS
letztes mal taster = taster jetzt

Gary
02.06.2009, 17:59
aso? und was sollte ich statdessen da hin scheiben?
ich bin brutalster anfänger. ich hab so gut wie keine kenntnisse was das programmieren mit bascom anget, wen du mir befele sagst die es nicht gibt nutzt mir das ganix.

Ceos
02.06.2009, 18:04
schau nochmal hin, habs editiert

ja tut mir leid ich hab auch grad bissl abgehoben :p

du hast mit
dim variablenname as datentyp
dim angeschaltet as bit
schonmal ne variable angelegt nur als hinweis

Willa
02.06.2009, 18:08
Das ist wie von Ceos bereits gesagt ein "Pseudo-Code"! Den kannste nicht einfach per Copy+Paste einfügen. Damit Bascom das versteht muss z.B. hinter jedes "if" ein "then". Und doppelte "=" Zeichen gibts in Bascom auch nicht. Ausserdem musst du "LichtAUS" und "LichtAN" natürlich auch durch die entsprechenden Befehle ersetzen..... Schreib das um in die richtige Syntax, dann funktionierts bestimmt.

edit: das hat sich dann ja auch erledigt... :-D

Gary
02.06.2009, 18:25
jez hab ich es begriffen und verstehe auch entlich wiso das nich klappen knnte^^. nur ein problem hab ich noch, bascom will mir keine hex datei compilieren. weis einer warum?

Ceos
02.06.2009, 23:32
der müsste dir theoretisch ne fehlermeldung irgendwo ausgeben, da steht meist auch drin in welcher zeile der fehler liegt

chr-mt
03.06.2009, 00:12
Hi,
noch ein etwas "unsauberer" Weg ohne zusätzliche Variablen:


Taste Alias Pina.0
Led Alias Porta.1

If Taste = 0 Then
Toggle Led
End If
While Taste =0
Wend
Waitms 20

So lange der Taster gedrückt gehalten wird, hängt der Mikrocontroller in der while wend schleife fest.
Sobald losgelassen wird, kann direkt wieder umgeschaltet werden.
Ein wenig Verzögerung nach dem Taste loslassen ist noch drin, zum entprellen.

Das Ganze ist aber nicht gerade elegant, da man sich, wie gesagt, den µC während des Tastendrucks blockiert.

Für mal eine LED zu schalten dürfte es aber gehen ;)

for_ro
03.06.2009, 00:28
Mit einer zusätzlichen Variable geht's auch ohne blockieren:

Do
If Taster = 0 And Schalt_freigabe = 0 Then
Toggle Led
Schalt_freigabe = 1
Elseif Taster = 1 And Schalt_freigabe = 1 Then
Schalt_freigabe = 0
End If
Waitms 20
loop

Gruß

Rolf

Gary
03.06.2009, 03:43
hey danke^^

funzt jez

Bobesmusik
22.12.2011, 00:32
Hallo zusammen .
Ich hatte jetzt genau diesen Teil gesucht aber beim testen bekomme ich einen Fehler angezeigt .Zuerst mein Code :

$regfile = "m8def.dat"
$framesize = 8
$swstack = 8
$hwstack = 8
$crystal = 8000000

$baud = 9600

Config Portb.0 = Output
Led Alias Portb.0
Config Pinb.1 = Input
Taster Alias Pinb.1
Portb.1 = 1

Do
If Taster = 0 And Schalt_freigabe = 0 Then
Toggle Led
Schalt_freigabe = 1
Elseif Taster = 1 And Schalt_freigabe = 1 Then
Schalt_freigabe = 0
End If
Waitms 20

Loop

Invalid datatyp
If Then expected
If Then expected (16)
End If expected

Ich binn ein kompletter Neueinsteiger

aber ich denke das mir hir geholfen werden kann mit Eurer Hilfe .

Gruss Manuel

Rone
22.12.2011, 07:33
Hallo!

Mach mal " Dim Schalt_freigabe As Byte " rein.

MfG
Rone

Sauerbruch
22.12.2011, 07:42
Hallo Manuel,

der Fehler ist, dass Du in der Hauptschleife mit der Variablen schalt_freigabe arbeitest, die Du vorher nirgendwo definiert hast. Das versteht Bascom nicht!

Da sie offensichtlich nur die Werte 0 und 1 annehmen kann, würde hier ein Bit reichen. Wenn Du diese Zeile vor die Haupschleife stellst

Dim schalt_freigabe as bit

müsste zumindest das Kompilieren klappen :-)

Viel Erfolg,

Daniel

Edit: Oops - klassischer "Doppelpost" :-)