Eingänge an RNBFRA-Board überwachen - Neuling
Hallo,
habe mein RNBFRA-Board fertig und möchte nach erfolgreichen Tests der mit gelieferten Programme selbst eine weing mit Bascom und dem Board rumexperimentieren.
Habe mir die Aufgabe gestellt einen Stepper mit 2 Tasten zu schalten. Nur "AN" und "AUS".
Dazu habe ich das Testprogramm 6 der CD hergenommen um die Eingänge zu überwachen und am Terminalprogramm auszugeben.
Die Taster habe ich hierzu mit Port 3 und 4 verbunden und will sie gegen GND schalten. Das funktioniert laut Terminal auch sehr gut.
Nun möchte ich die beiden Signal abfangen und damit den Motor steuern.
Die Rückgabewerte bei gedrückte Tasten sind 247 und 251.
Code:
'###################################################
'Testprogramm 6
'für
'RoboterNetz Standard-Roboter Board RBNFRA 1.2
'
'Aufgabe:
'Testet Eingangsport indem Wert über RS232
'übermittelt wird (9600 Baud einstellen)
'
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de
'###################################################
$regfile = "m32def.dat" ' oder bei Mega16 $regfile = "m16def.dat"
Const Writeeingabeport_adr = &H7E 'I2C Adr PCF 2
Const Readeingabeport_adr = &H7F 'I2C Adr PCF 2
Dim I2cdaten As Byte 'Datenbyte aus PCF8574
Dim I As Byte
Dim J As Word
Dim A As Word
Dim B As Word
Declare Sub Motor1_2
Declare Sub Motoren_aus
Declare Sub Wach
$baud = 9600
$crystal = 8000000 'Quarzfrequenz
Config Scl = Portc.0 'Ports fuer I2C-Bus
Config Sda = Portc.1
Config Pind.6 = Output 'Schrittmotoren Ein/Aus
Config Pinc.5 = Output 'Schrittmotor Links Richtung
Config Pinc.3 = Output 'Schrittmotor Links Step
Config Pinc.4 = Output 'Schrittmotor Rechts Richtung
Config Pinc.2 = Output 'Schrittmotor Rechts Step
I2cinit
I2cstart
I2cwbyte &H74 'Schreibbefehl an PCF3 schicken
' Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie aktiv)
I2cwbyte &B00000010 'Datenbyte an PCF3
I2cstop
Portd.6 = 0 'Schrittmotoren erst mal ausschalten
I2cdaten = 1
Wach
Sub Wach
B = 251 'Taste 2 (Port4)
A = 247 'Taste 1 (Port3)
I = 0
Do
I2cstart
I2cwbyte Readeingabeport_adr 'Lesebefehl an PCF schicken
I2crbyte I2cdaten , Nack 'Datenbyte von PCF lesen
I2cstop
Waitms 50
Print I ; " Eingangsport Wert" ; I2cdaten
Incr I
If I2cdaten = A Then Motor1_2
If I2cdaten = B Then Motoren_aus
Loop
End Sub Wach
'********************* Unterprogramme ****************************************************************
Sub Motor1_2
Portc.5 = 0 'Richtung Motor 1
Portc.4 = 1 'Richtung Motor 2
Portd.6 = 1 'Motoren einschalten
J = 2000
Do
Portc.2 = 0
Portc.3 = 0
Waitms 1
Portc.2 = 1
Portc.3 = 1
Waitms 1
J = J - 1
Loop Until J < 1
Portd.6 = 0
End Sub Motor1_2 'Motoren ausschalten
Sub Motoren_aus
Portd.6 = 0
End Sub Motoren_aus
Wenn ich mich nun in der Schleife "Wach" befinde kann ich mit den Tasten die Schleife verlassen und springe ins Unterprogramm.
Ab diesen Zeitpunkt erfolgt aber keine Überwachung der Eingänge mehr.
Erst nach dem Abarbeiten des Unterprogramms.
Wie könnte ich es aber realisieren, das die Überwachung trotz Unterprogramm weiter läuft...???
Ich glaub ich seh den Wald vor lauter Bäumen nicht. ODER?
also bitte nicht gleich mit Steinen werfen. 8-[
Gruß robo_wolf
? kannst du mir das übersetzen ?
Hallo Martin,
leider kann ich damit nicht all so viel anfangen.
Zitat:
Zitat von x-ryder
also, erstens musst du natürlich den int-ausgang vom pdc an den int1 dranpaggn, dann sollte das falling sein, du hast recht, aber nur weil der int vom pcf low-active ist...
den int-ausgang vom pdc an den int1 dranpaggn
der int vom pcf low-active ist
Kannst du mir das noch mal eindeutschen?
(ich weiss, es nervt schon :-s )
Gruß Silvio
leider funktioniert es nicht
so nun habe ich das Prgramm auf den Interrupt Int2 umgeschrieben.
Code:
'******************************************************************************
'über die Tasten 1[Porteingang 3] und 2[Porteingang 4] am rnbfra-Board sollen die beiden Schrittmotoren durch einen Interrupt gesteuert werden ein aus
'******************************************************************************
$regfile = "m32def.dat"
$baud = 9600
$crystal = 8000000 'Quarzfrequenz
Config Scl = Portc.0 'Ports fuer I2C-Bus
Config Sda = Portc.1
Config Pind.6 = Output 'Schrittmotoren Ein/Aus
Config Pinc.5 = Output 'Schrittmotor Links Richtung
Config Pinc.3 = Output 'Schrittmotor Links Step
Config Pinc.4 = Output 'Schrittmotor Rechts Richtung
Config Pinc.2 = Output 'Schrittmotor Rechts Step
Config Pinb.2 = Input 'Interrupt Int2
Config Int2 = Falling
Enable Int2
Enable Interrupts
On Int2 Int2_isr
Const Writeeingabeport_adr = &H7E 'I2C Adr PCF 2
Const Readeingabeport_adr = &H7F 'I2C Adr PCF 2
Dim I2cdaten As Byte 'Datenbyte aus PCF8574
Dim Taste1 As Word
Dim Taste2 As Word
Dim I As Word
I2cinit
I2cstart
I2cwbyte &H74 'Schreibbefehl an PCF3 schicken
'Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie aktiv)
I2cwbyte &B00000010 'Datenbyte an PCF3
I2cstop
Portd.6 = 0 'Schrittmotoren erst mal ausschalten
I2cdaten = 1
Taste1 = 247 'Taste 1 (Eingangsport-Port3)
Taste2 = 251 'Taste 2 (Eingangsport-Port4)
I = 200
'******************** Hauptprogramm ********************************************
Do
If I2cdaten = Taste1 Then Gosub Motor1_2
If I2cdaten = Taste2 Then Gosub Motoren_aus
Loop
'********************* Unterprogramme ******************************************
Motor1_2:
Portc.5 = 0 'Richtung Motor 1
Portc.4 = 1 'Richtung Motor 2
Portd.6 = 1 'Motoren einschalten
Portc.2 = 0 'Step rechts
Portc.3 = 0 'Step links
Waitms 1
Portc.2 = 1 'Step rechts
Portc.3 = 1 'Step links
Waitms 1
Portd.6 = 0 'Motoren ausschalten
Return
Read_data:
Return
Motoren_aus:
Portd.6 = 0 'Motoren ausschalten
Return
Int2_isr:
I2cstart
I2cwbyte Readeingabeport_adr 'Lesebefehl an PCF schicken
I2crbyte I2cdaten , Nack 'Datenbyte von PCF lesen
I2cstop
Waitms 50
Print I ; " Eingangsport Wert" ; I2cdaten
Incr I
Return
Nur leider funktioniert es noch immer nicht. #-o
Nochmal zur Funktionsweise:
An den Eingangsport 3 und 4 des rnbfra-Board habe ich je einen Taster der auf GND schaltet. Die Tasten geben Werte von 247 und 251 zurück.
Durch drücken einer Taste soll das Hauptprogramm(die Schleife) unterbrochen werden und den Wert in den I2cdaten schreiben. Damit zurück ins Hauptprogramm springen und den Wert entsprechend auswerten und das entsprechend Unterprogramm(Motoren1_2 bzw. Motoren_aus) aufrufen.
Habe ich irgendwo einen Denkfehler drin oder muß ich anders an das Problem ran...?
Gruß Silvio
oder vielleicht doch etwas anders?
Hallo Martin,
habe nun mal einen Hardware-Pull-up an Int2 gezogen.
-> wenn Taste gedrückt ist, unterbricht er die Schleife und springt zur Int2_isr, macht eine Print-Ausgabe im Terminal mit dem entsprechenden Eingangsdaten und springt zurück zum Do Loop Schleife von wo er dann in das entsprechende Unterprogramm springt und dieses Abarbeitet. Aber nur solange wie die Taste gedrückt bleibt. Nach dem Auslassen der Taste befindet er sich dann wieder in der Do Loop.
soweit so gut. Aber keine Selbsthaltuung :-(
###############################################
Man müßte die Eingangsdaten sichern und mit der Do Loop Vergleichen und beim Drücken der Austaste den gesicherten Wert resetten.
Geht doch mit Registern oder so?
Also Taste "Ein" gedrückt ->Register mit Wert der Taste belegen.(Behält das Register den Wert?)
Mit der Taste "Aus" den Register erneut mit dem Wert der Taste "Aus" belegen. Den Wert in der Do Loop entsprechend vergleichen.
Was meinst du geht so was ???
Wenn ja, kannst du mich dahin gehend noch ein wenig helfen? 8-[
### Silvio ###