Autor Beitrag
S.A.M
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 03.04.06 17:23 
Hallo!

Ich weiß nicht, ob das hier die richtige Sparte ist, aber ich versuchs mal:

Wir wollen einen Programm schreiben, dass später einmal Alpha-Strahlung messen kann.
Die Messgeräte haben wir schon und die funktionieren auch mit einem alten Programm, das ist allerdings so alt, dass wir halt ein neues haben wollen (für die Schule, Physik-LK).

Unser Lehrer hatte mal versucht, etwas zu programmieren, aber bei ihm hakte es an der Port-Ansteuerung:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
function TForm1.peak_wert: INTEGER;               {Wert vom Interface lesen}
var i,wert: INTEGER;
    time: Cardinal;
    bits: array[0..7]of BYTE;                     {Zähler,Zwischenwert,Puffer}
const sleepconst=1;
begin
  Comport.RTS(0);                                 {Chipselect low}
  Comport.DTR(1);                                 {Clock high}
  messen:=true;
  time:=5000+GetTickCount;
  repeat
    Application.ProcessMessages;
    if (GetTickCount>time) or Abbruch then
    begin
      StatusBar1.Panels[1].Text:='';
      Abbruch:=true;
    end;
  until Abbruch or (ComPort.DSR = 0);             {Warten auf Ereignis}
  repeat
    Application.ProcessMessages;
    if (GetTickCount>time) or Abbruch then
    begin
      StatusBar1.Panels[1].Text:='';
      Abbruch:=true;
    end;
  until Abbruch or (ComPort.DSR = 1);
  if not Abbruch then
  begin
    for i:=0 to 7 do                              {Blindabfrage, TO 10 bei 10 Bit}
    begin
      Comport.DTR(1);                             {Clock high}
      sleep(sleepconst);                          {Warten auf Taktreaktion    0,4 ms ???}
      Comport.DTR(0);                             {Clock low}
    end;
    sleep(10*sleepconst);                         {Warten auf neue Wandlung    4 ms ???}
    for i:=0 to 7 do                              {Messabfrage, TO 9 bei 10 Bit}
    begin
      Comport.DTR(1);                             {Clock high}
      sleep(sleepconst);                          {Warten auf Taktreaktion   0,4 ms ???}
      bits[i]:=Comport.CTS;                       {Register in Puffer lesen}
      Comport.DTR(0);                             {Clock low}
      bits[i]:=bits[i] xor 1;
    end;
    Comport.RTS(0);                               {Chipselect low (sowieso immer an!)} 
    sleep(30*sleepconst);                         {Löschen des S&H-Gliedes abwarten   12 ms ???}
    wert:=bits[0];
    for i:=1 to 7 do wert:=(wert shl 1or bits[i];{TO 9 bei 10 Bit}
  end
  else wert:=0;
  messen:=false;
  result:=wert;
end;


Diese Funktion sollte mit Hilfe einer DLL, die wohl hoffentlich funktionieren wird, aus dem Internet auswerten, welcher Port angesteuert wurde.

Es sind 256 verschieden Werte möglich und die soll man später messen können.

Erkennt jemand in der Ansteueung einen Fehler, oder hat jemand eine Idee es besser zu machen?


Zuletzt bearbeitet von S.A.M am Do 13.04.06 16:38, insgesamt 1-mal bearbeitet
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 03.04.06 17:42 
Nee, aber unter windows ist die RS-232-Ansteuerung komplett ereignisgesteuert. Da muss man sich erstmal dran gewöhnen. Probiers mal hiermit...
Einloggen, um Attachments anzusehen!
_________________
Na denn, dann. Bis dann, denn.
Jailbird
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 127

Windows XP Pro SP2
Delphi 7 Professional
BeitragVerfasst: Mo 03.04.06 17:55 
Ansonsten empfehl ich comport.sf.net Ich arbeite selber damit und bin damit zufrieden

_________________
Jailbird
S.A.M Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 03.04.06 18:24 
Danke für eure Beiträge, aber die helfen mir nicht so recht weiter...
Wie kann ich denn jetzt z.B. dieses async32 für mein Programm nutzen?

Muss ich nur die Unit includen und dann die Funktionen/Variablen in meinem Programm abfragen?

Das wären dann ja ganz schön viele, aber das muss wohl so sein. Na, dann werde ich mal versuchen daraus was zu basteln, ich weiß zwar noch nicht, welche Funktionen ich alle brauche, aber ich habe ja schon eine Vorlage...
S.A.M Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 13.04.06 12:55 
Also ich hab es jetzt mit Async32 versucht, aber es klappt nicht.
So wollte ich die Daten auslesen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 sleepconst:=1;
 ComPort1.Open;
 ComPort1.SetDTR(true);
 ComPort1.SetRTS(false);

  for i:=0 to 7 do                              {Blindabfrage, TO 10 bei 10 Bit}
    begin
      ComPort1.SetDTR(true);                             {Clock high}
      sleep(sleepconst);                          {Warten auf Taktreaktion    0,4 ms ???}
      ComPort1.SetDTR(false);                             {Clock low}
    end;
    sleep(10*sleepconst);                         {Warten auf neue Wandlung    4 ms ???}
    for i:=0 to 7 do                              {Messabfrage, TO 9 bei 10 Bit}
    begin
      ComPort1.SetDTR(true);                             {Clock high}
      sleep(sleepconst);                          {Warten auf Taktreaktion   0,4 ms ???}
      //bits[i]:=ComPort1.CTS;         {Register in Puffer lesen   -  Hier ist wohl das Problem!!!!!}    
      ComPort1.SetDTR(false);                             {Clock low}
      bits[i]:=bits[i] xor 1;
    end;
    ComPort1.SetRTS(false);                               {Chipselect low (sowieso immer an!)}
    sleep(30*sleepconst);                         {Löschen des S&H-Gliedes abwarten   12 ms ???}
    wert:=bits[0];
    for i:=1 to 7 do wert:=(wert shl 1or bits[i];{TO 9 bei 10 Bit}
   showMessage(IntToStr(wert));


Die Struktur habe ich von einem funktionierenden TurboPascalprogramm übernommen, sollte also richtig sein.

Aber als Ergebnis kommt jetzt immer abwechselnd 255 und dann 0.
Es gab beim alten Programm noch einige Messbedingungen (z.B. " until Abbruch or (ComPort.DSR = 1);
if not Abbruch then"), aber ich glaube, es liegt an "bits[i]:=ComPort1.CTS;".

So war es nämlich im alten Programm, aber bei Async gibt es irgendwie keine CTS-auslesende Funktion.

Kann mir jemand helfen?