PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schrittmotor mit PCF8574



Conger
04.01.2007, 00:31
Hi,
ich habe da ein paar Ungereimtheiten, die ich nicht lösen kann.
Warum hält das Proramm an der Stelle 53 nicht an?
Der Import ist der gleiche get_Value.bas aus der LIB ohne die LCD Befehle und allen Zeilen in denen Digit vorkommt.
kann mir jemad helfen?
1.
1 import "G:\CControl\PCF8574\get_Zahl.bas"
2 import "C:\programme\basicpp\lib\Get_Key.bas"
3 define LIGHT port[16]
4 define SDA port[9]
5 define SCL port[10]
6 define DRIVE byteport[10]
7 define PCFDATA as byte
8 define ADDR as byte
9 define COUNTER as byte
10 define KEYCode as byte
11 define Schritte as Word
12 define UdM as byte
13 goto INIT
14
15 FUNCTION UPSTEP_H(steps as word,speed as byte)
16 define COUNT as word
17 define DELAY as byte
18 define SEQUENCER as byte
19 define Wert as byte
20
21 FOR COUNT=0 TO STEPS
22 SEQUENCER=(SEQUENCER+1)and 7h
23 for DELAY=0 to speed ' Zeitschleife
24 next DELAY
25 looktab SEQUENCE_H,sequencer,DRIVE
26 next COUNT
27 END FUNCTION
28
29 #INIT
30 LIGHT=off
31 LCD.INIT
32 LCD.OFF
33 SDA=on
34 SCL=on
35 Pause 2
36 LCD.INIT
37 LCD.Pos 1,1
38 LCD.PRINT " Schrittmotor"
39 LCD.pos 2,1
40 LCD.print " mit PCF8574"
41 pause 10
42 LCD.CLR
43 LCD.OFF
44 #MAIN
45 LCD.Init
46 LCD.pos 1,1
47 LCD.Print " Anzahl Steps?"
48 Schritte=GET_Value()
49 LCD.POS 1,1
50 LCD.PRINT "Steps = " & Schritte & " "
51 LCD.POS 2,1
52 LCD.Print " Geschwindigkeit?"
53 UdM=Get_Value() <-
54 LCD.Pos 2,1
55 LCD.print "Speed = " & UdM & " "
56 UPSTEP_H(Schritte, UdM)
57 Drive=00h 'Motor stromlos
58 pause 50
59 goto main
60 '-------------------------------------------
61 Table Sequence_H
62 09h 01h 05h 04h 06h 02h 0Ah 08h
63 End Table
64 End

Tido
04.01.2007, 09:00
Hallo,

hält es denn in Zeile 48 an?
Welchen Wert hat UdM denn nach Zeile 53 (was zeigt das LCD in Zeile 55 an)?

MfG
Tido

Conger
04.01.2007, 18:07
Danke für deine Antwort.
in Zeile 48 hält es an und wartet auf Tastatureingaben, die mit E beendet werden. Dann rauscht er durch und ich sehe neue Angabe auf dem LCD
(Anzahl Steps? - Zeile 47)
Zeile 55 Udm ist 00.
Der Motor bewegt sich nicht, er zuckt nur.
mfg

Tido
04.01.2007, 20:47
Hallo

ich vermute, dass durch deine Änderungen in der Get_Value.bas das Problem hervorgerufen wird.
Hast du es mal nur ohne die lcd.-Zeilen aber mit digit getestet?

Tido

Tido
04.01.2007, 20:50
Halt, hab' noch was bemerkt:

Die Funktion Get_value liefert ein 'word' zurück, du hast aber die Variable UdM nur als byte deklariert. Bei 'Schritte' ist's richtig!

MfG
Tido

Conger
04.01.2007, 22:49
Hallo.
ok, ich habe auch UdM als word definiert und das dann auch in der Function berücksichtigt.
Die LCD Anzeige zeigt mir, das UdM nach der Get_value Routine den Wert 0
hat.
Die Anweisungen um Digit und LCD.. habe ich herausgenommen, weil ich dachte,sie sind schuld.
Beim ersten Get_value stoppt er und wartet auf eine Eingabe, das zweite Get_Value überfährt er.
gruß conger

Tido
04.01.2007, 22:54
Hi,

schreib' mal testweise zwischen Zeile 50 und 51 "pause 50".
Geht's dann?

Tido

Conger
04.01.2007, 23:13
Jo, dann tut er's. Danke aber woran liegt es????

Aber jetzt kommt es:, wenn ich die Routine aus der LIB nehme "Stepper_Drive.bas"
und dann das Programm wie folgt um ändere, geht nichts.
Nicht einmal der Befehl Light=off wird ausgeführt

import "G:\CControl\PCF8574\Stepper_Drive.bas"
import "G:\CControl\PCF8574\get_Zahl.bas"
import "C:\programme\basicpp\lib\Get_Key.bas"

'------ I/O PORTS ---------
define LIGHT port[16]
define SDA port[9]
define SCL port[10]

'---- SYSTEM MEMORY -------

define Schritte as Word
define UdM as Word

#INIT
LIGHT=off
LCD.INIT
LCD.OFF
SDA=on
SCL=on
Pause 2

'----------- EINSCHALT MELDUNG------------------------
LCD.INIT
LCD.Pos 1,1
LCD.PRINT " Schrittmotor"
LCD.pos 2,1
LCD.print " mit PCF8574"
pause 10
LCD.CLR
LCD.OFF

#MAIN
LCD.Init
LCD.pos 1,1
LCD.Print " Anzahl Steps?"
Schritte=GET_Value()
LCD.POS 1,1
LCD.PRINT "Steps = " & Schritte & " "
LCD.POS 2,1
LCD.Print " Geschwindigkeit?"
Pause 10 'neu eingebaut
UdM=Get_Value()
LCD.Pos 2,1
LCD.print "Speed = " & UdM & " "
LCD.OFF
beep 10,50,0
UPSTEP_H(Schritte, UdM)
Pause 10
UPSTEP_H(Schritte, UdM)
Goto main

Da muß es einen gewaltigen Konflickt mit den Ports geben, den ich aber nicht sehe

gruß conger

Tido
05.01.2007, 08:48
Jo, dann tut er's. Danke aber woran liegt es????




Hallo,

Grund 1: Du bist zu langsam oder
Grund 2: die C-Control ist zu schnell oder
Grund 3: die Enter-Taste prellt.

Grund 1 und 2: Wenn du die Schritte eingibst und mit Enter bestätigst, "rast" dein Programm weiter und erwartet als nächstes die Eingabe der Geschwindigkeit. In diesem Moment hast du evtl. den Finger noch auf der Enter-Taste (ist also noch gedrückt)!

Grund 3: Du hast zwar die Enter-Taste "ganz schnell" gedrückt, aber die Taste prellt und das wird beim Abfragen der Geschwindigkeit als "User hat Enter-Taste gedrückt" interpretiert.

Durch das Einfügen der Pause (50 * 20ms = 1 Sekunde) hast du Zeit, den Finger von der Taste zu nehmen bzw. das Prellen der Taste wird abgewartet. Du kannst die Pause durch Ausprobieren noch verringern. Eine halbe Sekunde sollte vollkommen reichen (Pause 25).

Muß jetzt erst mal Geld verdienen...(arbeiten)

Tido

Conger
05.01.2007, 11:26
Danke Tido!
gruß conger