PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eingänge an RNBFRA-Board überwachen - Neuling



robo_wolf
06.03.2006, 13:03
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.


'################################################# ##
'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

x-ryder
06.03.2006, 15:30
warum machstn überhaupt das mit j?

das brauchste doch gar nicht so wie ich das ssehe, dann macht der ne drehung, bis du den taster loslässt

ansonsten könnteste noch des mit dem i²c-interrupt machen, aber da könnte es sein, das dir schritte verlorengehen...

wie genau ist das mit den beiden werten, schwankt das?

Martin

robo_wolf
06.03.2006, 17:44
Hi x-raider,
Das mit dem "J = 2000" ist nur damit der Motor nicht ewig werkelt. Taste 1 ("A") gedrückt - Er springt in die Motorschleife und nach 10 Umdrehungen ist Schluß und er springt in die Schleife zurück. Das sollte im Normalfall auch gar nicht drin sein.
Die beiden Werte ergeben sich durch die Eingänge bei 3 eben 247(1111 0111) und bei 4 ist es 251(1111 1011).
Wie meinst Du das mit dem i2c-interupt?
Gruß robo_wolf

x-ryder
06.03.2006, 19:19
achsoo, ich verstehe, alos normalerweise haben doch die i²c bausteine alle ne INT-leitung hat der das auch?

das mit j = 2000 das brauchste doch gar nicht, mach einfach die ganze schleife dad rin weg, und lass den sich nur einmal bewegen, dann springt er bei jedem tastendruck einmal in die subroutine, und drehtn stück, wenn du jetzt dauerhaft drückst, dann dreht er sich eben auch dauerhaft, oder seh ich das falsch?

Martin

robo_wolf
06.03.2006, 20:22
Hi x-ryder,
also: Die Aufgabe sieht eigendlich ganz einfach aus.
Die Taste1 soll den Motor laufen lassen die Taste2 soll den Motor dann wieder stoppen. (elektrisch gesagt: Taste1 läßt einen Schütz anziehen und mit ihm die Selbsthaltung. ->Motor läuft. Taste2 unterbricht die Selbsthaltung und der Schütz fällt ab.) ->Motor steht

x-ryder
06.03.2006, 20:28
also dann musstes mit nem flag machen:
hauptprogramm:
wenn flag = 1 dann dreh den motor
wenn nicht, dann überprüfe die tasten
geh zu hauptprogramm

motor:
dreh den motor einen schritt
return

taste:
überprüfe welche taste gedrückt wurde
wenn taste_an dann flag = 1
wenn taste_aus dann flag = 0
return

sollte so laufen, bei bedarf schreib ich dir dein programm mal um

Martin

robo_wolf
06.03.2006, 21:38
nicht ganz oder denke ich falsch?

hauptprogramm:
wenn flag = 1 dann dreh den motor
wenn nicht, dann überprüfe die tasten
geh zu hauptprogramm

in dem Fall würde de Motor drehen und die Tasten würden nciht abgefragt, da flag ja = 1 ist. Also kann ich den Motor einschalten aber nicht aus.

x-ryder
06.03.2006, 21:43
ach ja, klar ^^ einfach immer tasten abfragen lassen, egal was kommt ^^

sorry, iss schon spät für nen ewigen kaffeesäufer wie mich ^^

Martin

robo_wolf
06.03.2006, 22:27
ja, jetzt hast du es :-)

Wobei das mit dem Interupt sicher eleganter ist.
Vielleicht hast du ja doch mal ein paar Minuten Luft und überarbeitest mal den Code, damit ich mir vorstellen kann, wie es mit den Interupts so funktioniert.

Trotzdem erst einmal vielen Dank für deine Bemühungen mit mir Grünschnabel.
Gruß Silvio

x-ryder
06.03.2006, 22:38
nene du, ich süppel eh schon zu viel kaffee, ich geh jetz pennen, aber morgen kannich dir das schreiben ^^

Martin

robo_wolf
06.03.2006, 22:42
wäre super.
Danke Dir schon mal.

Silvio

x-ryder
08.03.2006, 17:52
so sorry, hab das ganz vergessen, ahb viel zu tun ^^ schule, ähnliches

aber hier der 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"
$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 Int1 = Rising
Enable Interrupts
On Int1 Int1_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 I As Byte
Dim J As Word
Dim A As Word
Dim B 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

B = 251 'Taste 2 (Port4)
A = 247 'Taste 1 (Port3)
I = 0

Do
If I2cdaten = A Then Gosub Motor1_2
If I2cdaten = B 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
Portc.3 = 0
Waitms 1
Portc.2 = 1
Portc.3 = 1
Waitms 1
Portd.6 = 0
Return

Read_data:
Return


Motoren_aus:
Portd.6 = 0
Return

Int1_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

bitte, sollte so funzen, jedes mal wenn der int vom pcf kommt, lies die taste ein

Martin

robo_wolf
08.03.2006, 18:26
Hallo Martin,
erst mal vielen Dank für die Mühe.
Werde es heute Abend testen und mich noch mal melden.
Gruß Silvio

robo_wolf
09.03.2006, 12:36
hallo Martin,
leider funktioniert das Programm so nicht.
Konnte es zwar übertragen, aber es reagiert auf keine Taste.

Config Int1 = Rising
Enable Interrupts
On Int1 Int1_isr

Kann es vielleicht sein, dass der AVR mit "= Rising" auf einen Highpegel warte. Habe die Tasten gegen GND schalten lassen. ???

Was ist eigentlich mit "On Int1 Int1_isr" gemeint?
Du weißt doch ->Neuling

Gruß Silvio

x-ryder
09.03.2006, 13:47
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...

und mit on int1 int1_isr ist gemeint: wenn int1 anspringt, und sacht: du ich hab da was bekommen, dann springe in die subroutine int1_isr (dabei setzt sich isr aus Interrupt Service Routine zusammen)

Martin

robo_wolf
09.03.2006, 22:27
Hallo Martin,
leider kann ich damit nicht all so viel anfangen.

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

x-ryder
09.03.2006, 22:32
also, der avr hat dochn port namens int1 richtig, das iss ne sekundäre funktion von sonem pin... der muss an den INT ausgang vom pcf.
dann sollteste den eben nich als rising sondern als falling configurieren

Martin ^^

robo_wolf
09.03.2006, 22:36
langt es also wenn ich deinen Code
von Config Int1 = Rising
auf Config Int1 = Falling
umschreibe?

Gruß Silvio

x-ryder
09.03.2006, 22:39
japp, aber du musst den int auch noch anschließen

robo_wolf
12.03.2006, 18:45
so nun habe ich das Prgramm auf den Interrupt Int2 umgeschrieben.

'************************************************* *****************************
'ü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

x-ryder
12.03.2006, 21:25
hassu mal nen messgerät, und könntest mal die int-leitung durchmessen, ob da überhaupt nen signal kommt?

Martin

robo_wolf
13.03.2006, 07:57
Hallo Martin,
die Kommunikation des PCF2 mit dem Mega32 funktioniert doch über den I2C-Bus.
Kann es vielleicht sein, dass es nicht funktioniert, weil der "stop" des I2C die Kommunikation abschaltet und somit auch der Interrupt nicht abgefragt wird?

Silvio

x-ryder
13.03.2006, 13:49
ich schau mir jetzt mal das datenblatt von deinem PDF an, und gucke mal, wann da überhaupt nen INT rauskommt, und wann nicht, dann sach ich bescheid

wie heißtn der PCF genau?

Martin

robo_wolf
13.03.2006, 13:58
PCF heißt PCF 8574AP.

Silvio

x-ryder
13.03.2006, 14:12
so, der int kommt immer wenn der pcf im read-mode ist, aber sowohl auch immer, wenn nen portchange stattgefunden hat, ausserdem isser wirklich low-active, also iss das mit dem falling schon ganz richtig...

jetzt weiß ich aber nicht so ganz, ob der int denn auslöst, kann ja sein, dass wir hier nen spezialfall haben, also wärs echt mal gut, du würdest mit nem messgerät nachmessen, ob da ne spannung von 5V auf 0V fällt, wenn du ne tastedrückst, mach das mal...

jetzt binnich auf der nächsten seite, und schreibe die antwort, weiß also nicht, ob du den pull-up angemacht hast, ich glaube, so wie ich das jetzt verstanden habe, darf der nich an...

Martin

robo_wolf
13.03.2006, 18:03
Habe nun noch mal ein Terminalfenster aufgemacht, um den Status anzuzeigen.

Konfiguration Interrupt und Eingang:

Config Int2 = Falling
Enable Int2
Enable Interrups
On Int2 Int2_isr

Config Pin.b2 = Input
Config Portb.2 = 0 'Pull-up aus
Spannung am Int2 = 1 Volt - also undefiniert offen.

->> wird permanent die Int2_isr ausgeführt und der Wert im Terminal aktualisiert.
Tasten werden mit den entsprechenden Werten 247 und 251 wiedergegeben.
Gelentlich reagiert dann die Tasteneingabe mit Starten der Motoren. Dann bleiben die Motoren solange an, bis die selbe Taste wieder gedrückt wird. Die Int2_isr wird, solange der Motor läuft, nicht durchlaufen. Somit kann auch nicht auf die andere Taste reagiert werden.

Konfiguration Interrupt und Eingang:

Config Int2 = Falling
Enable Int2
Enable Interrups
On Int2 Int2_isr

Config Pin.b2 = Input
Config Portb.2 = 1 'Pull-up ein
Spannung am Int2 = 0 Volt - Definiert LOW
->> keine Terminalausgabe, die Int2_isr wird nicht durchlaufen.
kann ja auch nicht da Tasten gegen GND schalten. Keine Interruptauslösung.
Gebe ich 5 Volt auf einen Eingang am PCF passiert auch nichts. Bei direkter Beschaltung des Int2 mit High (5Volt) - läuft die Int2_isr ab und gibt 255(1111 1111) im Terminal ab.

Habe an den Int1 auch getestet:
Bei Int1 ist das genau so. Wenn ich nun mit eingeschalteten Pull-up Widerstand den Int(x) direkt mit High(5Volt) schalte, läuft die Int(x)_isr ab.

Frage mich jetzt, warum der PCF die 5Volt am Eingang nicht ausgibt.
5Volt am Eingang Port3 - Ausgabe "3"(0000 0100) und Port 4 - Ausgabe "4"(0000 1000)

Silvio

x-ryder
13.03.2006, 18:07
LOL

das iss ja funnig, ich glaub so langsam müsste ich mir die schaltung hier auch mal aufbaun, ich weiß jetzt auf jeden fall nicht mehr, warum da jetzt wo der fehler liegt...

tut mir echt leid, ich meine das müsste so gehen, der int iss ja auch enabled, aber warum der undef iss, weißich nich, wundert mich eigentlich, nen pull-down braucht der nich, der iss ja eh active-low....

hast du noch nen ansatz?

aso, es gibt noch sowas, dass du oben sachst "on var = ... var_isr" dann sollte der springen, wenn die var sich ändert... also versuch das mal, und dann lass in der do-loop einfach nur noch die taster auslesen

Martin

robo_wolf
13.03.2006, 18:16
was meinst du mit "var"?
Silvio

x-ryder
13.03.2006, 18:18
deine variable, die du für die tastenspeicherung nimmst, also i2cdaten

Martin

robo_wolf
13.03.2006, 18:51
I2cdaten kann doch keine _isr (interrupt service routine) ausführen.
Das kann doch nur der Interrupt. Oder ?

Silvio

x-ryder
13.03.2006, 18:58
ne, das kann man auch auf variablenänderung machen, heißt irgendwie "ON var GOSUB soundso" musst mal inner bascom help nachschauen

robo_wolf
14.03.2006, 07:55
habe die Bascom-Hilfe mal durchsucht.
Du meinst wohl so...

On I2cdaten Gosub Motor1_2 , Motoren_aus

Silvio

x-ryder
14.03.2006, 14:14
oha, scheint doch schwerer zu sein, als ich gedacht hab... das geht doch gar nicht mit on... das on muss auch immer da sein, wo man auch abfragen muss, also bringts da nen if vermutlich weiter ^^

ich muss noch weiter überlegen... *seufz*

Martin

robo_wolf
14.03.2006, 16:49
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 ###

x-ryder
14.03.2006, 17:16
lol, ja du hastes ja schon, warum machstes dann nich, fauler hund ^^

wart ma, ich schreibs um, aber hatte ich irgendwie nich bedacht, dass dabei ja das rauskommen soll ^^

schick nochmal deine jetzige sauce (den sourcecode)

Martin

robo_wolf
14.03.2006, 17:41
Hallo Martin,
hier der letzte Stand:


'************************************************* *****************************

$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 Portb.2 = 0
Config Portd.3 = 1

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 = 0


Taste1 = 247 'Taste 1 (Eingangsport-Port3)
Taste2 = 251 'Taste 2 (Eingangsport-Port4)
I = 0

'******************** 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 ; " war beim Int2"
Incr I
Return

Wie ich deine Reaktion deute, ist es mit dem Speichern in Registern doch möglich und könnte funktionieren.
Denkansatz demach richtig, aber mit der Umsetzung haberts halt... :-k
Wenn es dir nicht so viel Arbeit macht...?vielleicht kannst du deine Schritte mit ein paar Worten dokumentieren -> will ja was von Dir lernen 8-[

### Silvio ###

x-ryder
14.03.2006, 19:05
'************************************************* *****************************

$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 Portb.2 = 0
Config Portd.3 = 1

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
Dim Flag As Bit

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 = 0
Flag = 0

Taste1 = 247 'Taste 1 (Eingangsport-Port3)
Taste2 = 251 'Taste 2 (Eingangsport-Port4)
I = 0

'******************** Hauptprogramm ********************************************

Do
If Flag = 1 Then Gosub Motor1_2
If Flag = 0 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 ; " war beim Int2"
Incr I
If I2cdaten = Taste1 Then Flag = 1
If I2cdaten = Taste2 Then Flag = 0
Return

so, das berühmte flag iss jetz doch drinne, also das läuft jetzt so ab: wenn die erste taste gedrückt wurde, springter in int2_isr, und überprüft dort, welche taste gedrückt wurde, wenns taste 1 war, dann sollers flag auf 1 setzen, ansonsten auf 0.
dann springter ja wie gewöhnlich wieder ins hauptprogramm, und sieht: aha, flag ist = 1, also lassen wa mal die motoren einmal drehen... das widerholt er bei dieser verion aber ja so lange bis das flag wieder auf 0 iss, und das geschieht erst, wenn die andere taste, also taste 2 gedrückt wurde.

so solltes wundabar funzen... wie immer :-P

Martin

robo_wolf
14.03.2006, 19:30
Hallo Martin,
so tut er es. SUPER IDEE mit dem Flag.
\:D/ DANKE für die Hilfe. \:D/

### Silvio ###

Ps. werde sicher auf noch viele neue Probleme stoßen und Fragen haben :-b

x-ryder
14.03.2006, 19:46
unter umständen kannste mich dann ja mal bei dir in icq hinzufügen, das iss nen ganzes stückln leichter, und ausserdem vergesse ich nicht, irgendwas zu ändern ^^

wie man sieht helfe ich ja immer gern weiter... manchmal leider...

Martin