PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche dringend C-Befehl für "Pause" und "Schn



danionbike
04.08.2005, 09:18
Hallo!


Benötige einen Befehl in C, der eine Minute (oder auch eine Sekunde) lang wartet, bis das Programm fortgesetzt wird.
Also einen Art "Pausen"-Befehl.

Weiter möchte ich gerne über ein C Programm eine Schnittstelle am PC ansteuern, ist erstmal egal welche, möchte die Schnittstelle nutzen, um einen Stromkreis zu schließen bzw. zu öffnen.

Hoffe ihr versteht was ich meine, würde mich sehr über ein paar Antworten freuen!

THX!

ACU
04.08.2005, 10:19
Nimm einfach diese Funktion:


void warte(int sekunden)
{
clock_t start;
sekunden *= CLOCKS_PER_SEC;
start = clock();
while( clock() < start + sekunden)
;
}


Zum benutzen rufst du einfach warte(10) für 10s auf.

Ports kannst du über eine fertige DLL realisieren.
Soweit ich weiß heißt diese Datei Port.DLL.
Such mal im Forum oder mit Google.

Hoffe ich konnte helfen.


MfG ACU


EDIT: Habe gerade gemerkt, dass der Befehl für Borland C++ ist.

Eventuell kannst du es mal mit sleep versuchen.
Bei der CC2 funktioniert es so:
SLEEP Milisekunden;

danionbike
04.08.2005, 11:00
bin leider net so der checker ....

also einfach anstatt warte sleep einsetzen?!
und dann die funktion einfach ins programm so einbinden?
oder muss ich da noch was beachten?
(zwecks initialisierung o.ä.?)

das mit den Ports versteh ich auch net wirklich ... sorry!

SprinterSB
04.08.2005, 11:13
Benötige einen Befehl in C, der eine Minute (oder auch eine Sekunde) lang wartet, bis das Programm fortgesetzt wird.
Also einen Art "Pausen"-Befehl.

Das gehört nicht zum Sprachumfang von C.

danionbike
04.08.2005, 11:32
und was soll ich nun machen?

es wird doch wohl einen Befehl oder eine Funktion geben, die eine Pause im Programm bewirkt.

danionbike
04.08.2005, 11:39
kann mir noch jemand das mit dem Port genauer bzw. simpel erklären?

cavegn
04.08.2005, 13:15
hi

so wie ich dich verstanden habe, bist du ein programm für deinen pc, und nicht für einen uC am erstellen?

falls du windows/visual studio verwendest, gibts da den befehl Sleep(milliseconds);

Sleep(1000); würde also eine sekunde 'schlafen'

cu

chris

user529
04.08.2005, 13:16
funktionieren delay(ms) oder sleep(sec) nicht? diese befehle sollten doch in der stdlib.h oder in der conio.h sein. (borland c-compiler;oder bin ich jetzt komplett falsch?)
mfg clemens

michaelb
04.08.2005, 13:44
Hallo,
über die funktion delay(ms) gibt's hier schon nen ausführlichen Thread! Schau mal hier: Klick (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=9480&postdays=0&postorder=asc&highlight=delay&start=0)
Gruß Michi

user529
04.08.2005, 13:54
@michaelb
hier gehts nicht um avrs sondern einen pc und dessen schnittstellen



über ein C Programm eine Schnittstelle am PC ansteuern



clemens

danionbike
06.08.2005, 16:51
so, hab mal ein bissle rum programmiert und dabei die von ACU geschr. Fkt. verwendet:

void warte(int sekunden)
{
clock_t start;
sekunden *= CLOCKS_PER_SEC;
start = clock();
while( clock() < start + sekunden)
;
}

leider meckert mein Kompiler andauernd bei dieser Fkt.!

Ich verwende einen Bloodshed DEV C++ Version 4.9.9.2

Könnt ihr mir helfen?

Kann ich mit diesem Kompiler Ports ansprechen und diese schalten?

izaseba
06.08.2005, 17:09
leider meckert mein Kompiler andauernd bei dieser Fkt.!

Es wäre schön zu wissen was er meckert....

Ich kann mein popo drauf verwetten, daß du time.h nicht eingebuden hast ?
Stimmt's?

Ich lege Dir diese Seite ans Herz http://www.cppreference.com/stddate/clock.htm

Und auch die Hauptseite davon.

Gruß Sebastian

danionbike
06.08.2005, 17:43
hattest recht, hab jetzt #include <time.h> hinzugefügt

leider gibt es noch immer eine fehlermeldung
und zwar markiert er mir die letzte geschweifte klammer } rot
und sagt "syntax error at end of input"

danionbike
06.08.2005, 17:46
das mit der fehlermeldung hat sich geklärt


jetzt hab ich nur noch das problem mit dem steuern eines ports

kennt sich jemand damit aus?

izaseba
06.08.2005, 18:00
Hallo,
ganz am Anfang hat Dir jemand ein tip mit Port.DLL suche hier in Forum danach,
es wurde hier schon öfters besprochen.

Gruß Sebastian

danionbike
08.08.2005, 18:24
Hab mich jetzt kundig gemacht, leider erscheint nach dem Ausführen des Programms folgende Fehlermeldung:

main.exe hat ein Problem festgestellt und muss beendet werden.


wie gesagt es ist in C programmiert (nicht C++)
hier mal der Quellcode:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

void warte();

int main(int argc, char *argv[])
{
int start;
printf("Bitte 1 fuer Messstart eingeben:");
scanf("%d",&start);
if(start == 1)
{
_outp(0x378,0xFF); //alle DATA-Ausgänge (Pins) high setzen
printf("Ausgang = 1");
warte(10);
_outp(0x378,0x00); //alle DATA-Ausgänge (Pins) low setzen
printf("\nAusgang = 0");
warte(20);
}

system("PAUSE");
return 0;
}


void warte(int sekunden)
{
clock_t start;
sekunden *= CLOCKS_PER_SEC;
start = clock();
while( clock() < (start + sekunden))
;
}


habe im Internet gelesen, dass am Parallelport bei einem "high" 5V anliegen.

Wisst ihr warum es nicht funktioniert???

08.08.2005, 18:47
Hallo,

Leider kenn ich mich mit Windows und Ports ansprechen nicht aus, aber darf man da so direkt auf die Par. Schnittstelle zugreifen ?
Aber ich denke, daß hier Leute sind, die Dir sicher weiterhelfen.
Gruß Sebastian

steinachim
08.08.2005, 22:27
Welche Windows Version verwendest du?
Soweit ich weiß erlauben Windows 2000 / XP diesen direkten Zugriff nicht. Das geht AFAIK nur mit den alten Version (95, 98, ?ME). Ich verwende Linux, deshalb kann ich es nicht selbst ausprobieren.

Gruß
Achim

danionbike
09.08.2005, 07:27
Welche Windows Version verwendest du?
Soweit ich weiß erlauben Windows 2000 / XP diesen direkten Zugriff nicht. Das geht AFAIK nur mit den alten Version (95, 98, ?ME). Ich verwende Linux, deshalb kann ich es nicht selbst ausprobieren.

Gruß
Achim



was meinst du mit "AFAIK"? ist mir gerade nicht geläufig.

habe 2 PC`s einmal mit XP und einen mit NT 2000.
geschickter wäres es wenn das Programm später auf NT 2000 laufen würde!

weis jemand ob das mit dem Quellcode dann so in Ordnung ist?
Kann es gerade leider net testen, da ich den 2000er PC formatieren muss.

wäre echt super wenn das Programm noch funktionieren würde!

steinachim
09.08.2005, 08:14
AFAIK = As Far As I Know = Soweit ich weiß

Blackbird
09.08.2005, 08:30
@danionbike,
Portzugriffe unter Winows: lies Dir mal das hier durch:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10599

Eine Zeitspanne warten (in C/C++ mit Windows-API):
wie schon erwähnt:
#include <windows.h>

...
Sleep (3 * 60 * 1000); // 3 Minuten warten
...

Besser wäre es mit einem Timer und einer Timerprocedur:

...
SetTimer (NULL, 0, 1000 * 60, MyTimeProc); // 1-Minuten-Timer
...
VOID CALLBACK TimerProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_TIMER message
UINT_PTR idEvent, // timer identifier
DWORD dwTime // current system time
)
{
// Tu irgendwas
}

Warum nimmst Du nicht die serielle Schnittstelle? Die ist kurzschlußfest und liefert ca. 5mA bei etwa 10V.

...
HANDLE hPort;

hPort = CreateFile (TEXT("COM1"),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);

EscapeCommFunction (hPort, SETRTS); // RTS setzten
Sleep (2000);
EscapeCommFunction (hPort, CLRRTS); // RTS rücksetzten
Sleep (2000);
EscapeCommFunction (hPort, SETRTS); // RTS setzten
Sleep (2000);

CloseHandle (hPort);
...

Blackbird

danionbike
09.08.2005, 08:51
@ Blackbird

die Wartefunktion habe ich ja schon!
diese funktioniert auch einwandfrei.

das mit der seriellen Schnittstelle wäre eine Überlegung wert.

bin leider auf dem Gebiet kein Profi!

meinst du nun, dass ich deinen Quellcode


...
HANDLE hPort;

hPort = CreateFile (TEXT("COM1"),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);

EscapeCommFunction (hPort, SETRTS); // RTS setzten
Sleep (2000);
EscapeCommFunction (hPort, CLRRTS); // RTS rücksetzten
Sleep (2000);
EscapeCommFunction (hPort, SETRTS); // RTS setzten
Sleep (2000);

CloseHandle (hPort);
...


einfach ins Programm einbinden soll?

Und fertig ist es?
Brauch ich dann unter NT2000/XP keine weiteren Teiber o.ä.?

sorry, wenn ich so viel frage, aber wie gesagt, bin blutiger Anfänger! :-)

Blackbird
09.08.2005, 14:28
Ein einfaches Beispiel:

/*******************************************
** Pin5 ist Masse, Pin7 ist +10V (== AUS)
** Pin7 ist -10V (== EIN)
** Version 1 mit Funktion 'warte ()'
*******************************************/
#include <windows.h>
#include <time.h>

#define SWITCH_ON 3 // Minuten
#define SWITCH_OFF 57

void warte (int sekunden)
{
clock_t start;
sekunden *= CLOCKS_PER_SEC;
start = clock ();
while (clock() < start + sekunden);
}

int main (void)
{
HANDLE hPort;

hPort = CreateFile (TEXT("COM1"), GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);

for (;;)
{
EscapeCommFunction (hPort, SETRTS); // RTS setzten Pin7
warte (SWITCH_ON * 60);
EscapeCommFunction (hPort, CLRRTS); // RTS rücksetzten Pin7
warte (SWITCH_OFF * 60);
}

CloseHandle (hPort);
return (0);
}

oder einfacher:


/*******************************************
** Pin5 ist Masse, Pin7 ist +10V (== AUS)
** Pin7 ist -10V (== EIN)
** Version 2 mit Funktion 'Sleep ()'
*******************************************/
#include <windows.h>

#define SWITCH_ON 3 // Minuten
#define SWITCH_OFF 57

int main (void)
{
HANDLE hPort;

hPort = CreateFile (TEXT("COM1"), GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);

for (;;)
{
EscapeCommFunction (hPort, SETRTS); // RTS setzten Pin7
Sleep (SWITCH_ON * 60 * 1000);
EscapeCommFunction (hPort, CLRRTS); // RTS rücksetzten Pin7
Sleep (SWITCH_OFF * 60 * 1000);
}

CloseHandle (hPort);
return (0);
}

Blackbird

danionbike
09.08.2005, 15:13
hallo,

bist du dir sicher, dass an Pin7 10V anliegen?
hab gelesen dass am Parallelport bei einem "high" ca. 5V anliegen.
und nach dem Aufbauschema ist Pin5 auch nicht Masse sondern Pin18 bis Pin 25.

Grundaufbau 25pol Sub-D Buchsenleiste:

Pin2 bis Pin9 = Ausgänge (Bidirektional) Zugriff durch DATA Register
Pin15, Pin10 bis Pin13 = Eingänge Zugriff durch STATUS Register
Pin1, Pin14, Pin 16, Pin17 = Ein/Ausgänge Zugriff durch CONTROL Register
Pin 18 bis Pin25 = Masse

stimmt doch oder?


Oder meinst du nun den seriellen Anschluss????

danionbike
09.08.2005, 15:31
klar, du meinst die serielle.

eine Frage hätte ich noch:
du schreibst in deinem Progr. für Pin7 == AUS ist dieser +10V und für == EIN -10V bzw. Pin5 ist Masse.
Möchte ja gerne ein Relais an den Pin7 anschließen, schaltet das Relais dann auch nur bei -10V? Oder wie ist das mit +/-10V gemeint?

danionbike
10.08.2005, 08:13
hallo!

also das Programm funktioniert!!!

bei EIN habe ich -11,34V
bei AUS habe ich +11,34V

aber wie soll ich damit ein Relais steuern???

was gibt es noch für Möglichkeiten einen Arbeitsstromkreis damit zu steuern?

Möchte ja erreichen dass einmal Strom fließt und dann garkein Strom fließt (auch kein negativer).

bin mal auf eure Antworten gespannt!

Blackbird
10.08.2005, 08:23
Ganz einfach: mit einer Diode (Polung ist egal) vom Pin7 zum Relais und vom 2. Anschluß des Relais zum Pin5 (Masse). Das Relais sollte aber ein 12V-Typ im IC-Gehäuse sein, also eins, welches für IC-Ausgänge geeignet ist. Denn mehr als ca. 10 mA kommen da nicht raus.

Solche Relais schalten aber selten mehr als 0,3A bis 0,5A bei höchstens 42V!

Statt Relais kannst Du besser einen Optokoppler (mit Vorwiderstand) einsetzen. Die Empfängerseite kann dann (mit einer externen Spannungsquelle) je nach Schaltung, alles Mögliche treiben/schalten/steuern.

Blackbird

danionbike
10.08.2005, 08:59
hallo!

also wie ich dich versteh kann ich das mitm Relais vergessen oder?

Wie funktioniert ein Optokoppler?

Hast du für meine Anwendung einen Schaltplan o.ä.?

danionbike
10.08.2005, 09:18
hab mich mal bei Conrad umgeschaut.

folgendes Relais gefunden:

SIGNALRELAIS DS2Y 2U 2A 12V

Spulenspannung V/DC 12
Typ DS2Y-S-DC12V
Ansprechsp. V/DC max. 8,4
Abfallsp. V/DC min. 1,2
Spulenwid. Ω* 720
Spulenstrom mA* 16,7
Leistungsaufn. mW 200
Betriebssp. V/DC max. 24


2 x UK - 200 mW empfindliches Miniatur-Relais, 1500 V FCC Überspannungsfestigkeit. Hohe Empfindlichkeit - 200 mW Betriebsleistung. Hohe Durchbruchspannung 1500 V FCC zwischen den geöffneten Kontakten. Gehäuse passend für 16-poligen IC-Sockel. Versiegeltes Gehäuse.
Technische Daten: Übergangswiderstand (bei Spannungsabfall 6 V/DC 1 A): 50 mΩ · Kontaktmaterial: Vergoldetes Silber · Grenzwerte: Schaltleistung (ohmsche Last) max. 60 W, 62,5 VA · max. Schaltspannung 220 V/DC, 250 V/AC, max. Schaltstrom 2 A , max. Carrying-Strom 3 A · UL/CSA Grenzwerte: 1 A 30 V/DC, 0,3 A 110 V/DC, 0,3 A 125 V/AC · Lebensdauer: Mechanisch 1 x 108, elektrisch (1 A 30 V/DC) 5 x 105, (2 A 30 V/DC) 1 x 105 · Isolationswiderstand min. 1000 MΩ (bei 500 V/DC) · Durchbruchspannung: offene Kontakte 750 Vrms, zwischen den Kontaktsätzen 1000 Vrms, zwischen Kontakten und Spule 1000 Vrms · FCC Überspannungsfestigkeit zwischen den geöffneten Kontakten 1500 V · Umgebungstemperatur -40 bis +70 ºC.

*±10%

10.08.2005, 09:41
Die Wahl des Relais hängt doch vom Einsatz ab. Über den hast Du noch nicht viel geschrieben. Welche Spannung, wieviel Strom sollen denn geschaltet werden?
Wenn es Netzspannung (230V~) ist, kannst Du besser ein Solid-State-Relais vervenden. Das ist erstens optisch getrennt und zweitens schaltet es eben Netzwechselspannung.

Schaltungen zum Ansteuern von Lasten per PC-Schnittstelle (seriell und parallel) gibt es im Internet viele. Und auch hier im Forum ist schon mehrmals darüber diskutiert worden.
Für das Verständnis der Vorgänge sind aber ein paar Grundkenntnisse in Elektronik sehr hilfreich. Das hilft Zeit und Geld sparen, kannst Du mir ungeprüft glauben.


Blackbird

danionbike
10.08.2005, 09:53
Arbeitsspannung ca. 13,5V
Arbeitsstrom noch unbekannt


kann ich nicht mit einer Diode die positive Spannung (+11V) sperren und somit nur die negative Spannung (-11V) durchlassen und diese dann mit einer Gleichrichtdiode auf das Relais lassen?

danionbike
10.08.2005, 11:02
Relaisschaltung an der seriellen Schnittstelle:

http://www.b-l-w.de/serialrelay.php


weis jemand was für ein Transistor, Relais, Dioden und LED man dafür verwenden muss (Kennwerte)?

10.08.2005, 12:14
Arbeitsstrom noch unbekannt
Das ist schlecht, denn wenn es 40A sind, kann es ein KFZ-Relais sein, sind es 100 mA, genügt ein Reedrelais.


kann ich nicht mit einer Diode die positive Spannung (+11V) sperren und somit nur die negative Spannung (-11V) durchlassen und diese dann mit einer Gleichrichtdiode auf das Relais lassen?
Da zitiere ich mich mal selber:

Ganz einfach: mit einer Diode (Polung ist egal) vom Pin7 zum Relais und vom 2. Anschluß des Relais zum Pin5 (Masse).
Eine Diode reicht.

Was willst Du denn genau wissen? Im von Dir genannten Link sind doch alle Daten angegeben!

Relaisschaltung an der seriellen Schnittstelle:
http://www.b-l-w.de/serialrelay.php

An D2 liegen Deine 11,34V an und der Strom ist (11,34V - 0,8V) / 100kOhm,
D1 ist eine "Freilaufdiode" --> google,
die LED kannst Du frei wählen --> google, Daten lesen, R1 neu berechnen,
BC517 --> google --> Daten lesen,
usw. usf.
Diese Arbeit wird Dir keiner abnehmen.


Blackbird

danionbike
10.08.2005, 14:29
hab jetzt N4001er Dioden verwendet, diese müssten ja gehn.

als Transistor habe ich den BD182 verwendet.

das Relais muss ich leider noch bestellen ...

skillii
10.08.2005, 19:57
damit du auf den parallelen Port (WinXP/Win2k) zugreifen kannst musst du vorher irgendein Programm ausführen (weiß aber im moment keines).

11.08.2005, 07:42
1N4001-Dioden sind schon i.O.
Der BD182 ist oversized. Dein Relais (welches?) wird ja höchstens 1A ziehen an 13,5V. Hat der Transistor eine Stromverstärkung von 50, so muß der notwendige Basisstrom 1A / 50 * K (mit K = 2, d.h. zweifache Übersteuerung, damit er auch wirklich schaltet) = 40 mA sein. Geht also nicht. Außerdem hast Du noch einen Vorwiderstand von 100 kOhm, der den Basísstrom sowieso auf (11,34 - 0,7) / 100 000Ohm = 106 mikroAmpere = 0,106 mA begrenzt.
Solange Du nicht schreibst, wieviel Strom Dein Relais braucht, kannst Du auch nicht erwarten, daß Dir einer eine fertig dimensionierte Schaltung hinlegt. Und das Ohmsches Gesetz kannst Du auch mal selber bemühen.

Du brauchst 'ne Menge Zeit und bestellst einfach was, was voraussichtlich nicht benötigt wird. Weiter oben schrieb ich schon, das ein paar Grundkenntnisse Zeit und Geld sparen helfen.

Blackbird

11.08.2005, 13:12
http://www.elektronik-kompendium.de/public/schaerer/powsw1.htm

Blackbird

crowdy
15.08.2005, 17:08
MOin Moin
Ich habe nochmal ne Frage zu der Warte Funktion in C. Ich programmiere nämlich einen µC und sleep hat schnmal nicht geklappt.
Die ganz oben aufgeführte Funktion enthält time.h und soweit ich weiss habe ich damit auch Problem das zukompilieren.
Gibt es noch andere Möglichkeiten? Oder muss ich zur russischen Methode greifen und den Prozessor auslasten?

mfg

16.08.2005, 08:49
"Warten" ist in der Regel das Ungünstigste. Weil in dieser Zeit nichts anderes passieren kann, außer Interrupts. Sleep() und sleep() sind wirklich nur ein Notbehelf. Besser ist die Verwendung eines Timers und einer Timer-Routine. Die nutzt dann Interrupts und es kommt nicht zum "Lahmlegen" des Prozessors.
In Windows und Unix (Linux) wird Sleep(), sleep() und nanosleep() dennoch verwendet, weil es Multitasking-OS sind, die in dieser Zeit, wo das eigene Programm steht, noch was anderes machen können.
Nur beim Mikrocontroller ohne solch ein OS gibt es nichts anderes, was noch gemacht werden könnte - es sei denn, es wurde so programmiert. Z.B. mit Task-Scheduling, Interrupts, etc.

Meine Empfehlung: sind es nur ganz kurze Zeiten - dann Controller mit einer Zählschleife beschäftigen. Sind es längere Zeiten: Programm umschreiben, wie oben beschrieben.

Blackbird