?
Hallo,
Wir müssen für ein Schulprojekt ReedKontakte(schließen bei Magnetismus in der Nähe) in einer Carrera-Bahn auslesen um so die Rundenzeiten zu messen.
Wir haben es mit einer externen USB-Interface-Karte versucht aber die konnte nur alle 20ms abfragen. Das war viel zu langsam, da war das Auto schon wieder drüber.
Jetzt haben wir die mit einem LPT-Kabel verbunden und müssen nun durch einen Hardware Interrupt eine Funktion auslösen lassen. Wir haben in C++ noch nie wirklich mit Hardwarenahen Funktionen etc gearbeitet. Es wäre uns eine riesen Hilfe, wenn jmd kurz erklären könnte, wie man am besten, sichersten und vorallem am leichtesten (wir sind noch Schüler ) diesen Interrupt verwirklichen kann.
(An Timer haben wir auch schon gedacht, allerdings hält davon unser Lehrer nicht so viel )
Vielen Dank.
Unser Quellcode bis jetzt:
(keine eigene geistige Arbeit - Haben schon den ganzen Tag gegoogelt )
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#define PPORT_BASE 0x378
#include "LPT_GUI_U.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
// Funktionsprototypen
typedef short (_stdcall *inpfuncPtr)(short portaddr);
typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);
// Pointer
inpfuncPtr inp32fp;
oupfuncPtr oup32fp;
// Wrapper-Funktionen
short Inp32(short portaddr)
{
return (inp32fp)(portaddr);
}
void Out32(short portaddr, short datum)
{
(oup32fp)(portaddr,datum);
}
bool fehler = false;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btSchreibenClick(TObject *Sender)
{
/*short signal = StrToInt(edSchreiben->Text);
int port;
port = PPORT_BASE;
// Datenregister schreiben
Out32(port,signal);
lbAusgabe->Items->Add("Schreibe: " + IntToStr(signal));
// Zur Überprüfung lesen
signal = Inp32(port);
lbAusgabe->Items->Add("Lese: " + IntToStr(signal));
lbAusgabe->Items->Add("--------------------");*/
unsigned long NumBytesWritten;
unsigned char Data = 0x00;
HANDLE Lpt1Han = CreateFile("\\\\.\\LPT1",
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (Lpt1Han)
{
WriteFile(Lpt1Han, &Data, 1, &NumBytesWritten, NULL);
CloseHandle(Lpt1Han);
}
else
MessageDlg("Konnte LPT1 nicht öffnen",mtError, TMsgDlgButtons()<< mbOK,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// DLL laden
HINSTANCE hLib = LoadLibrary("inpout32.dll");
if(hLib == NULL)
{
mem_ausgabe->Lines->Add("Fehler beim Laden der DLL");
fehler = true;
}
else mem_ausgabe->Lines->Add("DLL erfolgreich geladen");
mem_ausgabe->Lines->Add("--------------------");
// Prozessadressen laden
inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
if(inp32fp == NULL)
{
mem_ausgabe->Lines->Add("Fehler beim Laden der Input-Prozessadresse");
fehler = true;
}
oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if(oup32fp == NULL)
{
mem_ausgabe->Lines->Add("Fehler beim Laden der Output-Prozessadresse");
fehler = true;
}
if(!fehler) mem_ausgabe->Lines->Add("Prozessadressen erfolgreich geladen");
mem_ausgabe->Lines->Add("--------------------");
// Port-Adresse ausgeben
mem_ausgabe->Lines->Add("Port-Adresse: " + IntToStr(PPORT_BASE));
mem_ausgabe->Lines->Add("--------------------");
// Initialisierung testen
if(!fehler) mem_ausgabe->Lines->Add("Initialisierung ergfolgreich");
else mem_ausgabe->Lines->Add("Initialisierung nicht ergfolgreich");
mem_ausgabe->Lines->Add("--------------------");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btReadClick(TObject *Sender)
{
short signal;
int port;
for(port=PPORT_BASE; (port<(PPORT_BASE+8)); port++) {
signal = Inp32(port);
mem_ausgabe->Lines->Add("Lese: " + IntToStr(signal));
}
mem_ausgabe->Lines->Add("--------------------");
}
//---------------------------------------------------------------------------