PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Port über Taster ein und ausschalten



Projekt 2252
17.05.2012, 14:43
Hallo ich möchte gerne einen Port über einen Taster ein und aus schalten wie mache ich das? Ich bin schon am verzweifeln :D Der Taster gibt ja immer nur ein kurzes High. Ich möchte es aber so haben wenn z.b Porta.1 ein High von Porta.0 bekommt das dieser an bleibt bis Porta.1 ein weiteres High sendet. Gruß Tjark

Kampi
17.05.2012, 15:08
Hallo,

wenn du einen Taster benutzt, musst du darauf achten das du ihn entprellst (Softwaremässig oder Hardwaremässig).
Der Rest ist dann einfach. Du sagst einfach, dass wenn der Pin wo der Taster dran ist High ist, das ein Ausgangspin getoggled wird.
Dafür hat Bascom auch schon eine fertige Funktion.

Neutro
17.05.2012, 16:04
PinX.Y = input
PortX.Y =1

PortY.X = output

Do

If Pin X.Y = 0 then
waitms 100
toggle PortY.X
end if

Loop

So einfach kann das sein.... :-)

VG
Neutro

Kampi
17.05.2012, 16:26
Da ist jetzt aber keine Entprellung des Tasters drin. Das heißt es kann vorkommen, dass wenn du den Taster betätigst der Pin paar mal getoggled wird ;)

Sauerbruch
17.05.2012, 17:32
wenn z.b Porta.1 ein High von Porta.0 bekommt

Was meinst Du denn damit, dass PORTA.1 ein high von PORTA.0 bekommt? Hast Du die beiden Anschlüsse miteinander verbunden - und wenn ja, was für ein Gedanke steckt dahinter?

Ganz einfach wäre es, wenn Dein Taster an einem Interrupt-fähigen Anschluss hängt. Lässt sich das hardwareseitig realisieren?

Projekt 2252
17.05.2012, 17:43
Es geht eig. nicht um einen Taster. Hab die Frage nur so gestellt weils fast das gleiche ist. Ich empfange mit meinem Atmega die Position meines Joysticks über Rs232 4 Achsen + die Knöpfe. Ich wollte das halt so haben das wenn ich einen Joystickknopf betätige ein belibieger Port auf High geht. Bis jetzt hatte ich es so:

If Button1_wert_integer= 1128 then
PORTA.0= 1
Else
PORTA.0= 0
End if
Das Problem ist das die LED die jetzt am Porta.0 hängt Blinkt wenn ich den Knopf gedrückt halte keine Ahnung warum. Ich brauche es aber so das wenn ich einmal drauf drücke der Porta.0 auf ein schaltet und wenn ich wieder drauf drücke der Porta.0 auf aus schaltet. Wichtig ist das es keine Wait Funktionen gibt da der Atmega mein Flyduino mit Joystickdaten füttert und somit den Quadrocopter steuert. Da wären Wait Funktionen denke ich mal unangebracht :D
Gruß Tjark

Kampi
17.05.2012, 17:54
Schreib es einfach so wie Neutro gepostet hat dann funktioniert es. Nur wenn du nen Taster benutzt, solltest du den noch entprellen. Wenn du kein Wait in der Software haben willst, musst du das entprellen hardwareseitig machen.

Projekt 2252
17.05.2012, 18:15
Ok :) Aber das mit dem Flackern der LED. Woran kann das liegen wenn ich es so mache wie oben beschreiben ? Denn müsste mein Programm am Pc wenn ich den Taster drücke ja immer 1128 und denn wieder 0 ausgeben sonst würde die LED doch nur leuchten biss ich wieder los lasse oder ?
Gruß Tjark

Projekt 2252
17.05.2012, 18:19
Nochmal zum entprellen ich habe mich jetzt informiert das Funktioniert Software seitig ja mit DEBOUNCE aber wie mache ich das Hardware seitig ?
Gruß Tjark

Kampi
17.05.2012, 18:24
Schau mal hier:

http://www.mikrocontroller.net/articles/Entprellung

Und was meinst du mit dem flackern?

Projekt 2252
17.05.2012, 18:37
If Button1_wert_integer = 1128 then
PORTA.0 = 1 'Hier hängt die LED drann
else
PORTA.0 = 0
End If
Wenn ich jetzt den Knopf auf meinem Joystick gedrückt halte müsste die LED ja solange leuchten biss ich wieder los lasse. Tut sie aber nicht sie blinkt extrem schnell bis ich wider los lasse. Liegt das am Bascom Programm oder daran das mein Joystick Programm fürn Pc 1128 und 0 hintereinander ausgibt wenn ich einen Knopf gedrückt halte ?
Gruß Tjark

Projekt 2252
17.05.2012, 18:42
Hier mein VB code (ich weiß gehört hier nicht rein aber ich wollte keinen Anderen Tread eröffnen.

'' Erstellt mit SharpDevelop.
' Benutzer: Tjark Möller •.•
' Datum: 03.03.2012
' Zeit: 20:32
'
' Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
'
Imports System
Imports System.Windows.Forms
Imports Microsoft.DirectX.DirectInput
Imports Microsoft.DirectX




Public Partial Class MainForm
Public Sub New()
' The Me.InitializeComponent call is required for Windows Forms designer support.
Me.InitializeComponent()
serialport1.open
'
' TODO : Add constructor code after InitializeComponents
'
End Sub
Private applicationDevice As Device = Nothing
Public Shared state As New JoystickState()




Public Function InitDirectInput() As Boolean



dim instance As DeviceInstance
For Each instance In Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly)
applicationDevice = New Device(instance.InstanceGuid)
Exit For
Next instance


applicationDevice.SetDataFormat(DeviceDataFormat.J oystick)
applicationDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.Exclusive Or CooperativeLevelFlags.Foreground)
Dim d As DeviceObjectInstance
For Each d In applicationDevice.Objects
If 0 <> (d.ObjectId And CInt(DeviceObjectTypeFlags.Axis)) Then
' Set the range for the axis.
applicationDevice.Properties.SetRange(ParameterHow .ById, d.ObjectId, New InputRange(+1, +255))
End If
Next d
Return True
End Function 'InitDirectInput
Public Sub GetData()
If Nothing Is applicationDevice Then
Return
End If
Try
applicationDevice.Poll()
Catch inputex As InputException
If TypeOf inputex Is NotAcquiredException Or TypeOf inputex Is InputLostException Then
Try
applicationDevice.Acquire()
Catch
Return
End Try
End If
End Try
Try
state = applicationDevice.CurrentJoystickState
Catch
Return
End Try



End Sub



Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
InitDirectInput
End Sub

Sub Timer1Tick(ByVal sender As Object, ByVal e As EventArgs)
GetData()
'Axis----------------------------------------------------
label1.Text="X = "+state.X.ToString()
label2.Text="Y = "+state.Y.ToString()
label3.Text="Z = "+state.Z.ToString()
label4.Text="Rz = "+state.Rz.ToString()
'Buttons--------------------------------------------------
Label5.Text ="Button1 = "+state.GetButtons(0).Tostring
Label6.Text ="Button2 = "+state.GetButtons(1).Tostring
Label7.Text ="Button3 = "+state.GetButtons(2).Tostring
Label8.Text ="Button4 = "+state.GetButtons(3).Tostring
Label9.Text ="Button5 = "+state.GetButtons(4).Tostring
Label10.Text ="Button6 = "+state.GetButtons(5).Tostring
Label11.Text ="Button7 = "+state.GetButtons(6).Tostring
Label12.Text ="Button8 = "+state.GetButtons(7).Tostring
Label13.Text ="Button9 = "+state.GetButtons(8).Tostring
Label14.Text ="Button10 = "+state.GetButtons(9).Tostring
Label15.Text ="Button11 = "+state.GetButtons(10).Tostring
Label16.Text ="Button12 = "+state.GetButtons(11).Tostring
'Serialport Write-----------------------------------------
If serialport1.IsOpen Then
'Axis-----------------------------------------------------
serialport1.Write ("X" + (state.X).tostring + Chr(13))
serialport1.Write ("Y" + (state.Y).tostring + Chr(13))
serialport1.Write ("Z" + (state.Z).tostring + Chr(13))
serialport1.Write ("Rz" + (state.Rz).tostring + Chr(13))
'Buttons--------------------------------------------------
SerialPort1.Write ("B1" + (state.GetButtons(0)).ToString & Chr(13))
SerialPort1.Write ("B2" + (state.GetButtons(1)).ToString + Chr(13))
SerialPort1.Write ("B3" + (state.GetButtons(2)).ToString + Chr(13))
SerialPort1.Write ("B4" + (state.GetButtons(3)).ToString + Chr(13))
SerialPort1.Write ("B5" + (state.GetButtons(4)).ToString + Chr(13))
SerialPort1.Write ("B6" + (state.GetButtons(5)).ToString + Chr(13))
SerialPort1.Write ("B7" + (state.GetButtons(6)).ToString + Chr(13))
SerialPort1.Write ("B8" + (state.GetButtons(7)).ToString + Chr(13))
SerialPort1.Write ("B9" + (state.GetButtons(8)).ToString + Chr(13))
SerialPort1.Write ("B10" + (state.GetButtons(9)).ToString + Chr(13))
SerialPort1.Write ("B11" + (state.GetButtons(10)).ToString + Chr(13))
SerialPort1.Write ("B12" + (state.GetButtons(11)).ToString + Chr(13))




end if
End Sub


Sub Label1Click(ByVal sender As Object, ByVal e As EventArgs)

End Sub

Sub MainFormLoad(ByVal sender As Object, ByVal e As EventArgs)

End Sub
End Class



Gruß Tjark

Neutro
17.05.2012, 19:01
Die Entprellung wird mit dem Waitms 100 vorgenommen.... man kann die Zeit auch noch etwas verkürzen oder verlängern, so wie es am besten funktioniert.
Der Debounce Befehl geht aber nätürlich auch.

MFG

Kampi
17.05.2012, 19:20
Die Entprellung wird mit dem Waitms 100 vorgenommen.... man kann die Zeit auch noch etwas verkürzen oder verlängern, so wie es am besten funktioniert.
Der Debounce Befehl geht aber nätürlich auch.

MFG

Muss da nicht noch eine zweite If-Abfrage nach dem Waitms 100 rein? Oder habe ich da was falsch in Erinnerung?

Zameer
17.05.2012, 19:57
Könnte man das Entprellen nicht auch einfach mit einem z.B. 100nF Kondensator parallel zum Taster machen?

Projekt 2252
17.05.2012, 20:01
Ich denke ich weiß warum die LED Blinkt. In meinem Programm in VB habe ich einen Timer von 100ms damit habe ich die Abfrage Frequenz des Joysticks definiert. Alle 100ms Wird ein neues Signal gesendet das der Knopf gedrückt wird, dass führt wohl zum Blinken der LED. Kann ich es nicht so machen das der erste Impuls des Knopfes gewertet wird vom Uart und erst nach ca. 5sek ein neuer Impuls etwas bewirkt sonst würde ich ja die ganze zeit hin und her schalten wenn ich den Knopf zu lange drücke. :)
Gruß Tjark

Projekt 2252
17.05.2012, 22:07
So jetzt hab ich es hinbekommen das der Taster beim betätigen die LED einschaltet und diese auch an bleibt ich darf max. 5 sek auf dem Taster bleiben sonst geht sie wieder aus. Wenn ihr eine Bessere Lösung wisst die das selbe Ergebnis bring immer her damit :D Mein Problem ist nämlich jetzt das wenn ich den Code für die Taster abfrage und den Code für die Servos zusammen laufen lasse der Atmega völlig spinnt. Er nimmt keine Befehle mehr an und der Servo mach fürchterliche Geräusche. Außerdem wird der Spannungswandler Extrem heiß! Kann das sein das der Controller mit dem Programm überfordert ist ? Werde aber ein Atmega 328 nehmen nicht den Atmega32. Hab das neue Board noch nicht hier. Gruß Tjark

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

Config Servos = 4 , Servo1 = Porta.2 , Servo2 = Porta.3 , Servo3 = Porta.4 , Servo4 = Porta.5 , Reload = 10
Config Dcf77 = Pind.7 , Timer = 1 , Gosub = Sectic
Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Porta.3 = Output
Config Porta.4 = Output
Config Porta.5 = Output

Enable Interrupts
Time$ = "00:00:00"
Date$ = "09/04/00"

Portswitch Alias Porta.1
Led1 Alias Porta.0

Dim Inputstring As String * 5
Dim Data_available As Byte
'----X-----------------------------------
Dim Joystick_x_wert_string As String * 5
Dim Joystick_x_wert_integer As Integer
Dim X_empfangen As Byte
'----Y-----------------------------------
Dim Joystick_y_wert_string As String * 5
Dim Joystick_y_wert_integer As Integer
Dim Y_empfangen As Byte
'----Z-----------------------------------
Dim Joystick_z_wert_string As String * 5
Dim Joystick_z_wert_integer As Integer
Dim Z_empfangen As Byte
'----Z-Rotation--------------------------
Dim Joystick_rz_wert_string As String * 5
Dim Joystick_rz_wert_integer As Integer
Dim Rz_empfangen As Byte
'Buttons---------------------------------
Dim Button1_wert_string As String * 5
Dim Button1_wert_integer As Integer
Dim B1_empfangen As Byte

Do
Data_available = Ischarwaiting()
If Data_available > 0 Then 'wenn Daten da sind, dann...
Input "" , Inputstring
X_empfangen = Instr(inputstring , "X") 'Gibt die Position des Substrings "X" aus oder null wenn nicht gefunden
Y_empfangen = Instr(inputstring , "Y") 'Gibt die Position des Substrings "Y" aus oder null wenn nicht gefunden
Z_empfangen = Instr(inputstring , "Z") 'Gibt die Position des Substrings "Z" aus oder null wenn nicht gefunden
Rz_empfangen = Instr(inputstring , "Rz") 'Gibt die Position des Substrings "Z-Rotation" aus oder null wenn nicht gefunden
B1_empfangen = Instr(inputstring , "B1") 'Gibt die Position des Substrings "Button 1 " aus oder null wenn nicht gefunden

'----X-----------------------------------
If X_empfangen = 1 Then
Joystick_x_wert_string = Mid(inputstring , 2) 'die erste Stelle des Strings (das "X") abscheiden
Joystick_x_wert_integer = Val(joystick_x_wert_string) 'string in integer konvertieren
End If
'----Y-----------------------------------
If Y_empfangen = 1 Then
Joystick_y_wert_string = Mid(inputstring , 2) 'die erste Stelle des Strings (das "Y") abscheiden
Joystick_y_wert_integer = Val(joystick_y_wert_string) 'string in integer konvertieren
End If
'----Z-----------------------------------
If Z_empfangen = 1 Then
Joystick_z_wert_string = Mid(inputstring , 2) 'die erste Stelle des Strings (das "Z") abscheiden
Joystick_z_wert_integer = Val(joystick_z_wert_string) 'string in integer konvertieren
End If
'----Z-Rotation--------------------------
If Rz_empfangen = 1 Then
Joystick_rz_wert_string = Mid(inputstring , 2) 'die erste Stelle des Strings (das "Rz") abscheiden
Joystick_rz_wert_integer = Val(joystick_rz_wert_string) 'string in integer konvertieren
End If
'----Button 1 ---------------------------
If B1_empfangen = 1 Then
Button1_wert_string = Mid(inputstring , 2) 'die erste Stelle des Strings (das "Rz") abscheiden
Button1_wert_integer = Val(button1_wert_string) 'string in integer konvertieren
End If
End If

Servo(1) = Joystick_x_wert_integer
Servo(2) = Joystick_y_wert_integer
Servo(3) = Joystick_z_wert_integer
Servo(4) = Joystick_rz_wert_integer

If Time$ < "00:00:05" Then 'Hier wird das Signal Ignoriert bzw. Schaltet den Portswitch immer auf null wenn man drückt
Gosub Ausschalten
End If

If Time$ > "00:00:05" Then 'Erst nach 5sek. wird ein neues Signal erfasst '
Gosub Einschalten
End If

If Portswitch = 1 Then
Toggle Led1
End If

Loop
End

Einschalten:
If Button1_wert_integer = 1128 Then
Portswitch = 1
Time$ = "00:00:00" 'Sofern ein Signal vom Joystickknopf gekommen ist werden die Folgenden für 5sek. Ignoriert.
End If
Return

Ausschalten:
If Button1_wert_integer = 1128 Then
Portswitch = 0
End If
Return

Sectic: 'wird sekündlich aufgerufen
Gosub Uhranzeigen
If _sec = 0then
End If
Return

Uhranzeigen:
Print Time$ ; ""
Return

Projekt 2252
17.05.2012, 22:19
Oder liegt es daran das Beide Funktionen also DCF77 und Config Servo Timer1 benutzen ?
Gruß Tjark
Edit: Daran kann es nicht liegen so weit ich grad gelesen habe benutzt Config Servo standardmäßig Timer0 man kann aber auch Timer1 benutzten.