Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > XProfan

XProfan Alles rund um die Programmiersprache XProfan.

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag Hamachi deinstallieren
Aufrufe: 58, Antworten: 5
Gehe zum ersten neuen Beitrag Bundesliga-Tippspiel Saision...
Aufrufe: 7670, Antworten: 187
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26970, Antworten: 4223
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50963, Antworten: 1397
Gehe zum ersten neuen Beitrag Algorithmen Teil IV...
Aufrufe: 3361, Antworten: 128
Gehe zum ersten neuen Beitrag Pc lahmt plötzlich
Aufrufe: 186, Antworten: 6
Gehe zum ersten neuen Beitrag PC fährt nicht mehr hoch.
Aufrufe: 0, Antworten: 0
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 329, Antworten: 19
Gehe zum ersten neuen Beitrag Captur 2.2 (Snow Leo)
Aufrufe: 28, Antworten: 0
Gehe zum ersten neuen Beitrag Captur 2.3 (Lion)
Aufrufe: 34, Antworten: 0
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29.08.2010, 17:12   #1 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard Signal an LPT ausgeben (Win98SE)

Hallo zusammen. Als erstes sollte gesagt werden, dass Programmieren
für mich ziemliches Neuland ist. Bisher bin ich aber mit Profan relativ
gut gefahren. Eigentlich habe ich damit nur als Mittel zum Zweck begonnen,
da mir dies als einfachste Art uns Weise erschien einen Schrittmotortreiber
direkt anzusteuern.

Dafür brauche ich ein spezielles Signal am Parallelausgang.

= heißt aus
_ heißt an

Port1: =_=_=_=_=_=_=_=_= (Takt, ich glaub ca 5ms an, 5ms aus)
Port2: __________________ (bzw immer aus: für die Drehrichtung)


da ich den Computer, auf dem das "Programm" endgültig laufen soll erst
in nächster Zeit bekomme (Win98) und die Hardware auch noch nicht
bestellt habe (Wochenende )habe ich ein wenig mit Profan rumgespielt.

Code:
Proc Test

Declare Ende%
      
      SetTimer 2
      Clear Ende%
      WhileNot Ende%
        Print "888,3"
        Case %wmTimer:Ende% = 1
      EndWhile
      KillTimer
      
      SetTimer 2
      Clear Ende%
      WhileNot Ende%
        Print "888,1"
        Case %wmTimer:Ende% = 1
      EndWhile
      KillTimer
      
      SetTimer 2
      Clear Ende%
      WhileNot Ende%
        Print "888,3"
        Case %wmTimer:Ende% = 1
      EndWhile
      KillTimer
      
      SetTimer 2
      Clear Ende%
      WhileNot Ende%
        Print "888,1"
        Case %wmTimer:Ende% = 1
      EndWhile
      KillTimer
      
endproc

Cls
Test
waitkey
end
Eigentlich wollte ich nur mal gucken ob das so funktioniert. Dabei ist mir
aber aufgefallen, dass das "888,1" bzw. "888,3" (das steht doch für Port
1+2, oder?) in unregelmäßigen zeitlichen Abständen "geprintet" wird.
(Also ein Mal wurde zum Beispiel 20x "888,1" ausgegeben, wärend 888,3
über 30x ausgegeben wurde)

Frage:
Liegt das daran, dass das "printen" unterschiedlich lang dauert und das
signal richtig ausgegeben wird, nämlich je 5ms lang, oder ist das signal
immer unterschiedlich lang.

Andere Frage:
Würde der obrige Code so funktionieren, wenn ich das Print gegen OutPB
ersetzen würde (nicht an 2k, XP, Vista, 7 )?

Es grüßt boqopod
boqopod ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 31.08.2010, 16:08   #2 (Direktlink)
MoRoGeP-Träger 2011
 
Benutzerbild von horsthorn
 
Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
Beitrag

Hab deinen Code mal abgeändert und einen Zähler eingebaut:
Zitat:
Proc Test
Declare Ende%,nr%

nr%=1
SetTimer 2
Clear Ende%
WhileNot Ende%
Print "888,3",nr%
inc nr%
Case %wmTimer:Ende% = 1
EndWhile
KillTimer

PRINT

nr%=1
SetTimer 2
Clear Ende%
WhileNot Ende%
Print "888,1",nr%
inc nr%
Case %wmTimer:Ende% = 1
EndWhile
KillTimer
endproc

window 0,0-%MaxX,%MaxY
Test
waitkey
end
Interessant ist, das bei jedem neuen Start andere Ergebnisse rauskommen.
Anscheinend läuft die Timer-Schleife im Hintergrund weiter ?
__________________
Gruss, horst
Computer werden kleiner und kleiner, bald verschwinden sie völlig.
(Ephraim Kishon 1924-2005)

Win7-Home-Premium 32-Bit - XProfan12.0ß-S14 - Chrome-18.0.1025.142 m
http://www.web-treffpunkt.de
horsthorn ist gerade online   Mit Zitat antworten
Alt 31.08.2010, 16:42   #3 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Die Timer-Ereignisse funktionieren nicht unbedingt millisekunden-genau. In einem Multitasking-System werden eben mehrere Programme "gleichzeitig" bedient, dadurch entstehen gewisse zeitliche Differenzen.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist offline   Mit Zitat antworten
Alt 31.08.2010, 17:18   #4 (Direktlink)
MoRoGeP-Träger 2011
 
Benutzerbild von horsthorn
 
Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
Blinzeln

@Frank
Sowas in der Art hatte ich auch in Verdacht, konnte es nur nicht so allgemeinverständlich ausdrücken
__________________
Gruss, horst
Computer werden kleiner und kleiner, bald verschwinden sie völlig.
(Ephraim Kishon 1924-2005)

Win7-Home-Premium 32-Bit - XProfan12.0ß-S14 - Chrome-18.0.1025.142 m
http://www.web-treffpunkt.de
horsthorn ist gerade online   Mit Zitat antworten
Alt 01.09.2010, 09:52   #5 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard

Bin nun endlich dazu gekommen eine LED zu vorzubereiten, dass ich sie an
den Druckerport anschließen konnte.

Kurz paar zeilen in Profan getippt (und das proc aus dem internet eingefügt )
(war glaub so, schnell aus dem Gedächtnis)

Code:
Proc warte
 Parameters N&
 Declare fim&
  SetTimer N&
 Clear fim&
  WhileNot fim&
   WaitInput
   Case %wmTimer:fim& = 1
  EbdWhile
 KillTimer
 EndProc

WhileLoop 10
OutPB 888,2
warte 1000
OutPB 888,0
warte 1000
EndWhile

end
Hier ein kleines Video
(Ich weiß, der Transistor hat Schräglage )

Bei einem Takt von einer Sekunde hats getan. Jetzt bin ich gespannt, ob
ich auch einen Schrittmotortreiber präzise genug ansteuern kann...
Vielleicht reichen ja auch die "schmutzigen Millisekunden" um ein passables
Ergebnis zu erhalten. Jetzt heißt es aber erst wieder ran an den Lötkolben
und Probieren geht über Studieren...

P.S. Danke für den Code
So hät' ich mir also das Zählen sparen können
boqopod ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 01.09.2010, 14:05   #6 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard

Kleines Update...
ich habe nun eine Zweite LED fertig gemacht und angeschlossen.
So weit, so gut. Jetzt habe ich damit testen wollen, ob ich das
Signal hinbekomme oder nicht.

jetzt kommt der interessante Teil: Ich brauche für den Schrittmotor
eigentlich 200 Schritte / Sekunde

Für 32 Schritte (Ein Schritt = An Aus) braut mein Computer mit dem Code
exakt eine Sekunde.
Code:
Proc Test
Declare Ende%
Declare O%

Print "Anzahl der Schritte?"
Input O%
Def @Time$(0)
Def @Time$(1)
Print "Start von",O%,"Schritten: ",@Time$(0),@Time$(1)

WhileLoop O%

SetTimer 2
Clear Ende%
WhileNot Ende%
OutPB 888,3
Case %wmTimer:Ende% = 1
EndWhile
KillTimer

SetTimer 2
Clear Ende%
WhileNot Ende%
OutPB 888,1
Case %wmTimer:Ende% = 1
EndWhile
KillTimer

EndWhile

Def @Time$(0)
Def @Time$(1)
Print "Ende  von",O%,"Schritten: ",@Time$(0),@Time$(1)

waitkey

endproc

window 0,0-%MaxX,%MaxY
Test
waitkey
end
mit dem Code braucht er 0,00X Sekunden für 32 Schritte
bzw. 0,03 Sekunden für 200 Schritte

Code:
Proc Test
Declare O%

Print "Anzahl der Schritte?"
Input O%
Def @Time$(0)
Def @Time$(1)
Print "Start von",O%,"Schritten: ",@Time$(0),@Time$(1)

WhileLoop O%

OutPB 888,3
OutPB 888,1

EndWhile

Def @Time$(0)
Def @Time$(1)
Print "Ende  von",O%,"Schritten: ",@Time$(0),@Time$(1)

waitkey

endproc

window 0,0-%MaxX,%MaxY
Test
waitkey
end
Das Obere ist viel zu langsam und das untere viel zu schnell

Gibt es eine "Verlangsamerungsmöglichkeit", die dazwischen liegt?

edit: mit
Code:
[...]
WhileLoop O%

OutPB 888,3
Beep
Beep
Beep

OutPB 888,1
Beep
Beep
Beep

EndWhile
[...]
dauern 400 Schritte ca 0,8 sec, damit könnte ich leben.
Leider hängt sich der Computer dann auch fast auf. Er reagiert zumindest sehr komisch träge.
(nein ich hab keine Lautsprecher an dem Rechner )

Geändert von boqopod (01.09.2010 um 14:31 Uhr)
boqopod ist offline   Mit Zitat antworten
Alt 01.09.2010, 15:17   #7 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard

Damit kom ich jetzt einigermaßen hin... Ist zwar echt häßlich, aber es tut

Code:
Proc Test
Declare S%

Print "Anzahl der Schritte/Umdrehung?"
Input S%
Print

Def @Time$(0)
Def @Time$(1)
Print "Start von",S%,"Schritten: ",@Time$(0),@Time$(1)

WhileLoop S%

WhileLoop 55
OutPB 888,3
EndWhile

WhileLoop 55
OutPB 888,1
EndWhile

EndWhile

Def @Time$(0)
Def @Time$(1)
Print "Ende  von",S%,"Schritten: ",@Time$(0),@Time$(1)

waitkey

endproc

window 0,0-%MaxX,%MaxY
Test
waitkey
end
edit: auch unbrauchtbar - dauer ist auch immer anderst

Geändert von boqopod (01.09.2010 um 17:04 Uhr)
boqopod ist offline   Mit Zitat antworten
Alt 01.09.2010, 17:07   #8 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Wenn das Programm nur bei dir auf dem einem Computer laufen soll, ist die Abbremsung durch Schleifen ok. Auf anderen PCs wird dein Timing so aber nicht funktionieren. Nur zur Info, denke aber, das weißt du selber.
Kannst ja mal Sleep testen. Noch besser aber &gettickcount. Das verrät dir, wieviel Millisekunden vergangen sind. Gibt auch noch eine millisekunden-genaue Timermöglichkeit, ich such den Code mal raus.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.

Geändert von Frabbing (01.09.2010 um 17:12 Uhr)
Frabbing ist offline   Mit Zitat antworten
Alt 01.09.2010, 17:20   #9 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Code:
' Millisekunden-genaue Zeitmessung
' ohne Hardwaretimer unter NT-Windows.
' (c) Frank Abbing
'
Def timeGetTime(0)!"WINMM","timeGetTime"
Def timeBeginPeriod(1)!"WINMM","timeBeginPeriod"
Def timeEndPeriod(1)!"WINMM","timeEndPeriod"

timeBeginPeriod(1)
Sleep 32

WhileLoop 2000
 AddString "Wert in ms: "+Str$(timeGetTime())
EndWhile

ListBox$("Counter",2)

timeEndPeriod(1)
End
Gibt ein weiteres millisekundengenaus Timing, per Hardware-Timer. Das arbeitet aber mit 64-Bit-Variablen, darum dauert die Umrechnerei in XProfan mitunter schon ein paar Millisekunden. Nimm darum den oberen Code. Du kannst ihn so für deine Zwecke umschreiben, dass du prüfst, wieviel Zeit vergangen ist und ob es Zeit ist für den nächsten Durchlauf. Damit läuft dein Code dann auf allen PCs gleich schnell.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist offline   Mit Zitat antworten
Alt 01.09.2010, 17:23   #10 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard

Es ist nicht nur so, dass es auf anderen Rechnern unterschiedlich lange
dauert, sondern selbst auf ein und dem selbern rechner (warscheinlich je nach
dem was dem rechner gerade meint im hintergrund noch tun zu müssen)

"Sleep" hab ich auch schon getestet - damit kom ich auch auf 32 Schritte/sec

edit: @frabbing: danke dir

Geändert von boqopod (01.09.2010 um 17:31 Uhr)
boqopod ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 01.09.2010, 17:38   #11 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Wenn Sleep nicht geht, dürfte &getTickCount auch nicht flüssig funktionieren. Funktioniert alles über den Messagetimer.
Über winmm sollte es aber in jedem Fall gehen.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist offline   Mit Zitat antworten
Alt 01.09.2010, 23:27   #12 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard

ich gebs auf

Code:
' Millisekunden-genaue Zeitmessung
' ohne Hardwaretimer unter NT-Windows.
' (c) Frank Abbing
'

Def timeGetTime(0)!"WINMM","timeGetTime"
Def timeBeginPeriod(1)!"WINMM","timeBeginPeriod"
Def timeEndPeriod(1)!"WINMM","timeEndPeriod"
Declare A%, B%, C%, D%

Cls

OutPB 888,0

timeBeginPeriod(1)

A% = Str$(timeGetTime())
B% = A% + 5
D% = 0

Repeat
Inc D%
OutPB 888,3
C% = Str$(timeGetTime())
Until C% >= B%

OutPB 888,0

Print "Startzeit      ",A%
Print "Soll - Endzeit ",B%
Print "Ist - Endzeit  ",C%
Print "Wiederholungen ",D%

timeEndPeriod(1)
waitkey
End
Damit rauscht mein Rechner auch 10ms vorbei. Ab 31ms läuft alles wie es soll...
5ms sind scheinbar einfach zu kurz. Ich muss mir wohl eine andere Lösung suchen.

edit: es liegt aber nicht daran, dass er mit den wiederholungen nicht hinterher kommt.
in den 15-16ms schaft er zwischen 60 und 90 stück. warum er aber nicht früher abbricht?

Geändert von boqopod (01.09.2010 um 23:36 Uhr)
boqopod ist offline   Mit Zitat antworten
Alt 02.09.2010, 00:10   #13 (Direktlink)
Dauergast
 
Benutzerbild von p. specht
 
Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.082
Standard

Da wird etwas gepuffert. Dann ist der Puffer voll und wartet auf Entleerung. Deshalb bricht die Sache ab, wetten?
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3
p. specht ist gerade online   Mit Zitat antworten
Alt 02.09.2010, 00:50   #14 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 29.08.2010
Beiträge: 8
Standard

ich hab zwar keine ahnung was du meinst, aber so wie es aussieht hab ich
doch einen ansatz gefunden der sogar milisekundengenau funktioniert

als erstes wollt ich doch wissen warum er nicht früher abbricht, später aber
auf die tausendstel genau. darum hab ich mir jetzt die zeit ausgeben lassen.

Code:
Def timeGetTime(0)!"WINMM","timeGetTime"
Def timeBeginPeriod(1)!"WINMM","timeBeginPeriod"
Def timeEndPeriod(1)!"WINMM","timeEndPeriod"
Declare A%, B%, C%, D%

window 0,0-%MaxX,%MaxY

OutPB 888,0

timeBeginPeriod(1)

A% = Str$(timeGetTime())
B% = A% + 5
D% = 0

Repeat
Inc D%
OutPB 888,3
C% = Str$(timeGetTime())
Print C%
Until C% >= B%


OutPB 888,0

Print "---------------"
Print "Startzeit      ",A%
Print "Soll - Endzeit ",B%
Print "Ist - Endzeit  ",C%
Print "Wiederholungen ",D%

timeEndPeriod(1)

waitkey

End
Was dabei auffällt ist, dass die ersten paar durchläufe (besagte 15ms) die
zeit gar nicht aktuallisiert wird. dann schlagartig ist die größer als der
soll-wert: abbruch der schleife

na gut, hab ich gesagt, geb ich dem jungen ein bisschen zeit zum "warmwerden" (50ms)
(nicht vor den variablen erschrecken ich wollte alles genau ausgegeben haben)

Code:
Def timeGetTime(0)!"WINMM","timeGetTime"
Def timeBeginPeriod(1)!"WINMM","timeBeginPeriod"
Def timeEndPeriod(1)!"WINMM","timeEndPeriod"
Declare A%, B%, C%, D%, E%, F%, G%, H%, I%, J%

window 0,0-%MaxX,%MaxY

Print "Taktlänge? [ms]"
Input J%

OutPB 888,0

timeBeginPeriod(1)

A% = Str$(timeGetTime())
B% = A% + 50
E% = B% + J%
H% = E% + J%
D% = 0
I% = 0

Repeat
C% = Str$(timeGetTime())
Until C% >= E%

Repeat
Inc D%
OutPB 888,3
F% = Str$(timeGetTime())
Until F% >= E%

Repeat
Inc I%
OutPB 888,0
G% = Str$(timeGetTime())
Until G% >= H%

timeEndPeriod(1)

OutPB 888,0

Print "------------------------"
Print "LED AN"
Print "------------------------"
Print "Programmbeginn ",A%
Print "Startzeit      ",B%
Print "Soll - Endzeit ",E%
Print "Ist - Endzeit  ",F%
Print "Wiederholungen ",D%
Print "------------------------"
Print "LED AUS"
Print "------------------------"
Print "Startzeit      ",F%
Print "Soll - Endzeit ",H%
Print "Ist - Endzeit  ",G%
Print "Wiederholungen ",I%
Print "------------------------"

waitkey

End
und wer sagts denn, es geht auf die ms genau
jetzt muss ich das nur noch in ne schleife packen
das mach ich aber morgen... gute nacht

edit: sch****e. zu früh gefreut.
Die erste Repeat-Schleife will noch nicht. Wenn ich zB als Takt 1000ms eingebe und in der
ersten Schleife nur LED1 anschalte und in der zweiten Schleife nur LED2, leuchtet LED1 nicht,
sie blinkt kurs auf, wärend die zweite LED die sekunde wirklich leuchtet... Argh...

Geändert von boqopod (02.09.2010 um 01:09 Uhr)
boqopod ist offline   Mit Zitat antworten
Alt 02.09.2010, 06:35   #15 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Beim Start deines Programms ist noch das Laufwerk aktiv usw. Darum warte einen Moment, bevor dein Programm richtig anläuft. Am Anfach mal ein Sleep 1500 einbauen sollte helfen.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Antwort

  Paules-PC-Forum.de > Programmierung > XProfan

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
php-formmailer / Info ausgeben Goebi PHP/MySQL 1 13.05.2009 14:55
Kurve ausgeben Renate C/C++, Visual C++, Visual C++.NET 0 02.08.2006 14:58
200€ zum ausgeben HiiH Hardware - Problemlösungen 9 10.03.2005 20:02
Verwandschaftsgrad ausgeben (Konsolenanwendung) BATIGOAL C/C++, Visual C++, Visual C++.NET 0 29.11.2004 14:24



Alle Zeitangaben in WEZ +2. Es ist jetzt 12:11 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2