
      Frequently Asked Questions About PIC84PGM.ZIP With Some Answers 
      ===============================================================
      (Original 11th March 95)                    V-0.1 16th March 95

                              David Tait

                      Electrical Engineering Dept
                            The University
                           Manchester M13 9PL
                                  UK

                         david.tait@man.ac.uk
            

                     Copyright (C) 1995 David Tait
   Permission is granted to copy, store or redistribute this document.


Introduction
------------

PIC84PGM.ZIP (available from ftp.ee.ualberta.ca/pub/cookbook/comp/ibm,
Microchip's BBS in the 3RDPARTY library, and elsewhere) contains a
crude ASCII schematic for a simple PIC16C84 programmer designed to be
attached to the parallel port of a PC. It also includes the source
code for some rudimentary C and QBasic drivers for the hardware.  In
case you don't know, the PIC16C84 is a single chip microcontroller
which fits a lot of good things into a small (18-pin) package; in fact
it is a developers dream come true.  It's fast, moderately cheap, and
best of all it's program is stored in EEPROM.  This last feature makes
it especially convenient in the development stages of a project; it
even has cheaper one-time programmable (OTP) cousins for use in a
final product.  Another useful attribute of the 16C84 is that it can
be programmed with only a few signals (called serial mode programming)
and what's more, the required signals have very lax timing specs.  As
a considerable bonus, the manufacturer, Microchip Technology Inc,
provide free PIC development software via their BBS or Internet site.
You can also grab useful software and information from the Internet
site of Parallax Inc, a company that supports the PIC series.  It is
true that both these companies also sell some reasonably priced
prototype programmers, but if you want a dedicated 16C84 programmer,
the DIY route is quite attractive.

When I looked about a year ago I couldn't find anything to help me
build a programmer so I just got the required info from Microchip and
did it myself; it was not very difficult (I had to have a couple of
goes at getting the hardware right though).  I decided to make my info
available on the net just in case it helped anyone about to re-invent
this particular "wheel".  It turns out I didn't explain things as
comprehensively as I should have done and the legacy of this project
has been a steady stream of e-mail that has to be answered.  It seems
that many people from all over the world are just discovering the
delights of the 16C84 and would like a cheap and cheerful development
system to go with it.  Helped no doubt by the very useful PIC FAQ
produced by Tom Kellett et al, these same people get to hear about my
humble efforts.  I guess most people that grab the files just take the
good bits (if indeed there are any) and get on with designing their
own superior versions.  It's likely I'll never hear from this group at
all.  I suspect this group own oscilloscopes.  On the the other hand
there are some people that assume that my design can replicated
exactly and will work from the first moment they apply power, and
though this will be true for a lucky few, on the whole this group run
into some kind of hardware/software problems.  Needless to say this
group are unlikely to own oscilloscopes and I certainly do hear from
them.  I try hard to help, but faultfinding by e-mail is a frustrating
experience at best.  I feel responsible for their disappointment and
frustration.  All is not lost though; there are some common stumbling
blocks that account for most of the problems that can crop up.  The
purpose of these notes is just to describe the potential gremlins and
their cures, and to answer one or two other questions that I'm often
asked.  I'm sorry this file is so long and rambling, but I hope that
if I answer everything now as fully as possible, I might get a rest
from answering the same questions multiple times by e-mail.

Some answers refer to my programs for reading a PIC.  The software is
supplied as both C (rp.c) and QBasic (rp.bas) source and should be
available where you picked up this document or even packaged with it.
The software is only designed to read program memory but it's really
very easy to modify it to read other areas of the 16C84 memory.  See
the source comments for details on how to run the programs.



Hardware Questions
------------------

Q1. Has _anybody_ got this to work?

A1. Yes.  At least 40-50 people have been kind enough to send me mail
to say they got it working themselves.  I've lost count of the number
people I have tried to help by e-mail.  I suspect that a great many
others have got it to work too, but they have not got in touch for one
reason or another.  Ask any shareware writer about the likely ratio of
registered users to total users and then remember my stuff is free, so
there is not much incentive to get in touch. (Unless there is a
problem that is, which is the motivation behind this document in the
first place.)  As I write this, I see that the file has been
downloaded well over a thousand times from the Microchip BBS alone.


Q2. Your drawing shows devices marked 74xx07 and 74xx06.  I can't find
them in any catalogue, where can I get them?

A2. I just meant any TTL open-collector (O/C) buffer like the plain
7407 or 7406, or better still if you can get them, the 74LS07 or the
74LS06.  Similar members of the 74HC family are probably OK if such
things exist.  One of my programmers uses a 74LS05 which is really out
of spec in this circuit, but seems to work fine.  I didn't think the
choice of buffer was critical, but a few reports have made me think
again about using the plain 7406 or 7407.  I understand that another
popular 16C84 programmer design uses a 74C906, and this slightly more
modern device may have been a better choice for my programmer too.  If
you want to try one, please note that it is not a drop-in replacement
for a 7406.  It seems you can be even more adventurous about replacing
the buffer: one person told me that he couldn't find a suitable chip
in his junkbox so he replaced the buffers with 5 VMOS FETs and they
worked a treat.  I suppose it is even possible to connect the PIC
directly to the parallel port and do away with the buffers altogether.
Though this needs a little trickiness because RB7 is read/write.
Anyway, I wouldn't recommend this, but I know it can be done.  For the
real minimalist, do this and replace the electronic switches with
manual ones and get the program to prompt you to operate them at the
correct times!


Q3. Your diagram implies that either inverting or non-inverting buffers
can be used.  Surely they can't be interchangeable, or can they?

A3. Well not exactly.  This is something I should have mentioned in
the README but didn't.  You _can_ use either type of buffer but you
must make sure the software is changed accordingly.  As supplied, the
source and the EXE file assume inverting buffers are used (i.e. the
74xx06 type).  In fact as one of the 6 available buffers is not used I
actually missed an opportunity to make the hardware self configuring.
If I had connected the input of the spare buffer to an output pin of
the parallel port and the output of the buffer to an input pin the
software could have worked out itself whether the buffer inverted or
not.  Oh well.  You should refer to the software section if you
happened to select non-inverting buffers to build the circuit.


Q4.  It would make my life easier if you could supply me with a PCB
layout.  Do you have one?  What about a better diagram at least?

A4.  Recently one satisfied user promised to send me a layout so that
I could make it generally available.  I don't have it yet, but when I
do I'll ask the designer whether I can upload it to the circuit
cookbook site.  Actually it's not obvious that a PCB layout of the
circuit exactly as shown would be the most useful.  I mentioned in the
README file that the spare sections of the 4066 could be used to
isolate the RB6 and RB7 pins from the buffers.  Maybe it wasn't
obvious, but I meant that this would be a good way to implement an
in-system programming system.  You'll also need to arrange for MCLR to
be taken to +5V for the PIC to run - a diode to +5V is probably OK; in
fact someone sent me a diagram of exactly this setup so they obviously
got the message.  If you want to design your own PCB it shouldn't be
too much of a problem; the low complexity of this programmer is
ideally suited for use in evaluating the numerous demo versions of PCB
software that are in circulation.  I was quite impressed with a demo
of CIRCAD (no, not the program by the same name that's on the Simtel
sites).  As I write this, a copy can be snatched from
ftp://mobius.gmu.edu/pub/circad.  It has both PCB layout functions and
schematic capture so you can draw a better diagram yourself!  Recently
Don Mckenzie has posted info on the 3RDPARTY file area of the
Microchip BBS about a supply of PCBs for his own programmer design.
He doesn't have Internet access but you can reach him on the Microchip
BBS e-mail system where his user ID is simply don mckenzie.  I only
mention this here because he supplies his own improved version of my
QBasic software and he was kind enough to send me a free PCB :-) See
the PIC FAQ about connecting to the BBS if you want to get in touch
with him.


Q5. I have built your hardware exactly as shown and it doesn't work!
I have checked it a hundred times and it looks OK to me.  Are you
_sure_ the diagram is correct?

A5. Well, the fact that it doesn't work might not be due to the
programmer hardware alone and you should look at the answers to the
software questions too.  To answer the correctness question: the
diagram is correct as far as it goes.  My first programmer of this
type was more or less exactly as shown.  However it does suffer from
some sins of omission.  I should have made it clear that it is
necessary to add decoupling capacitors for the 4066 and the buffer.
The decoupling components are not shown in the diagram, but 100nF caps
should be connected between, and close to, the power pins of both
chips.  As one of my e-mail correspondents put it: if the person
building this circuit didn't know that they should add decoupling
caps, then they are going to have a terrible time getting their PIC
applications to work.  That made me feel good for a minute or so, then
I felt guilty again because I hadn't made the need for decoupling
explicit.  The circuit is deceptively simple, but it is not that easy
for an absolute beginner to go from my diagram to a working
programmer.  Not really a correction, but a couple of LEDs on VPP and
VDD, while not helping the circuit work any better, are at least
colourful and let you know that things are working.  By the way,
rather than just giving the board a visual check, I would urge you to
write a simple program to toggle the LPT output pins (D0-D3) and read
the input pin (-ACK) - QBasic is great for this.  If you don't have
any test equipment, use the spare buffer to drive an LED and use this
as a simple logic probe.  Getting the pins to change as expected will
go 99% of the way to solving your problems.
 

Q6.  Why 13.8V?

A6.  Initially I used a power supply intended for citizen's band or
amateur radio equipment (I have such a thing handy because I'm a radio
ham - G0JVY).  As much of this equipment is expected to be used
mobile, i.e. in a car or truck, the power supply is designed to
produce the typical voltage of a fully charged car battery - 13.8V
apparently.  You don't have to follow this slavishly; the spec is
something like VDD+4V (i.e. 9V) to 14V, but I'm reliably informed that
using too low a voltage can lead to unreliable programming.  A 3-pin
12V regulator, like a 7812, with a couple of silicon diodes from its
ground lead to ground gives a decent enough 13.2V when supplied with
16-18V from a unregulated wall adapter.  Following a suggestion made
on the net, I mentioned in the README that it's possible to get power
from a spare floppy disk lead.  After hearing a sad tale from someone
who tried this, I no longer think that's a good idea.


Q7.  Anything I should know about the cable between the PC and the
programmer?

A7.  Keep it short for one thing. There are some fast pulses
travelling along this connection and long runs of ribbon or multiway
cable terminated in a just a TTL input can mangle them.  I suppose
twisted pairs with separate earths and good terminations would be
best, but my own cable is nothing special and I have no problems.
Hopefully you will not either.  However, if the programmer seems to
fail with a verify error at location 0 (the typical indicator of
programmer malfunction), it is worth paying some attention to the
waveforms produced at RB6 and RB7 and the inputs of their associated
buffers.  Ideally you would use an oscilloscope to view them; perhaps
then you can see what might be done to improve them.  Resistive
terminations should be the order of the day, but if you are not proud,
don't own an oscilloscope, and are ready to accept a more empirical
approach: two small caps (10-50pF) one between RB6 and ground and one
between RB7 and ground are certainly worth a try.  This has been
suggested to me a couple of times.  One person mentioned that the
circuit worked with an oscilloscope connected to RB6 and RB7 but
failed to do so when the scope was not connected, so, being a clever
chap he simulated the two scope connections with 1M resistors in
parallel with 12pF and this solved his problem.
  

Q8. I have read the programming specs in data sheet DS30189C and your
design cannot possibly work.  If you had read them too you would have
seen that the max current from Vdd (+5V) is rated at 50mA.  Now, let
me point out that the R-on spec for a 4066 switch is 80 Ohms; perhaps
you are not aware of Ohms law, but it says that 0.05*80 = 4V will be
dropped across the switch leaving only 1V for the PIC!  What's more
the maximum possible R-on is much higher than 80 Ohms leaving even
less for the PIC.  What do you have to say to that?

A8. Thanks for the electronics lesson.  I can only plead ignorance
(though not of Ohms law!) because I designed the circuit based on the
information in DS30189A which is an earlier version of the data sheet
you quote.  There was no mention of such a high current rating in my
data sheet.  In fact, because my programmer _does_ work, it seems most
unlikely that a typical PIC needs anything like this much current.  I
have measured the voltage drop across the Vdd switch and it is
typically only a few tens of mV (though I must admit I've only tried
this with a few different PICs and 4066s).  I also have connected a
scope to Vdd during programming and I couldn't detect any short
glitches which might indicate large current demands for short amounts
of time.  If you are still worried about this, the 4066 switch can be
ditched in favour of a separate bipolar transistor switch.  Here is an
ASCII sketch of a suitable replacement:

                                            +5V
                                             +
                                      ___    |
                                  +--[___]---+
                                  |          |
                   |\      ___    |      B |/ E
           <D2>----| >o---[___]---+--------|     PNP
                   |/                      |\ C
                                             |
                                             +---+ Vdd 


The resistors can be 10K.  You should retain the 10K//100nF network
connected to Vdd.  Of course it makes sense to change the Vpp switch
too so that you don't need the 4066 at all (the Vpp switch should have
E connected to +13.8V and C connected to Vpp and be driven by the
buffer connected to D3).  If you have already built the hardware and
used a socket for the 4066, a neat idea is to put the transistor
switches on a DIL header and simply replace the 4066 with this.  The
software will need minor changes to account for the inverted operation
of the new switches.  In the programs you'll find definitions for
controlling the LPT pins for both types of buffer.  To get an inverted
signal just borrow the definitions for the opposite type.


Q9.  Your circuit has an error!  Have you forgotten to include a
pull-up resistor for the O/C buffer driving the ACK pin (pin 10)?

A9.  I think you are right.  However, I didn't forget to include one
because I thought that the ACK pin had an internal pull-up.  I don't
use ACK pull-ups on my own programmers and they seem to work.  Anyway,
it can do no harm, and probably some good, if you fit a 10K resistor
between the ACK pin and +5V.  Certainly this is something to try if
you are having trouble getting the programmer to work.
 

Q10.  Are there any other designs available, especially for other
members of the PIC family?  If not can your design be suitably
modified?  Where can I get more PIC info?

A10.  The 16C84 is particularly well served by DIY programmer designs
and there have been more universal designs published in several hobby
mags (see the PIC FAQ for some pointers).  The 16C5X family cannot be
programmed in serial mode, but I believe most, if not all the 16CXX
PICs could be programmed using some approximation of my hardware.
However, the programming pulses required are considerably different to
those produced by my software; they need to be more accurate for one
thing.  Although it's not an entirely trivial job, it is worth getting
the programming specs and having a go at writing your own programmer
software.  For more info on PICs I only need to give you one
suggestion: get the PIC FAQ.  The FAQ will tell you about the
Microchip BBS and Internet sites, the PICLIST mailing list, the
Parallax Internet site and lots more besides.  To get the PIC FAQ you
can use Andy Errington's Web page:

	http://www.lancs.ac.uk/people/cpaame/pic/pic.htm

It's links are growing daily and one should point at the latest copy
of the PIC FAQ.  By the way, Andy recommends the everyone interested
in PICs should equip themselves with a copy of Microchip's Embedded
Controller Handbook.


Q11.  How many programming cycles can I expect to get?

A11.  How long is a piece of string?  The expected range of
possibilities is very large.  You should be able to rewrite program
memory an absolute minimum of 100 times and typically a few hundred to
maybe a thousand times.  Data EEPROM can be reprogrammed many hundreds
of thousands of times I think.


Q12.  Can your hardware be used to read a code-protected 16C84?  Do
you know how to read a code-protected PIC?

A12.  I have heard speculation and rumour, nothing more.


Q13.  Can I use your programmer for in-system programming?

A13.  See A4 above for some hints.  Also see Microchip application
note AN589 by Robert Spur for another design.  Although the
application note gives the core routine for serial mode programming,
it needs a wrapper to use it as ready-to-go progamming software.
It's possible to use pp.c or pp.bas instead with just a few mods.


Q14.  You say in the comments of pp.c that your design is _not_ a
production quality programmer.  What is it then?

A14.  It's a prototype programmer.  These are terms used by Microchip.
The difference is based on the thoroughness of the verification
procedures used.  A production programmer not only verifies with Vdd
set at a nominal +5V, but it also does so at other values (typically
+4.5V and +5.5V).  It's no doubt possible to modify my programmer to
do this, but if you are going into production and programming many
PICs you probably owe it to your customers to invest in a more
upmarket programmer.


Q15.  Thanks for making your programmer design available and I am
very happy with it.  How can I thank you?

A15.  Spare a moment to let me know you got it working by sending an
e-mail message to david.tait@man.ac.uk (or to user ID david tait on
the Microchip BBS).  A postcard would be nice if you can't send
e-mail.  Anyway, if it has saved you a bit of time and effort I'll be
happy.



Software Questions
------------------

Q1.  Do I need a QBasic compiler to run the QBasic program?

A1.  No.  Just use the interpreter that comes with MS-DOS.  I wrote
the Qbasic stuff so that people without a C compiler could still hack
something.  I'm afraid I learnt QBasic from the on-line help in a
couple of days and it shows.


Q2.  I built your hardware design using a 7407.  I tried the EXE supplied
and it didn't work.  I tried the Qbasic program and it didn't work either.
What is wrong?

A2.  Try a 7406 instead!  The trouble is that both the C and QBasic
programs were set up for hardware employing inverting buffers like the
7406.  This means the EXE was built for 7406 based hardware too.  The
C program can be reconfigured for non-inverting buffers like the
7407 by including the line "#define U7407" (it is commented out in the
distributed version).  The Qbasic program can be set up for a 7407 by
using these definitions:

CONST DataInv = 0
CONST VppOn = 8, VppOff = 0, VddOn = 4, VddOff = 0
CONST ClkHi = 2, ClkLo = 0, OutHi = 1, OutLo = 0

The comments incorrectly suggest that you should use ClkHi = 4.  Surely
very few programs have bugs in the comments!


Q3.  I monitor the VDD and VPP supplies on my board with LEDs and I see
that one of the supplies is turned on after I reboot my machine.
Is it OK to insert the PIC into the programming socket despite this?

A3.  No.  Just run the software with the port number as the only
argument; the program will initialise the port and the supplies will
be switched off.

 
Q4.  I am using the C software and I know it is correctly configured
for my hardware but it still doesn't seem to work.  Whenever I try to
program a PIC I get an error message something like this:

  pp: 0000: YYYY != XXXX
  pp: Verify failed during programming

Nothing I do gets round this.  Can you help?

A4.  Reports from people getting this error message account for quite
a bit of the e-mail I receive about my programmer.  Unfortunately on
its own it is not a very helpful diagnostic.  The error simply means
that the programmer tried to program the very first location in
program memory to XXXX (hex) but read back YYYY.  To save programming
cycles the software doesn't try a second time.  (When things are
working properly all locations should program first time anyway.)  The
fact that it was the first location that failed is usually indicative
of some sort of programmer malfunction.  If verify errors occur at
other addresses it's just as likely to be caused by a PIC's EEPROM
becoming unreliable.  I suggest the real answer to your problem will
be found somewhere in the answers to the hardware questions.  However
when you've tried all the ideas from there, you might start to suspect
a timing problem.  In this case it's worth trying the QBasic software
to check your hardware - the QBasic interpreter runs slowly enough for
timing not to be a problem.  If the QBasic stuff works then change the
delay constants (THLD, TSET and TDLY) in the C source.  Compare pp.c
with the source of my PIC reader rp.c to see what changes I have made
for my own 486DX33.  The main idea is to ensure TDLY is about 1
microsecond, and THLD=TSET give the hardware enough time to respond.
In fact the constants I use in rp.c give very long delays, but as they
are still very small compared to the time taken to program a location
(about 10ms) they don't add much to the total time it takes to program the
device - there is really no need to spend time optimising the values.
If you are using my EXE file with a 486 then that may be the problem
in itself.  I suspect the version of Borland C I use has a bug in the
delay() routine (needed to get the 10ms programming delay) that only
manifests itself with some CPU types, though I haven't been able to pin
it down. Try recompiling, maybe the bug is fixed in your compiler.  If
you do recompile you can get stung by another problem: the latest C
compilers will optimise the tiny_delay() routine to nothing.  This
will only be a problem on a fast PC that must rely on this routine to
slow it down.  Again see rp.c for a fix to tiny_delay().  If all else
fails try running the PC at a slower clock speed if you can (some PCs
have a Turbo button for this).


Q5.  PP.EXE complains that the hardware is not attached when I know
it is.  I have specified the correct port but whatever I do it
refuses to work.  What am I doing wrong?

A5. If the hardware is built correctly then nothing.  It's likely you
have a pretty fast PC and/or "slow" hardware.  To check that the
hardware is connected, the program writes to it and reads back the
response immediately; it is possible that the hardware doesn't respond
in time.  See the changes to test_hw() in the source of the PIC reader
rp.c to see how you can cure this.


Q6.  I hate MS-DOS.  Will your programmer run under Linux?  I hate
MS-DOS boxes.  Will your programmer run on an Amiga/Macintosh/Atari?

A6.  The "prog84" package from Wim Lewis will let you use my hardware
under Linux; look for it on ftp://ftp.funet.fi/pub/microprocs/pic (in
the directory burners).  You should also get Ian King's software tools
from the same place (in the directory pictools).  These programs are
probably fairly portable across all PC versions of Unix.  For other
systems, the easiest thing might be for you to write your own
controller in your own favourite language.  My C program will need a
little work for non-MS-DOS machines, but provided you have a C
compiler, a computer with a parallel port, access to I/O routines for
the parallel port and finally a millisecond accuracy delay routine it
shouldn't be too difficult to get it going.  Ironically, having ported
the software from MS-DOS, you might find yourself using an MS-DOS
emulator in order to run a decent assembler/simulator.  I'm told that
using the unmodified C program with an MS-DOS emulator works on the
Amiga.


Q7.  I notice your program calls a routine named "erase" before it
attempts to program the PIC.  The routine uses the undocumented
commands 1 and 7.  What's going on?

A7. This is a routine to disable code protection so that a previously
protected chip can be reprogrammed.  It has the side-effect of bulk
erasing the chip, that is erasing all program and data memory.
Microchip recommend that this procedure is performed before any other
programming is attempted.  However, for some unexplained reason they
don't document the procedure for serial mode.  I just tried the
parallel mode approach and it seems to work.  Someone suggested that
this routine should only be selected if you are programming a
protected PIC thereby decreasing wear and tear on the fuse EEPROM
cells.  They may have a point.  See A11 for other mods of this kind.


Q8.  How do I produce a suitable file to initialise data EEPROM?

A8.  The programmer software takes a word (16-bits) of data from the
hex file and puts the least significant byte into the EEPROM data
memory.  A suitable hex file can be created with any assembler.  I
use MPASM and here's a short example that generates a valid INHX8M
data file:

        list p=16c84
;
        org 0
;
        data 1,2,3,0xFF
        data 'S,'t,'r,'i,'n,'g,'.
        end

Note the special handling of the text string because the software
ignores every second byte of data.


Q9.  Your programmer seems to work OK with files produced by MPASM
or MPALC.  However I prefer to use the mnemonics offered by the Parallax
assemblers.  Unfortunately your programmer software chokes on Parallax
hex files even though they are INHX8M compatible.  Can you fix that?

A9.  The problem (or perhaps advantage) with Parallax files is that
they embed FUSE, ID and EEPROM data into the same file and my software
doesn't expect that.  The best solution is to change the loadhex
function to understand these files.  Alternatively you can simply
ignore the non-program elements of the file by replacing this chunk of
loadhex:

      for ( i=0; i<nwords; ++i, ++address ) {
         if ( address >= bufsize )
            quit("Impossible address");
         w = hexword(fp);
         buf[address] = (hextype == INHX8M)? swab(w): w;
      }

with

      for ( i=0; i<nwords; ++i, ++address ) {
         w = hexword(fp);
         if ( address >= bufsize )
            continue;
         buf[address] = (hextype == INHX8M)? swab(w): w;
      }

Of course there is a similar workaround for the QBasic source; look for the
subroutine "LoadHex".  It contains a FOR-NEXT loop that in the
original looks like:

FOR i = 1 TO NWords
  IF Address >= BufSize THEN Quit ERRHEX, 0, 0, 0
  wHi = HexByte%(Chan)
  wLo = HexByte%(Chan)
  IF HexType = INHX8M THEN w = 256 * wLo + wHi ELSE w = 256 * wHi + wLo
  IF Which = ProgMem THEN ProgBuf(Address) = w ELSE DataBuf(Address) = w
  Address = Address + 1
NEXT i

Delete line 2 and bracket the "IF Which = ....." with another IF
statement to get this:

FOR i = 1 TO NWords
  wHi = HexByte%(Chan)
  wLo = HexByte%(Chan)
  IF HexType = INHX8M THEN w = 256 * wLo + wHi ELSE w = 256 * wHi + wLo
  IF Address < BufSize THEN
    IF Which = ProgMem THEN ProgBuf(Address) = w ELSE DataBuf(Address) = w
  ENDIF
  Address = Address + 1
NEXT i


Q10.  I have version 0.3 of your software.  Do you have you an updated
version?

A10.  No.  The existing version works for me and does everything I
need, so I doubt if I'll ever get round to producing a significantly
better version.  An important function that you might want is a
routine to read the PIC and so I have written a separate utility to do
that; it is also easy enough to verify a PIC by combining the PIC
reader functionality with the loadhex routine from the programmer
source.  The core parts of rp.c and rp.bas are tiny routines to
actually read the PIC and some routines to spit out INHX8M files;
the rest is much the same as pp.c and pp.bas.  If you _really_
wanted INHX16, check loadhex() for hints on the difference.


Q11.  The time to program the PIC seems independent of the number of
locations that must be programmed.  Why?

A11.  My software programs all locations every time.  It is easy to
change this behaviour.  One modification you might consider would be
to read the entire PIC (program/data/fuses) into a buffer and then
only reprogram the items that differ from the new values.  The
verify() and config() routines can be modified and combined to read
the entire PIC.


Q12.  I use the QBasic program and sometimes when I quit I get a blank
screen and the machine seems dead.  Can I fix that?

A12.  Yes.  If you type CLS the screen will come back to life.  Fix
the source by adding a CLS statement just before each occurrence of
the END statement (a couple of places).  You can also replace END
with SYSTEM for a more abrupt end.


Q13.  I use MPASM which amongst other things produces .obj files.  The
instructions for pp.c say it expects "objfiles" but when I try to use
the .obj files it complains.  Why?

A13.  You should use the .hex files produced by MPASM.  I know my name
is confusing, but it's because when I wrote the program I used the MPALC
naming convention.  MPASM produces INHX8M by default whereas MPALC
produced INHX16, so you might like to change the programmer defaults
if you use MPASM (or the Parallax assembler with the A9 fix).


Q14.  My PC makes a noise when I run your QBasic program.  Is anything
wrong?

A14.  No.  I use the Qbasic PLAY command to get a small delay and on
some PCs this can lead to a slight purr from the internal speaker.  If
you find it objectionable just replace the "PrgDly" routine with a
FOR-NEXT loop that wastes an amount of time of at least 10ms.


Q15.  Can I use your software from a DOS window under Windows?

A15.  Try it.  On my own PC the C version runs OK, but the QBasic
program seems to have problems; perhaps the way I time the programming
signals is being interfered with by Windows somehow.


Q16.  Is that all?

A16.  I hope so.
