🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #16549

Please help ME, met het vertalen van QBasic Subs naar Turbo C++

#16549
From: Hermy
Date: Fri, 28 Apr 2000 00:00
502 lines
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-mail

Show 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