Article View: be.comp.programming
Article #16549Please help ME, met het vertalen van QBasic Subs naar Turbo C++
From: Hermy
Date: Fri, 28 Apr 2000 00:00
Date: Fri, 28 Apr 2000 00:00
502 lines
10238 bytes
10238 bytes
Kan er iemand mij helpen met dit probleem ???
gelieve te mailen naar hermy@netwerkdagen.com.
Dit is het probleem, ik heb een Velleman K8005 component aan men K8000
gekoppeld. wat eigenlijk belangrijk is, is dat deze K8000 op I2C protocol
gestuurd word via de printerport, maar de slimmen onder u zullen dit al wel
opgemerkt hebben ;-PP
ik heb bij deze K8005 dus geen C++ header files gekregen, dus moest ik op
eigen houtje alles van Qbasic("waar de headers dus wel voor bij waren")
vertalen naar C++. Zoals je wel kan zien heb ik de vertaalde Qbasic
listing in quotes gezet zodanig dat het makkelijk te vergelijken is.
dit is tot zover toch vrij aardig gelukt, maar toch werkt dit niet :((
NB: de Qbasic headers werken dus wel.
wie de moed heeft hiertoe heeft om dit even na te kijken zou ik eeuwig
dankbaar zijn ;-) het is namelijk voor men eindwerk, maar aangezien het
einde nabij komt is dit toch wel van cruciaal belang ;-)
Wie ook over deze K8000 en K8005 beschikt, kan dus rechtstreeks de listing
onderaan in zen turbo c++ editor pasten en ff checke, het is dus echt wel
een kleinigheid, ik denk gewoon een verkeerd woord dat naar de K8000
gestuurd word, maar ik kan het echt niet vinden. Voor meer info, mailen naar
'zie boven'.
Thankx anyhow ;-)
Hermy.
/*LISTING*/
#include <conio.h>
#include <string.h>
#include <iostream.h>
enum printerport {LPT0,LPT1,LPT2};
const int MaxMotorCards = 15;
int motorcardcode[MaxMotorCards],
MotorCardData[MaxMotorCards];
int StatusPort,
ControlPort,
I2cBusDelay,
Overwrite,
WaitTime,
I2CWaitTime = 2000;
void SelectI2CprinterPort(int Printer_no);
void I2CBusNotBusy(void);
void I2CInit(void);
void I2Cstart(void);
int I2Cinput(void);
void I2Coutput(int SerData);
void I2Cclockpulse(void);
void I2Cstop(void);
int SHL(int Dec,int positions);
void DecToBin(int DecNumber, char *Bin);
void SendStepCW(int MotorNo,int Time,int Steps);
void SendMotor(int MotorNo,int Commando,int Time,int Steps);
void ReadMotor(int CardNo);
void ReadAllmotors(void);
void main(void)
{
clrscr();
I2CInit();
SendStepCW(0,50,100);
}
/*
SUB SendstepCW (MotorNo, TIME, Steps)
Temp = MotorNo
Temp1 = TIME
Temp2 = Steps
IF Steps = 0 THEN SendMotor Temp, 199, Temp1, Temp2 ELSE SendMotor Temp,
198, Temp1, Temp2
END SUB*/
void SendStepCW(int MotorNo,int Time,int Steps)
{
if(Steps==0)
SendMotor(MotorNo,199,Time,Steps);
else SendMotor(MotorNo,198,Time,Steps);
}
/*
' OUTPUT SUBROUTINES FOR ONE CARD
SUB SendMotor (MotorNo, Commando, TIME, Steps)
IF Overwrite = 0 THEN
MotorCardData(MotorNo) = 55
WHILE (MotorCardData(MotorNo) <> 1) AND (MotorCardData(MotorNo) <> 255)
ReadMotor (MotorNo)
WEND
END IF
FOR T = 1 TO I2CWaitTime: NEXT T
I2Cstart
Temp = motorcardcode(MotorNo)
I2Coutput Temp
I2Cclockpulse
Temp = Commando
I2Coutput Temp
I2Cclockpulse
Temp = TIME
I2Coutput Temp
I2Cclockpulse
Temp = (Steps - (Steps MOD 255)) / 255
I2Coutput Temp
I2Cclockpulse
Temp = Steps MOD 255
I2Coutput Temp
I2Cclockpulse
I2Cstop
END SUB*/
void SendMotor(int MotorNo,int Commando,int Time,int Steps)
{
int counter;
if(Overwrite==0)
{
MotorCardData[MotorNo] = 55;
while(MotorCardData[MotorNo]!=1 && MotorCardData[MotorNo] != 255)
ReadMotor (MotorNo);
}
for(counter=1;counter<=I2CWaitTime;counter++);
I2Cstart();
I2Coutput(motorcardcode[MotorNo]);
I2Cclockpulse();
I2Coutput(Commando);
I2Cclockpulse();
I2Coutput(Time);
I2Cclockpulse();
I2Coutput((Steps - (Steps % 255)) / 255);
I2Cclockpulse();
I2Coutput(Steps % 255);
I2Cclockpulse();
I2Cstop();
}
/*
SUB I2CInit
SelectI2cPrinterPort 1
I2cBusDelay = 20
I2CBusNotBusy
Overwrite = 0
WaitTime = 300
ReadAllmotors
END SUB
*/
void I2CInit(void)
{
int CardNo;
SelectI2CprinterPort(LPT1);
// ----INITIALIZE----
for(CardNo=0;CardNo<=MaxMotorCards;CardNo++)
motorcardcode[CardNo] = 192 + (2 * CardNo);
// ----INITIALIZE----
I2cBusDelay = 20;
I2CBusNotBusy();
Overwrite = 0 ;
WaitTime = 300;
ReadAllmotors();
}
/*' I2C COMMUNICATION SUBROUTINES
SUB SelectI2cPrinterPort (PrinterNo)
SELECT CASE PrinterNo
CASE 0
Statusport = 957
ControlPort = 958
CASE 1
Statusport = 889
ControlPort = 890
CASE 2
StatusPost = 633
ControlPort = 634
END SELECT
END SUB
*/
void SelectI2CprinterPort(int Printer_no)
{
switch (Printer_no) {
case LPT0: /*lpt on monochroom display adapter*/
StatusPort = 0x03BD;
ControlPort = 0x03BE;
break;
case LPT1: /*lpt1 on mainboard*/
StatusPort = 0x0379;
ControlPort = 0x037A;
break;
case LPT2: /*lpt2 on mainboard*/
StatusPort = 0x0279;
ControlPort = 0x027A;
break;
};
};
/*
SUB ReadMotor (CardNo)
FOR TIME = 1 TO I2CWaitTime: NEXT TIME
I2Cstart
DataVar = motorcardcode(CardNo) OR 1
I2Coutput DataVar
I2Cclockpulse
MotorCardData(CardNo) = I2Cinput
I2Cclockpulse
I2Cstop
END SUB*/
void ReadMotor(int CardNo)
{
int DataVar,
time,
i;
for(time=1;time<=I2CWaitTime;time++);
I2Cstart();
DataVar = motorcardcode[CardNo] | 1 ;
I2Coutput (DataVar);
I2Cclockpulse();
MotorCardData[CardNo] = I2Cinput ();
I2Cclockpulse();
I2Cstop();
}
/*
SUB I2Cstart
FOR i = 0 TO I2cBusDelay
NEXT
OUT ControlPort, 6
FOR i = 0 TO I2cBusDelay
NEXT
OUT ControlPort, 14
FOR i = 0 TO I2cBusDelay
NEXT
END SUB*/
void I2Cstart(void)
{
int i;
for(i=0;i<=I2cBusDelay;i++);
outportb(ControlPort,6);
for(i=0;i<=I2cBusDelay;i++);
outportb(ControlPort,14);
for(i=0;i<=I2cBusDelay;i++);
}
/*
SUB I2Coutput (SerData)
Temp = SerData
Serdat$ = DecToBin(Temp)
FOR j = 1 TO 8
IF MID$(Serdat$, j, 1) = "1" THEN
DataOut = 12
ELSE
DataOut = 14
END IF
OUT ControlPort, DataOut
FOR i = 0 TO I2cBusDelay
NEXT
DataOut = INP(ControlPort) AND 7
OUT ControlPort, DataOut
FOR i = 0 TO I2cBusDelay
NEXT
DataOut = INP(ControlPort) OR 8
OUT ControlPort, DataOut
FOR i = 0 TO I2cBusDelay
NEXT
NEXT
END SUB*/
void I2Coutput(int SerData)
{
int DataOut,
temp = SerData,
i,
j;
char Serdat [8];
DecToBin (temp, Serdat);
for(j=0;j<=8;j++)
{
if (Serdat[j] == 1)
DataOut = 12;
else
DataOut = 14;
outportb(ControlPort,DataOut);
for(i=0;i<=I2cBusDelay;i++);
DataOut = inportb(ControlPort) | 8 ;
outportb(ControlPort,DataOut);
for(i=0;i<=I2cBusDelay;i++);
}
}
/*
SUB I2Cclockpulse
OUT ControlPort, 12
FOR i = 0 TO I2cBusDelay
NEXT
OUT ControlPort, 4
FOR i = 0 TO I2cBusDelay
NEXT
OUT ControlPort, 12
FOR i = 0 TO I2cBusDelay
NEXT
END SUB
*/
void I2Cclockpulse(void)
{
int i;
outportb(ControlPort,12);
for (i=0;i<=I2cBusDelay;i++);
outportb(ControlPort,4);
for (i=0;i<=I2cBusDelay;i++);
outportb(ControlPort,12);
for (i=0;i<=I2cBusDelay;i++);
}
/*
SUB I2Cstop
REM OUT ControlPort, 14 ???????
FOR i = 0 TO I2cBusDelay
NEXT
REM OUT ControlPort, 6 ???????
FOR i = 0 TO I2cBusDelay
NEXT
OUT ControlPort, 4
FOR i = 0 TO I2cBusDelay
NEXT
END SUB*/
void I2Cstop(void)
{
int i;
outportb(ControlPort,14);
for(i=0;i<=I2cBusDelay;i++);
outportb(ControlPort,6);
for(i=0;i<=I2cBusDelay;i++);
outportb(ControlPort,6);
for(i=0;i<=I2cBusDelay;i++);
}
/*
SUB ReadAllmotors
FOR counter = 0 TO MaxMotorCards
ReadMotor counter
NEXT
END SUB
*/
void ReadAllmotors(void)
{
int counter;
for(counter=0;counter<=MaxMotorCards;counter++)
ReadMotor(counter);
}
/*
FUNCTION I2Cinput
SerData = 0
FOR j = 1 TO 8
SerData = SHL(SerData, 1)
OUT ControlPort, 4
FOR i = 0 TO I2cBusDelay
NEXT
Inputdata = INP(Statusport) AND 16
IF Inputdata <> 0 THEN
SerData = SerData OR 1
END IF
OUT ControlPort, 12
FOR i = 0 TO I2cBusDelay
NEXT
NEXT
I2Cinput = SerData
END FUNCTION
*/
int I2Cinput(void)
{
int SerData = 0,
Inputdata,
i,
j;
for(j=0;j<=8;j++)
{
SerData = SHL(SerData,1);
for(i=0;i<=I2cBusDelay;i++);
Inputdata = inportb(StatusPort) & 16;
if(Inputdata!=NULL)
SerData = SerData | 1 ;
outportb(ControlPort,12);
for(i=0;i<=I2cBusDelay;i++);
}
return SerData;
}
/*
FUNCTION DecToBin$ (DecNumber)
Bin$ = ""
faktor = 128
IF DecNumber <> 0 THEN
FOR i = 1 TO 8
IF faktor > DecNumber THEN
Bin$ = Bin$ + "0"
ELSE
Bin$ = Bin$ + "1"
DecNumber = DecNumber - faktor
END IF
faktor = faktor \ 2
NEXT
DecToBin$ = Bin$
ELSE
DecToBin$ = "00000000"
END IF
END FUNCTION
*/
void DecToBin(int DecNumber, char *Bin)
{
int i;
char *one = "1", *zero = "0";
DecNumber <<= 8; /*Shift dec. number 8 bits left*/
if (DecNumber < 0)
strcpy(Bin, one);
else
strcpy(Bin, zero);
DecNumber <<= 1;
for (i=1; i<8; i++) {
if (DecNumber < 0) /*Write highest bit into bin string*/
strcat(Bin, one);
else
strcat(Bin, zero);
DecNumber <<= 1; /*Shift decimal number 1 bit left*/
};
};
/*
FUNCTION SHL (Dec, Positions)
Temp$ = RIGHT$(DecToBin(Dec) + STRING$(Positions, "0"), 8)
SHL = BinToDec(Temp$)
END FUNCTION*/
int SHL(int Dec,int positions)
{
int returnvalue;
Dec << positions;
return Dec;
}
/*
SUB I2CBusNotBusy
OUT ControlPort, 4
END SUB
*/
void I2CBusNotBusy(void)
{
outportb(ControlPort,4);
}
Technical Details
Message-ID:
<lxkO4.44087$uF1.84732@afrodite.telenet-ops.be>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,9e327517dfcfd35c,start X-Google-Attributes: gidfcea4,public From: "Hermy" <hermy@pi.be> Subject: Please help ME, met het vertalen van QBasic Subs naar Turbo C++ Date: 2000/04/28 Message-ID: <lxkO4.44087$uF1.84732@afrodite.telenet-ops.be> X-Deja-AN: 616876378 X-Priority: 3 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6600 X-Complaints-To: abuse@pandora.be X-Trace: afrodite.telenet-ops.be 956945617 212.123.21.243 (Fri, 28 Apr 2000 20:13:37 MET DST) Organization: Pandora-- Met vlotte tred op Internet X-MSMail-Priority: Normal NNTP-Posting-Date: Fri, 28 Apr 2000 20:13:37 MET DST Newsgroups: be.comp.programming