473,321 Members | 1,748 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,321 software developers and data experts.

High Speed IRQ Timer/Clock in C

I found this excellent High Speed Timer (in Pascal). I compiled it
(using Turbo Pascal 7 and it runs fine):

http://www.sorucevap.com/bilisimtekn...ers.asp?207995
and same High Speed Timer here too:
http://groups.google.com/group/comp....7ff3cf587648ef

I converted it to C (using p2c), compiled it using Borland C++ 4.5 and
it runs. But it crashes when it gets to setvect(...) in TimerOn.

Does anyone know how IRQ programming works in C? If you know IRQ timer/
clock please contact me. I need urgent help in understanding why it's
not working.
Dec 27 '07 #1
8 3689
"Andrew Wan" <an*****@googlemail.comwrote in message
news:55**********************************@s8g2000p rg.googlegroups.com...
I found this excellent High Speed Timer (in Pascal). I compiled it
(using Turbo Pascal 7 and it runs fine):

http://www.sorucevap.com/bilisimtekn...ers.asp?207995

That isn't particularly good code or particularly high speed either. It is
not too diffucult with a standard PC to have timers with a resolution of
836ns, and have as many of them as you want as well.

--
Jay

Jason Burgon - author of Graphic Vision
http://homepage.ntlworld.com/gvision
Dec 27 '07 #2
And so we have a translated C code here:
#include "p2c.h"
#include "extra.h"

#define TIMER_G
#include "timer.h"

#define MaxRate 1193180L
void interrupt(__far *OldInt08)();//Static _PROCEDURE OldInt08,
OldInt1C;
void interrupt(__far *OldInt1C)();
Static unsigned short IntCount08, Trigger;
Static boolean TimerAlreadySet;
Static unsigned short Frequency;

void GetIntVec(int a, void interrupt(__far *b)())
{
b = getvect(a);
}

void SetIntVec(int a, void interrupt(__far *b)())
{
setvect(a, b);
}
Static Void IrqOn()
{
/* p2c: timer1.pas, line 37:
* Note: Inline assembly language encountered [254] */
asm{sti;}//asm(" inline $FB");
}
Static Void IrqOff()
{
/* p2c: timer1.pas, line 40:
* Note: Inline assembly language encountered [254] */
asm{cli;}//asm(" inline $FA");
}
/* p2c: timer1.pas, line 43: Note: Ignoring INTERRUPT keyword [258] */
/*$F+*/
void interrupt NewInt1C()//Static Void NewInt1C()
{printf("\nNewInt1C()");
ClockTicks++;
}
/* p2c: timer1.pas, line 50: Note: Ignoring INTERRUPT keyword [258] */
/*$F-*/

/*$F+*/
void interrupt NewInt08()//Static Void NewInt08()
{printf("\nNewInt08()");
IrqOff();
/* p2c: timer1.pas, line 53:
* Note: Inline assembly language encountered [254] */
asm{int 1Ch;}//asm(" inline $CD");
//asm(" inline $1C"); /*Generate INT 1Ch instruction to call
interrupt 1Ch*/
if (IntCount08 == Trigger) {
IntCount08 = 0;
/* p2c: timer1.pas, line 57:
* Note: Inline assembly language encountered [254] */
asm{pushf;}//asm(" inline $9C");
OldInt08();/*if (OldInt08.link != NULL)
(*(Void(*) PP((Anyptr _link)))OldInt08.proc)(OldInt08.link);
else
(*(Void(*) PV())OldInt08.proc)();*/
} else
IntCount08++;
outportb( 0x20, 0x20 );//PORT(0x20) = 0x20; /*Sends non-specific
EOI to the PIC*/
/* p2c: timer1.pas, line 64: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 64: Warning: Invalid assignment [168] */
IrqOn();
}
/*$F-*/

Void TimerOn(Freq)
long Freq;
{
LONGINT Temp = MaxRate;
unsigned short Count;
_PROCEDURE TEMP1;
printf("\nTimerOn()");
if (TimerAlreadySet)
return;
ClockTicks = 0;
IntCount08 = 0;
Frequency = Freq;
Trigger = (long)(Freq / 18.2);
Temp = (long)((double)Temp / Freq);
Count = Temp;
GetIntVec(0x8, OldInt08);
TEMP1.proc = (Anyptr)NewInt08;
TEMP1.link = (Anyptr)NULL;
/* p2c: timer1.pas, line 83:
* Warning: Symbol 'GETINTVEC' is not defined [221] */
SetIntVec(0x8, NewInt08);//SetIntVec(0x8, TEMP1);
/* p2c: timer1.pas, line 84:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
GetIntVec(0x1c, OldInt1C);
TEMP1.proc = (Anyptr)NewInt1C;
TEMP1.link = (Anyptr)NULL;
/* p2c: timer1.pas, line 85:
* Warning: Symbol 'GETINTVEC' is not defined [221] */
SetIntVec(0x1c, NewInt1C);//SetIntVec(0x1c, TEMP1);
/* p2c: timer1.pas, line 86:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
outportb( 0x43, 0xb6);
/* p2c: timer1.pas, line 87: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 87: Warning: Invalid assignment [168] */
outportb( 0x40, Count & 255);
/* p2c: timer1.pas, line 88: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 88: Warning: Invalid assignment [168] */
outportb( 0x40, Count >8);
/* p2c: timer1.pas, line 89: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 89: Warning: Invalid assignment [168] */
TimerAlreadySet = true;
}
Void TimerOff()
{printf("\nTimerOff()");
if (!TimerAlreadySet)
return;
outportb( 0x43, 0xb6);
/* p2c: timer1.pas, line 98: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 98: Warning: Invalid assignment [168] */
outportb( 0x40, 0xff);
/* p2c: timer1.pas, line 99: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 99: Warning: Invalid assignment [168] */
outportb( 0x40, 0xff);
/* p2c: timer1.pas, line 100: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 100: Warning: Invalid assignment [168] */
SetIntVec(0x8, OldInt08);
/* p2c: timer1.pas, line 101:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
SetIntVec(0x1c, OldInt1C);
/* p2c: timer1.pas, line 102:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
TimerAlreadySet = false;
}
Void ResetTimer()
{
ClockTicks = 0;
}
double TimeElapsed()
{
return ((double)ClockTicks / Frequency);
}
void _Timer_init()
{
static int _was_initialized = 0;
if (_was_initialized++)
return;
TimerAlreadySet = false;
}
/* p2c: Note: Remember to call _Timer_init() in main program [215] */

/* End. */

void main()
{
int i;
_Timer_init();

TimerOn(546);
for(i=0; i<100000; i++) {
if (i%10000==0)
printf("\n... %d", i);
}
TimerOff();

}
Dec 28 '07 #3

"Andrew Wan" <an*****@googlemail.comwrote in message
news:45**********************************@x69g2000 hsx.googlegroups.com...

Dropped comp.lang.c++, openwatcom.users.c_cpp NG's. Francis Glassborow
posted to
comp.lang.learn.c-c++,alt.lang.asm,alt.msdos.programmer,comp.os.msdo s.progra
mmer NG's, so you may get some responses on those too.

The code is very close to compiling for OpenWatcom. Mostly some incorrect
keywords, wrong location for keywords, and differently named environment
specific functions... You should replace the "Static", "boolean", "Void"
etc. with the correct text instead of using the #define's like I did below.
Many of the functions have K&R style void arg's, e.g., the () in "Static
Void IrqOn()". These should be reworked to "Static Void IrqOn(void)". You
should replace the C++ comments // with C comments /* */ or #if 0 #endif.
Once you get it compile, if it doesn't work as you expect, you can post to
openwatcom.users.c_cpp, alt.os.development, comp.os.msdos.programmer, etc.
for IRQ programming.
Rod Pemberton
And so we have a translated C code here:
#include "p2c.h"
#include "extra.h"
//#include "p2c.h"
//#include "extra.h"
#define TIMER_G
#include "timer.h"
//#include "timer.h"
>
#define MaxRate 1193180L
#if 1
#define Static static
#define boolean int
#define Void void
#define LONGINT long int
#define getvect _dos_getvect
#define setvect _dos_setvect
#if 0
#define asm _asm
#endif
#define outportb outp
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#define true 1
#define false 0
unsigned long ClockTicks;
#endif

>
void interrupt(__far *OldInt08)();//Static _PROCEDURE OldInt08,
OldInt1C;
//void interrupt(__far *OldInt08)();//Static _PROCEDURE OldInt08, OldInt1C;
void (__interrupt __far *OldInt08)();
void interrupt(__far *OldInt1C)();
//void interrupt(__far *OldInt1C)();
void (__interrupt __far *OldInt1C)();
Static unsigned short IntCount08, Trigger;
Static boolean TimerAlreadySet;
Static unsigned short Frequency;

void GetIntVec(int a, void interrupt(__far *b)())
//void GetIntVec(int a, void interrupt(__far *b)())
void GetIntVec(int a, void (__interrupt __far *b)())
{
b = getvect(a);
}

void SetIntVec(int a, void interrupt(__far *b)())
//void SetIntVec(int a, void interrupt(__far *b)())
void SetIntVec(int a, void (__interrupt __far *b)())
{
setvect(a, b);
}
Static Void IrqOn()
{
/* p2c: timer1.pas, line 37:
* Note: Inline assembly language encountered [254] */
asm{sti;}//asm(" inline $FB");
//asm{sti;}//asm(" inline $FB");
_asm{sti}
}
Static Void IrqOff()
{
/* p2c: timer1.pas, line 40:
* Note: Inline assembly language encountered [254] */
asm{cli;}//asm(" inline $FA");
//asm{cli;}//asm(" inline $FA");
_asm{cli}
}
/* p2c: timer1.pas, line 43: Note: Ignoring INTERRUPT keyword [258] */
/*$F+*/
void interrupt NewInt1C()//Static Void NewInt1C()
{printf("\nNewInt1C()");
ClockTicks++;
}
/* p2c: timer1.pas, line 50: Note: Ignoring INTERRUPT keyword [258] */
/*$F-*/

/*$F+*/
void interrupt NewInt08()//Static Void NewInt08()
{printf("\nNewInt08()");
IrqOff();
/* p2c: timer1.pas, line 53:
* Note: Inline assembly language encountered [254] */
asm{int 1Ch;}//asm(" inline $CD");
//asm{int 1Ch;}//asm(" inline $CD");
_asm{int 1Ch}
//asm(" inline $1C"); /*Generate INT 1Ch instruction to call
interrupt 1Ch*/
if (IntCount08 == Trigger) {
IntCount08 = 0;
/* p2c: timer1.pas, line 57:
* Note: Inline assembly language encountered [254] */
asm{pushf;}//asm(" inline $9C");
//asm{pushf;}//asm(" inline $9C");
_asm{pushf}
OldInt08();/*if (OldInt08.link != NULL)
(*(Void(*) PP((Anyptr _link)))OldInt08.proc)(OldInt08.link);
else
(*(Void(*) PV())OldInt08.proc)();*/
} else
IntCount08++;
outportb( 0x20, 0x20 );//PORT(0x20) = 0x20; /*Sends non-specific
EOI to the PIC*/
/* p2c: timer1.pas, line 64: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 64: Warning: Invalid assignment [168] */
IrqOn();
}
/*$F-*/

Void TimerOn(Freq)
long Freq;
{
LONGINT Temp = MaxRate;
unsigned short Count;
_PROCEDURE TEMP1;
// _PROCEDURE TEMP1;
printf("\nTimerOn()");
if (TimerAlreadySet)
return;
ClockTicks = 0;
IntCount08 = 0;
Frequency = Freq;
Trigger = (long)(Freq / 18.2);
Temp = (long)((double)Temp / Freq);
Count = Temp;
GetIntVec(0x8, OldInt08);
TEMP1.proc = (Anyptr)NewInt08;
TEMP1.link = (Anyptr)NULL;
//TEMP1.proc = (Anyptr)NewInt08;
//TEMP1.link = (Anyptr)NULL;
/* p2c: timer1.pas, line 83:
* Warning: Symbol 'GETINTVEC' is not defined [221] */
SetIntVec(0x8, NewInt08);//SetIntVec(0x8, TEMP1);
/* p2c: timer1.pas, line 84:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
GetIntVec(0x1c, OldInt1C);
TEMP1.proc = (Anyptr)NewInt1C;
TEMP1.link = (Anyptr)NULL;
//TEMP1.proc = (Anyptr)NewInt1C;
//TEMP1.link = (Anyptr)NULL;
/* p2c: timer1.pas, line 85:
* Warning: Symbol 'GETINTVEC' is not defined [221] */
SetIntVec(0x1c, NewInt1C);//SetIntVec(0x1c, TEMP1);
/* p2c: timer1.pas, line 86:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
outportb( 0x43, 0xb6);
/* p2c: timer1.pas, line 87: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 87: Warning: Invalid assignment [168] */
outportb( 0x40, Count & 255);
/* p2c: timer1.pas, line 88: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 88: Warning: Invalid assignment [168] */
outportb( 0x40, Count >8);
/* p2c: timer1.pas, line 89: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 89: Warning: Invalid assignment [168] */
TimerAlreadySet = true;
}
Void TimerOff()
{printf("\nTimerOff()");
if (!TimerAlreadySet)
return;
outportb( 0x43, 0xb6);
/* p2c: timer1.pas, line 98: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 98: Warning: Invalid assignment [168] */
outportb( 0x40, 0xff);
/* p2c: timer1.pas, line 99: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 99: Warning: Invalid assignment [168] */
outportb( 0x40, 0xff);
/* p2c: timer1.pas, line 100: Note: Reference to PORT [191] */
/* p2c: timer1.pas, line 100: Warning: Invalid assignment [168] */
SetIntVec(0x8, OldInt08);
/* p2c: timer1.pas, line 101:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
SetIntVec(0x1c, OldInt1C);
/* p2c: timer1.pas, line 102:
* Warning: Symbol 'SETINTVEC' is not defined [221] */
TimerAlreadySet = false;
}
Void ResetTimer()
{
ClockTicks = 0;
}
double TimeElapsed()
{
return ((double)ClockTicks / Frequency);
}
void _Timer_init()
{
static int _was_initialized = 0;
if (_was_initialized++)
return;
TimerAlreadySet = false;
}
/* p2c: Note: Remember to call _Timer_init() in main program [215] */

/* End. */

void main()
int main(void)
{
int i;
_Timer_init();

TimerOn(546);
for(i=0; i<100000; i++) {
if (i%10000==0)
printf("\n... %d", i);
}
TimerOff();
return(0);
}

Dec 28 '07 #4
Andrew Wan wrote:
>
And so we have a translated C code here:
#include "p2c.h"
#include "extra.h"

#define TIMER_G
#include "timer.h"
.... snip ...

And what does this have to do with the C language?

--
Merry Christmas, Happy Hanukah, Happy New Year
Joyeux Noel, Bonne Annee, Frohe Weihnachten
Chuck F (cbfalconer at maineline dot net)
<http://cbfalconer.home.att.net>

--
Posted via a free Usenet account from http://www.teranews.com

Dec 28 '07 #5
On 2007-12-28, CBFalconer <cb********@yahoo.comwrote:
Andrew Wan wrote:
>>
And so we have a translated C code here:
#include "p2c.h"
#include "extra.h"

#define TIMER_G
#include "timer.h"
... snip ...

And what does this have to do with the C language?
1. Dunno, but neither does it with Pascal language.
2. The OP didn't suffix "-language". That's yours.
Dec 28 '07 #6
On Dec 28 2007, 11:30 pm, Marco van de Voort <mar...@stack.nlwrote:
On 2007-12-28, CBFalconer <cbfalco...@yahoo.comwrote:
Andrew Wan wrote:
And so we have a translated C code here:
#include "p2c.h"
#include "extra.h"
#define TIMER_G
#include "timer.h"
... snip ...
And what does this have to do with the C language?

1. Dunno, but neither does it with Pascal language.
2. The OP didn't suffix "-language". That's yours.
Rod, thanks for converting the code for OpenWatcom. It compiles fine
under Borland C++ 4.5 and Turbo C 3.0. I posted it to both Pascal & C
newsgroups for help in understanding both low level Pascal & C
language.

I found the closest Turbo C DOS timer source code written by David
Oshinsky at:

http://www.bookcase.com/library/soft...-<br /> c.html (TIMERTST)

To get my own timer (original Pascal port) I had to comment out
asm{ int 1Ch;} & asm{pushf;} in NewInt08() function. Also I had to
omit all debugging printfs in the interrupt functions. Afterwards my
program doesn't crash anymore.

What am wondering is:

1. In Pascal version it uses inline($CD / $1C); & inline($9C); before
the OldInt08() call. I though I could call the equivalent asm{ int
1Ch;} & asm{pushf;} but I guess this was wrong since it crashed my
program. Is there an inline assembly call in C?

2. David's initializing the timer code uses
Expand|Select|Wrap|Line Numbers
  1. /* Set up 8259 PIC chip to allow INT0 interrupt. */
  2. outportb(0x21, inportb(0x21) & 0xfe);
  3.  
  4. /* issue command to 8253:  counter 0, binary counter, rate generator
  5. */
  6. /* (mode 2), load least significant byte of counter followed by
  7. */
  8. /* most significant byte                         */
  9. outportb(0x43, 0x34);
  10.  
  11. /* Timer is set for 0x4cd * 813.8 ns = 1 ms (LSB followed by MSB). */
  12. outportb(0x40, 0xcd); /* least significant byte of timer count */
  13. outportb(0x40, 0x04); /* most significant byte of timer count  */
  14.  
But mine uses
Expand|Select|Wrap|Line Numbers
  1. outportb( 0x43, 0xb6);
  2. outportb( 0x40, Count & 255);
  3. outportb( 0x40, Count >8);
  4.  
What is the difference? Even though both works.

3. Same goes for the clean up code:
His is:
Expand|Select|Wrap|Line Numbers
  1. /* restore 8253 to original state set during PC boot  */
  2. /* NOTE:  this program leaves 8259 mask register with */
  3. /* least significant bit clear (i.e., INT0 enabled).  */
  4. outportb(0x43, 0x34);
  5. outportb(0x40, 0);
  6. outportb(0x40, 0);
  7.  
Mine is:
Expand|Select|Wrap|Line Numbers
  1. outportb( 0x43, 0xb6);
  2. outportb( 0x40, 0xff);
  3. outportb( 0x40, 0xff);
  4.  
Again both works but I don't understand why different?
Jan 16 '08 #7
On 2008-01-16, Andrew Wan <an*****@googlemail.comwrote:
>
What am wondering is:

1. In Pascal version it uses inline($CD / $1C); & inline($9C); before
the OldInt08() call. I though I could call the equivalent asm{ int
1Ch;} & asm{pushf;} but I guess this was wrong since it crashed my
program. Is there an inline assembly call in C?
TP has support for interrupt routines, that end with "Retf" instead of
"Ret". It could be that the C compiler did it differently, or somehow reacts
more badly to the stack modification.

Jan 16 '08 #8
Marco van de Voort wrote:
Andrew Wan <an*****@googlemail.comwrote:
>What am wondering is:

1. In Pascal version it uses inline($CD / $1C); & inline($9C);
before the OldInt08() call. I though I could call the equivalent
asm{int 1Ch;} & asm{pushf;} but I guess this was wrong since it
crashed my program. Is there an inline assembly call in C?

TP has support for interrupt routines, that end with "Retf"
instead of "Ret". It could be that the C compiler did it
differently, or somehow reacts more badly to the stack
modification.
In the x86 an interrupt 1) pushes the flags. 2) disables further
interrupts 3) performs a call. 1 and 2 are not performed by an
ordinary call. Therefore the return instruction has to be
different, to reverse effects 1 and 2. That is done by the retf
instruction.

This has nothing to do with C, but handles the characteristics of
the hardware. Thus it is OT here on c.l.c. It also has nothing to
do with Pascal. Some group with 'asm' in its name is probably
suitable.

--
[mail]: Chuck F (cbfalconer at maineline dot net)
[page]: <http://cbfalconer.home.att.net>
Try the download section.

--
Posted via a free Usenet account from http://www.teranews.com

Jan 17 '08 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: engsolnom | last post by:
Knowing absolutely zero about benchmarks, I was interested in the posting referencing the paper by Dr. Cowell-Shah. I was curious how long Python takes just to read and display time.clock(), soI...
7
by: Paul Brown | last post by:
I am confused - I have gone through a two day exercise tuning up an FFT routine, and at the last stage I find that where the biggest gains were expected, all my conventional understanding of...
8
by: theinvisibleGhost | last post by:
I think I've found a bug in the timer control. I've got a class which uses a timer control. It imports it from System.Windows.Forms This timer ticks once a second, and then updates a label...
9
by: HL | last post by:
I am using VS 2005 Beta - C# Problem: The Timer fires a few milliseconds before the actual Due-Time Let's say a timer is created in the following manner: System.Threading.Timer m_timer = null;...
7
by: Mike Eaton | last post by:
Hi All, I have a simple application that allows users to clock in and out and stores the data for use by the payroll department. It spends most of its life as a tray icon and when the user...
45
by: charles.lobo | last post by:
Hi, I have recently begun using templates in C++ and have found it to be quite useful. However, hearing stories of code bloat and assorted problems I decided to write a couple of small programs...
4
by: Bails | last post by:
Hi Im an absolute beginner in programming and am using VB.Net Express. To start my larning I decided to do a "Real World" app instead of "hello world" and am creating a Poker Countdown clock. ...
19
by: Jon Slaughter | last post by:
Is it possible to have a synchronous thread... actually a timer that is beyond the 1khz/1ms resolution that .NET offers? I want to poll the parallel port at rates beyond 1khz... about 10 to 100...
7
by: Andrew Wan | last post by:
I found this excellent High Speed Timer (in Pascal). I compiled it (using Turbo Pascal 7 and it runs fine): http://www.sorucevap.com/bilisimteknolojisi/programcilik/pascal/ders.asp?207995 and...
2
by: =?GB2312?B?zPC5zw==?= | last post by:
2008/10/29 James Mills <prologic@shortcircuit.net.au>: Well, whatelse can I use? ShenLei
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.