hallo
danke ich werde es demnachst ausprobieren
hoffendlich klappt es
ich verstehe allerdings nicht genau was da steht
kannst du mir das erklären
ich benutze den bloodshed dev-c++ 4.0 compiler (http://ftp1.sourceforge.net/dev-cpp/devcpp4.zip) und musste die ausgabebefehle selber scripten.... und zwar mit assembler (at&t syntax)....
sollte eigentlich selbsterklärend sein.... ansonsten nur fragen....Code:void outp(char wert, int adresse){ __asm("MOVW %1, %%dx \n\t" "MOVB %0, %%al \n\t" "OUT %%al, %%dx" : : "g" (wert), "g" (adresse) ); } char inp(int adresse){ char wert; __asm("MOVW %1, %%dx \n\t" "IN %%dx, %%al \n\t" "MOVB %%al, %0" : "=g" (wert) : "g" (adresse) ); return(wert); }
hallo
danke ich werde es demnachst ausprobieren
hoffendlich klappt es
ich verstehe allerdings nicht genau was da steht
kannst du mir das erklären
ja eine erklärung wäre super!Zitat von FJK
Hi Leute,
ich programmiere unter BCB 5 und um den Druckerport unter Win2k anzusteuern benutze ich die inpout32.dll Damit ist das arbeiten sehr einfach man definiert einfach seine Druckerport addresse 0x378 und kann dann sehr schnell auf dieser ausgeben und einlesen.
http://www.logix4u.net/inpout32.htm
gruß Marc
hallo
danke aber ich programmiere unter win98
da sind lpt´s frei
kannst du sonst weiterhelfen
https://www.roboternetz.de/phpBB2/vi...?p=50698#50698
Hi Flo,
also, soweit ich weiß ist doch da was falsch?!?!
ache auf das <== weil ich weiß daß der LPT immer aus den drei addressen 0x378 + 0x379 + 0x37A besteht. Du schreibst da aber 0x378 + 0x2 rechnet der das dann schon richtig?
#define LPT1 0x378
.
.
.
int Steuerregister;
Steuerregister = inp(LPT1+0x2); <== Müsste das nich 0x02 heißen?
//Lesen des Steuerregisters
Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters
also kann mir jemand den lösungsvorschlag nochmal erklären
ich weiß ja nicht ob ich jetzt kompletten unsin rede!?
gruß Marc
hallo Marc
0x378 ist doch die adresse vom lpt1
und die 0x2 beneutet doch er soll den 2. pin ansteuern
mit 0x3 soll er den 1. und 2. pin ansteuern oder???
und wo kommt das hin???
bzw muss ich teile meines alten quelltextes ändern/löschen
int Steuerregister;
Steuerregister = inp(LPT1+0x2); <== Müsste das nich 0x02 heißen?
//Lesen des Steuerregisters
Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters
hä?
So ich glaube wir haben ein problem!
Darum erst einmal ein kleiner Basiskurs zum Druckerport.
Die parallele Schnittstelle belegt insgesammt drei mal 8-bit-Adressen.
Zuerst die Basisadresse in unserem Fall -> 0x378 dann folgen die 0x379 und 0x37A.
Wobei die Adressen zu folgenden Registern führen:
Data-Register: 0x378
Status-Register: 0x379
Controll-Register: 0x37A
So schon alleine mit diesen Hintergrund informationen kann man doch schon an deinem Quellcode erkennen daß................
int Steuerregister;
Steuerregister = inp(LPT1+0x2);
//Lesen des Steuerregisters
<== Hier wird die adresse 0x378 um 0x2 erhöht und somit erhalten wird die adresse 0x37A. Nun befinden wir uns im Steuerregister (Controllregister) und fragen den aktuellen Status ab. Befehl OK!
Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
<== Hier wird irgendwas mit dem Ausgelesenen Wert des STeuerregisters gemacht keine ahnung was!
outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters
<== Hier wird versucht auf das Steuerregister zu schreiben. Ich weiß jetzt auch nicht so genau ob das Status Register Bidirektional Arbeitet oder nicht! D.H. es kann sein es können daten nur gelesen werden.
Da ich aber noch nie etwas mit den "normalen" outp bzw. inp funktionen zu tun hatte, weiß ich aber auch nicht so genau wie diese arbeiten. Nachschauen ist gerade schwer, weil ich erst meinen PC platt gemacht habe.
Bei der von mir verwendeten inpout32.dll von dem oben genannten link musste ich im aber um Daten am Dataregister auszugeben folgenden befehl verwenden.
outp32(0x378, 0xFF)
^ ^ ^
| | |
| | Hier wird das Data-Register (D0-D7) auf 1 gesetzt!
| Angabe der Druckerport Adresse des Daten-Registers
outp32 befehl
Ich weiß ja nicht aber vielleicht ist der aufbau des "normalen" outp befehls ja genau so wie beim outp32.
Naja ich weiß ja nicht ob das gerade weitergeholfen hat.
gruß Marc
doch danke.
aber das program läuft es ist nur dummer weise eine konsolen anwendung
wenn ich jetzt aber mit edit, button und co arbeiten möchte (nicht in einer konsolen anwendung), was muss ich dann machen
kannst du mir da weiter helfen
ist das outp32(0x378, "Bytezahl") auch für eine konsolen anwendung???
Jup, gut daß ich dir Helfen konnte!
Ja klar kann man den inp32/outp32 befehl auch in einer konsolen anwendung verwenden. So wird es auch in dem beispiel programm erklärt.
Ich habe mir dann daraus ein kleines Tool erstellt mit dem ich die 8 Datenleitungen über eine grafische oberfläche ansteuern kann erstellt. Dazu kommen ein paar Lauflichteffekte in verschiedenen unter modis!
Bild im anhang!
Da aber die Konsolenprogrammierung ein wenig von der der grafischen Oberfläche abweicht kann man das Programm nicht einfach übernehmen.
Aber hier als beispiel:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Project1.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define port 0x378
int y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1(TObject *Sender)
{
if (y == 0) { y = y + 0x01; goto end;}
if (y == 1) { y = y + 0x02; goto end;}
if (y == 3) { y = y + 0x04; goto end;}
if (y == 7) { y = y + 0x08; goto end;}
if (y == 15) { y = y + 0x10; goto end;}
if (y == 31) { y = y + 0x20; goto end;}
if (y == 63) { y = y + 0x40; goto end;}
if (y == 127) { y = y + 0x80; goto end;}
if (y == 255) { y = y - 0x01; goto end;}
if (y == 254) { y = y - 0x02; goto end;}
if (y == 252) { y = y - 0x04; goto end;}
if (y == 24{ y = y - 0x08; goto end;}
if (y == 240) { y = y - 0x10; goto end;}
if (y == 224) { y = y - 0x20; goto end;}
if (y == 192) { y = y - 0x40; goto end;}
if (y == 12{ y = y - 0x80; goto end;}
end:
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2(TObject *Sender)
{
(oup32)(port, y);
Label1->Caption = "0x" + IntToHex( y, 2);
Label2->Caption = y;
}
//---------------------------------------------------------------------------
Für dieses Beispiel benötigst du einen Button, zwei Timer und zwei Labels. Der Quelltext ist eine vereinfachte form von dem was ich in dem LED Programm verwendet habe.
Lesezeichen