![]() |
Anzeige:
|
|
|||||||
| XProfan Alles rund um die Programmiersprache XProfan. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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 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
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 |
|
|
|
|
|
|
#2 (Direktlink) | |
|
MoRoGeP-Träger 2011
![]() Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
|
Hab deinen Code mal abgeändert und einen Zähler eingebaut:
Zitat:
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) http://www.web-treffpunkt.de |
|
|
|
|
|
|
#3 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
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. |
|
|
|
|
|
#4 (Direktlink) |
|
MoRoGeP-Träger 2011
![]() Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
|
@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) http://www.web-treffpunkt.de |
|
|
|
|
|
#5 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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 (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 |
|
|
|
|
|
|
#6 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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 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 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 [...] 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) |
|
|
|
|
|
#7 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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 Geändert von boqopod (01.09.2010 um 17:04 Uhr) |
|
|
|
|
|
#8 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
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) |
|
|
|
|
|
#9 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
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
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#10 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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) |
|
|
|
|
|
|
#11 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
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. |
|
|
|
|
|
#12 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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 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) |
|
|
|
|
|
#13 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.082
|
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 |
|
|
|
|
|
#14 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 29.08.2010
Beiträge: 8
|
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 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 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 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) |
|
|
|
|
|
#15 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
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. |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ä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 |