LPT Interrupt
-
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("--------------------"); } //---------------------------------------------------------------------------