[Oberon] PO2013 - Real time measurement
paulreed at paddedcell.com
Sat Mar 30 23:08:29 CET 2019
> Looking at a simplified PIC prog by NW, it feeds signals from
> std PC parallel port at 0..5V.
I assume Prof. Wirth originally used a PC-based Oberon system to do PIC
programming, but the PICL.Mod on his home page in the section "PICL: A
Programming Language for the Microcontroller PIC" assumes the PIC is
connected to the FPGA. He added the RISC5's general-purpose I/O port
with this in mind, I think.
I am not sure how he did the level conversion between 3.3V of the FPGA
and 5V. I am suggesting powering the PIC with 3.3V to avoid this
Anyway, in https://inf.ethz.ch/personal/wirth/PICL/Sources/PICL.Mod.txt,
procedure Reset(), he sets all gpio output registers to 0, and then sets
the GPIO control bits 0 and 1 to set these pins to output.
In procedure bits(), he sends serial data to the PIC, least significant
bit first, by setting the data bit value on GPIO bit 0 (connected to PIC
RB7), and then toggling the clock on bit 1 (connected to PIC RB6).
Wirth's PICL.Mod code does not control the programming voltage on the
MCLR pin of the PIC - I assume he did this with a manual switch.
But you could use GPIO bits 2 and 3 (setting them also to output) to
control MCLR and RB3 on the PIC16F81x and set these according to the
low-voltage programming entry sequence in section 2.4.1 on page 5 of the
PIC16F818/819 Flash Memory Programming Specification:
This would also mean that you could reset the PIC from the FPGA, by
toggling MCLR low. You should still include a pull-up resistor on MCLR,
and a pull-down resistor on RB3, so that these pins don't float when the
FPGA GPIO pins are set to input (or switched off). The decoupling
capacitor between Vdd and ground is always a good idea too.
You could also output a toggling value on another pin, say GPIO bit 4,
and wire it to PIC RA7 (CLKI) to provide a clock to the PIC, for
experimentation and testing - but a free-running clock is much better
provided by a crystal and some capacitors (as shown in your diagram) or
a 3.3V crystal oscillator (the output of which is simply wired to CLKI).
Or if you want to be really cheap you can use the internal RC
oscillator (not very accurate).
You will have to understand how to program the configuration bits of the
PIC in order to select the appropriate oscillator (and do other things
like disable the watchdog timer, if you don't want to use it).
> Exception `MCLR' pin, which is driven 0/5/12V, not sure this is also
> applicable to newer PICs. Also not clear how to make 12V out of 5V.
The PIC programmers based on the old RS232 ports were able to do this
because 0 and 1 were represented by about -12V and 12V, respectively
(actually, anywhere between -3V and -25V, and anywhere between 3V and
25V). Scary. But they were able to regulate to the required voltages
using voltage regulators or Zener diodes.
I totally don't recommend doing this. Just to be clear. :)
> Low voltage may support programming in VDD operating range i.e. 2.0 to
> 5.5V (PIC16F8x), and requires `RB3' be pulled down by a resistor to
> So one more wire in addition to [MCLR]
> Exception seems `MCLR' to do bulk erase, VDD of 4.5V to 5.5V is
Actually it says that the three bulk erase commands need the whole chip
to be powered at 4.5V-5.5V. But you only need these if you use the code
protection features. (And by the way Wirth's code has some occasional
strange sequences which are also related to code protection).
I would avoid code protection, but you could always build a special 5V
programmer using a PIC, and then take the PIC out of the circuit and
program it using your FPGA at 3.3V. Unless you want it code-protected.
More information about the Oberon