Chipulater - Propeller Logic Emulator
I started this project in 2012 and though I lost all my files from a PC crash, I recently found a backup on DVD so I thought I would post this here for two reasons.
1.) So there is a backup online
2.) To share my project with the community
The code is documented as well as I could, and 1 bit of code, the flip flop, is incomplete. I will make modifications as needed. I hope you like the work so far
Rundown of the code:
* common Gates
* A Multiplexer ( 4 to 1 )
* A DeMultiplexer ( 1 to 4 )
* A Counter chip ( 4 bit )
* A Flip-Flop ( RS ) incomplete, need more info
I hope to get some feedback on what I can improve, and possibly some timings on the gates as read by a scope, I do not have one, and how the code compares to actual logic IC's. I have a few more bits of code but will wait to post it all until I go over it again, its been missing for 2 years. So glad I found my old project.
Comment if you like the code/idea
1.) So there is a backup online
2.) To share my project with the community
The code is documented as well as I could, and 1 bit of code, the flip flop, is incomplete. I will make modifications as needed. I hope you like the work so far
Rundown of the code:
* common Gates
* A Multiplexer ( 4 to 1 )
* A DeMultiplexer ( 1 to 4 )
* A Counter chip ( 4 bit )
* A Flip-Flop ( RS ) incomplete, need more info
{{
Program_Name : LOGIC.spin
Program_Version : 1.0
Program_Author : Jorge Joaquin Pareja
Copyright (c) Jorge Joaquin Pareja 2013-2015, all Rights Researved
If you're like me and do not live around or near a store that supplies various
computer chips, or you do not have the funding to purchase them, then you
have limited resources. This limitation can put your project on hold for
quite some time, and maybe even indefinatly if you do not have funding. So
you just decide to pass your project idea by.
Well, after reading some documentation and getting frustrated enough to
say to myself, "I wish there was a way to get those chips I need faster".
It ocured to me that I can use a propeller to emulate a multitude of varius
IC's I could not get or that I could not find any more.
This program is a sample of how to program the propeller to function as
a general purpose IC that can emulate many types of gates, buffers, etc...
hence the name of the program, CHIPULATOR, CHIP emULATOR.
This also helps when learning how to use variouse chips and their function.
Not to mention development costs, you can use a Propeller chip that we all
usualy keep around to toy with.
NOTE: voltage tolerances of all emulated IC's are that of the propeller.
This project is not intended to replace a component, it is intended
soley as a temporary workaround for missing parts you do not have in
stock.
This project is not intended to communicate serialy with any device,
Propeller, or PC. This is soley to allow a sense of piggy-backing
using COGs. Since each cog has access to all 32 pins, we can
programaticaly piggy-back multiple gates to read the other gates and
use the same inputs and use multiple outputs, or we can take the
output of one and feed it back through to the others input. All
with nothing more than a few cogs. Digital Feedback without passing
variables to other cogs, Even though a pin is an output, you can still
read its state with INA.
This project uses the Propeller Proffessional Development Board (PPDB)
The parts of the PPDB that I am using are the Buttons, Dipswitch, and
LED's. 8 of each are required for the Full Project.
*********************
Project Goals
*********************
The PPDB has 16 LEDs, 1 - 8 Position Dip Switch, and 8 buttons that I
will be using for the project. The switches and buttons will serve as
inputs to our gates and the LEDs will serve as a visual display of the
output. Although it may sound strange, we will be defining the
hardware IC's completely in software. Advanced users of the Propeller
Chip will be able to add in more precice timing characteristics of the
actual chips we will emulate by rewriting this project in assembler.
This particular project will do it all in spin, without considering
the un-emulated devices speed. This is simply because I currently
am not that proficient in PASM, I am learning though.
This project will define a total of 7 gates, as well as gate
configurations that will serve as the following.
* A Multiplexer ( 4 to 1 )
* A DeMultiplexer ( 1 to 4 )
* A Counter chip ( 4 bit )
* A Flip-Flop ( RS ) incomplete
If you do not understand the Logic of these circuits, you can toy
with the logic using "Parallax Logic Simulator" as available on
the "Parallax CD". This Project is intended to match that same
functionality and purpose.
In software, I have expanded the inputs and outputs to be up to 8
of each incase we want to have 2 or more seperate circuits defined
with the propeller. These inputs and outputs will be as follows:
Pins 0.. 7 undefined
Pins 8.. 15 INPUTS
Pins 16.. 23 OUTPUTS
Pins 24.. 32 undefined (with execption to progrming and startup pins 18,29,30,31)
Leaving 16 pins for possible future expansion. You will find that
this is vary simple to program using spin.
So enough smalltalk, lets get started.
}}
CON
_CLKMODE = XTAL1 + PLL16X 'Standard clock mode * crystal frequency = 80 MHz
_XINFREQ = 5_000_000
' the following constants currently are not used
' Signal Levels
HIGH = 1
LOW = 0
INVERTED_HIGH = 0
INVERTED_LOW = 1
' Gate types enum
#0, NULL, { turns GATE driver off and loops until command is set with new perameters
} _AND, { configures driver as an 2 input AND Gate
} _NAND, { configures driver as an 2 input NAND Gate
} _NOT, { configures driver as an 1 input NOT Gate (also called an inverter)
} _OR, { configures driver as an 2 input OR Gate
} _XOR, { configures driver as an 2 input XOR Gate
} _NOR, {
} _XNOR, {
} _MUX, {
} _DEMUX, {
} _COUNTER, {
} _FLIPFLOP,{
} _BUFFER
' commands
#0, cmdNULL, { OK/READY
} cmdStop, { if a gate is running, this command stops it
} cmdSetGate, {
} cmdInvertInput, {
} cmdInvertOutput, {
} cmdSetInPins, {
} cmdSetOutPin {
}
' return values
#0, OK, { Loaded and ready for commands
} READY, { same as above
} BUSY, { Commands have already ben sent, use cmdStop to stop the gate but not unload the cog
} ERROR, { an unknown error occured
} STOPPED, { occurs only after sending cmdStop, after reading this should be set to OK or READY
} NOT_LOADED,{ only set in spin, the cog has not been loaded
} ERR_NoGate { user forgot to set gate type prior to setting cmd
}
{
VAR
LONG gateType
LONG inPin_A, inPin_B, inPin_C, inPin_D, inPin_E, inPin_F, inPin_G, inPin_H ' input pins
LONG outPin_A, outPin_B, outPin_C, outPin_D, outPin_E, outPin_F, outPin_G, outPin_H ' output pins
LONG gate_A, gate_B, gate_C, gate_D, gate_E, gate_F, gate_G, gate_H ' gate selection pins
LONG CE_0, CE_1, CE_2, CE_3, CE_4, CE_5, CE_6, CE_7 ' chip enable pins
OBJ
'pst : "Parallax Serial Terminal"
}
PUB Main
{{
''
'' This is the code area that should be edited by the user
'' to alter the function we wish to emulate.
''
}}
DIRA[8..15]~ '' set pins 8 through 15 to inputs
DIRA[16..23]~~ '' set pins 16 through 23 to outputs
'GATE_NOT
'GATE_BUFFER
'GATE_AND
'GATE_OR
'GATE_NAND
'GATE_NOR
'GATE_XOR
'GATE_XNOR
'CHIP_MUX4
'CHIP_DEMUX4
'CHIP_COUNTER4
CHIP_COUNTER8
PUB GATE_NOT
{{
*********************
The NOT Gate
*********************
The NOT gate, in my opinion, is the simplest of all the gates. The
output is NOT equal to the output. So, when the input signal is
high, the output signal will be low. Likewise, when the input signal
is low, the output will be high.
The NOT gate is also called an INVERTER. The input is inverted on
the output.
The truth table (LOGIC) of a NOT gate
┌────────┬────────┐
│ INPUT │ OUTPUT │
├────────┼────────┤
│ 0 │ 1 │
├────────┼────────┤
│ 1 │ 0 │
└────────┴────────┘
This can be defined in spin with very few lines of code. 4 to be exact!
CODE:
DIRA[8]~ ' set pin 8 to be input
DIRA[23]~~ ' set pin 23 to be an output
REPEAT
OUTA[23] := !INA[8] ' NOTE that when the button is NOT pressed
' the signal is HIGH on the PPDB. This
' may lead to confusion by some new users,
' the gate is indeed functioning properly
That is quite simple, but as noted, this project is designed for the PPDB
and may be confusing to some who have not looked at the PPDB schmatic.
Overall, that was quite simple. I spent quite a bit of time searching
electronics catalogs for various inverter chips and calculating costs.
It was not until I wrote a single line of buggy spin code that I became
aware that the software actualy defined this NOT gate. The bug was
exactly the NOTE that I wrote in the code itself about the Active Low
push button circuit.
The following pins should be wired to:
P8 -> PB0
P23 -> LED_0
--- Side Note: ---
The first computer bug was on a punch-card reader. A punch
card is a piece of paper with holes punched into it to
represent 1's and 0's, which is the binary representation of
software. The woman operating the machine noticed that
there was some sort of problem with the program and removed
the card to visualy inspect it, she noted in her log-book
that she found a bug on the card, the bug she found was
of the insect kind.
I would assume that her notion to log the incident was to
inform the other operators that insects can cause the
machine to malfunction. From that point on, all errors
in programming have been called bugs, and she will
forever be remembered for her discovery and coining the
term.
}}
REPEAT
OUTA[23] := !INA[8] ' NOTE that when the button is NOT pressed, the signal is HIGH on the PPDB
' This may lead to confusion by some new users, the gate is indeed
' functioning properly
PUB GATE_BUFFER
{{
*********************
The BUFFER
*********************
A buffer gate is the second easiest gate we can program. Similar to the NOT
gate, it has one input and one output and requires the same amount of code
minus one charactor. The output will always equal the input.
CODE:
DIRA[8]~ ' set pin 8 to be input
DIRA[23]~~ ' set pin 23 to be an output
REPEAT
OUTA[23] := INA[8] ' NOTE that when the button is NOT pressed
' the input signal is HIGH on the PPDB.
' This may lead to confusion by some new
' users, the gate is indeed functioning
' properly
If you compare the code, the line that reads "OUTA[23] := INA[8]" differs
from that of the NOT gate. The logic ! symbol in code stands for NOT. Try
not to get confused here and recall how the buttons are wired on the PPDB,
they are active LOW so the code is correct for the PPDB hardware.
If you think about it, A light switch on your wall is a buffer between you
and the 110/220 volts of electricity from your power company.
}}
REPEAT
OUTA[23] := INA[8] ' NOTE that when the button is NOT pressed
' the input signal is HIGH on the PPDB.
' This may lead to confusion by some new
' users, the gate is indeed functioning
' properly
PUB GATE_AND
{{
*********************
The AND Gate
*********************
An and gate uses atleast 2 inputs. I will only be coding a 2 input AND gate
so if your application requires more inputs, try expanding the code using
the logic table of the AND gate you are emulating.
This 2 input gate has 4 possible logical states:
┌────────┬────────┬┬────────┐
│ INPUT │ INPUT ││ OUTPUT │
│ A │ B ││ │
├────────┼────────┼┼────────┤
├────────┼────────┼┼────────┤
│ 0 │ 0 ││ 0 │
├────────┼────────┼┼────────┤
│ 0 │ 1 ││ 0 │
├────────┼────────┼┼────────┤
│ 1 │ 0 ││ 0 │
├────────┼────────┼┼────────┤
│ 1 │ 1 ││ 1 │
└────────┴────────┴┴────────┘
Only when both inputs are HIGH, the output will be HIGH. You can also see
that the input states are a binary representation of the numbers 0, 1, 2,
and 3. 1/4 of a byte, 1/2 nibble. The old term used in programming, which
is rarely ever used, is called a TAYSTE or CRUMB. Whereas the ouput is
simply a BIT.
In spin, the code to perform this type of function is as follows:
CODE:
REPEAT
IF INA[8] & INA[9]
OUTA[23]~~
ELSE
OUTA[23]~
On the PPDB when a button 0 and/or 1 are pressed the LED goes off. On
other platforms with buttons wired active high, the LED will only iluminate
when both buttons are pressed.
}}
REPEAT
IF INA[8] & INA[9]
OUTA[23]~~
ELSE
OUTA[23]~
PUB GATE_OR
{{
*********************
The OR gate
*********************
The OR gate has 2 inputs and 1 output in the standard configuration.
Allthough most of the gates throughout this tutorial have 2 inputs, they
can contain many more. The truth table for the 2 input OR gate is:
┌────────┬────────┬┬────────┐
│ INPUT │ INPUT ││ OUTPUT │
│ A │ B ││ │
├────────┼────────┼┼────────┤
├────────┼────────┼┼────────┤
│ 0 │ 0 ││ 0 │
├────────┼────────┼┼────────┤
│ 0 │ 1 ││ 1 │
├────────┼────────┼┼────────┤
│ 1 │ 0 ││ 1 │
├────────┼────────┼┼────────┤
│ 1 │ 1 ││ 1 │
└────────┴────────┴┴────────┘
if either or both inputs are HIGH the output is high. Here is the code to
perform this on the propeller:
CODE:
REPEAT
IF INA[8] | INA[9]
OUTA[23]~~
ELSE
OUTA[23]~
You will notice that it looks nearly the same as the AND gate with the
exception of one charactor. Here, instead of & we use |. This symbol
is the "Vertical Bar" or "Pipe Symbol".
}}
REPEAT
IF INA[8] | INA[9]
OUTA[23]~~
ELSE
OUTA[23]~
PUB GATE_NAND
{{
*********************
The NAND Gate
*********************
The NAND gate is a NOT-AND gate. When either A, B, or Neither inputs are
HIGH, the output is HIGH. Only when both inputs are high does the gate
turn off the output, here is the truth table for the NAND:
┌────────┬────────┬┬────────┐
│ INPUT │ INPUT ││ OUTPUT │
│ A │ B ││ │
├────────┼────────┼┼────────┤
├────────┼────────┼┼────────┤
│ 0 │ 0 ││ 1 │
├────────┼────────┼┼────────┤
│ 0 │ 1 ││ 1 │
├────────┼────────┼┼────────┤
│ 1 │ 0 ││ 1 │
├────────┼────────┼┼────────┤
│ 1 │ 1 ││ 0 │
└────────┴────────┴┴────────┘
The code is as follows:
CODE:
REPEAT
IF INA[8] & INA[9]
OUTA[23]~
ELSE
OUTA[23]~~
Again, this looks like the AND gate code with the exception that both OUTA
lines have been swapped in order to give the NAND gate effect.
}}
REPEAT
IF INA[8] & INA[9]
OUTA[23]~
ELSE
OUTA[23]~~
PUB GATE_NOR
{{
*********************
The NOR Gate
*********************
The NOR gate is a NOT-OR gate. The truth table is:
┌────────┬────────┬┬────────┐
│ INPUT │ INPUT ││ OUTPUT │
│ A │ B ││ │
├────────┼────────┼┼────────┤
├────────┼────────┼┼────────┤
│ 0 │ 0 ││ 1 │
├────────┼────────┼┼────────┤
│ 0 │ 1 ││ 0 │
├────────┼────────┼┼────────┤
│ 1 │ 0 ││ 0 │
├────────┼────────┼┼────────┤
│ 1 │ 1 ││ 0 │
└────────┴────────┴┴────────┘
If either or both inputs are HIGH, the output is LOW, otherwise the input
is HIGH.
The code is as follows:
CODE:
REPEAT
IF INA[8] | INA[9]
OUTA[23]~
ELSE
OUTA[23]~~
}}
REPEAT
IF INA[8] | INA[9]
OUTA[23]~
ELSE
OUTA[23]~~
PUB GATE_XOR
{{
*********************
The XOR Gate
*********************
The Exclusive OR is a gate is one where when input A or B, but not both is
HIGH, the output is HIGH. If both or neither are HIGH, the output is LOW.
The truth table is:
┌────────┬────────┬┬────────┐
│ INPUT │ INPUT ││ OUTPUT │
│ A │ B ││ │
├────────┼────────┼┼────────┤
├────────┼────────┼┼────────┤
│ 0 │ 0 ││ 0 │
├────────┼────────┼┼────────┤
│ 0 │ 1 ││ 1 │
├────────┼────────┼┼────────┤
│ 1 │ 0 ││ 1 │
├────────┼────────┼┼────────┤
│ 1 │ 1 ││ 0 │
└────────┴────────┴┴────────┘
Here is the code:
CODE:
REPEAT
IF INA[8] ^ INA[9]
OUTA[23]~~
ELSE
OUTA[23]~
}}
REPEAT
IF INA[8] ^ INA[9]
OUTA[23]~~
ELSE
OUTA[23]~
PUB GATE_XNOR
{{
*********************
The XNOR Gate
*********************
The XNOR gate is an Exclusive NOT-OR gate, it is the opposit of the XOR
gate ain that when neither or both inputs are HIGH, the output is HIGH.
The truth table:
┌────────┬────────┬┬────────┐
│ INPUT │ INPUT ││ OUTPUT │
│ A │ B ││ │
├────────┼────────┼┼────────┤
├────────┼────────┼┼────────┤
│ 0 │ 0 ││ 1 │
├────────┼────────┼┼────────┤
│ 0 │ 1 ││ 0 │
├────────┼────────┼┼────────┤
│ 1 │ 0 ││ 0 │
├────────┼────────┼┼────────┤
│ 1 │ 1 ││ 1 │
└────────┴────────┴┴────────┘
and the code:
REPEAT
IF INA[8] ^ INA[9]
OUTA[23]~
ELSE
OUTA[23]~~
}}
REPEAT
IF INA[8] ^ INA[9]
OUTA[23]~
ELSE
OUTA[23]~~
PUB CHIP_MUX4
{{
*********************
The MUX chip
*********************
A MUX is a set of variouse gates used in combination. The Multiplexer as
depicted in the Parallax Logic Simulator can be emulated with:
* 4 - AND Gates
* 2 - OR gates
* 2 - One line to two line decoders
Rather than constructing the circuit, we will do this in code since it
would take up 24 pins if we used each gate seperatly. The BITWISE and
BOOLEAN Operators of Spin are all that is required here, we will then
be able to simply use a total of 8 I/O pins. That sure beats 24 pins.
The pins on the left will serve as the 7 inputs wile the right side
will serve as the outputs for the remainder of these lessons.
For the Multiplexer the following pins are defined:
P8 = X0
P9 = X1
P10 = X2
P11 = X4
P12 = A
P13 = B
P14 = EN note this pin will be inverted
P16 = X this is the only output
Now lets take a look at the Truth table:
┌────────┬────────┬────────┬┬────────┐
│ │ │ ││ OUTPUT │
│ Enable │ B │ A ││ P16 = │
├────────┼────────┼────────┼┼────────┤
├────────┼────────┼────────┼┼────────┤
│ 1 │ - │ - ││ None │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 0 │ 0 ││ X0 │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 0 │ 1 ││ X1 │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 1 │ 0 ││ X2 │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 1 │ 1 ││ X3 │
└────────┴────────┴────────┴┴────────┘
I should note here that the Enable line should be tied HIGH through a 10K
resistor for this emulator, we then will only need to drive it low. On
the PPDB this is taken care of on the push button we will be using. I will
now need to describe the tie points for this more advanced emulation on
the PPDB:
DS_7 to P8, X0
DS_6 to P9, X1
DS_5 to P10, X2
DS_4 to P11, X3
DS_1 to P12, A
DS_0 to P13, B
PB_0 to P14, EN
LED0 to P16
A reminder here, if you look at the button and dipswitch schematic of the
PPDB you will see that they are all tied high through a 10k resistor. So
the dip switches should all be in the ON position, all UP.
Now for some code! I will start out with the enable button. The EN pin
is active low, button 0 pressed, and our code should only process the other
pins when this pin is LOW. This should give us time enough to set the
dipswitch to the settings we want without inadvertantly executing code:
CODE:
REPEAT
IF INA[14] == 0
IF INA[12] == 0 AND INA[13] == 0
OUTA[16] := INA[8]
IF INA[12] == 1 AND INA[13] == 0
OUTA[16] := INA[9]
IF INA[12] == 0 AND INA[13] == 1
OUTA[16] := INA[10]
IF INA[12] == 1 AND INA[13] == 1
OUTA[16] := INA[11]
ELSE
OUTA[16]~
as long as everything is wired properly, it works like a charm. Pretty
neat, eh? It was actualy much simpler that I imagined it would be.
}}
REPEAT
IF INA[14] == 0
IF INA[12] == 0 AND INA[13] == 0
OUTA[16] := INA[8]
IF INA[12] == 1 AND INA[13] == 0
OUTA[16] := INA[9]
IF INA[12] == 0 AND INA[13] == 1
OUTA[16] := INA[10]
IF INA[12] == 1 AND INA[13] == 1
OUTA[16] := INA[11]
ELSE
OUTA[16]~
PUB CHIP_DEMUX4
{{
*********************
The DEMUX chip
*********************
The Demultiplexer is the oposit of the Multiplexer in that it has four
outputs and one input, not including the A, B and EN signals. The
demultiplexer may seem pointless, at first sight, due to the fact that
it requires 4 inputs to setup its four outputs. If you have enough pins
you can just connect the microcontroller to what would be connected to the
X# signals. However, if you have a design you wish to expand and have less
than four pins left over, but are using other chips with a CE or EN signal,
we can most likely squeeze in a demultiplexer. Here is the truth table:
┌────────┬────────┬────────┬┬────────┐
│ │ │ ││ INPUT │
│ Enable │ B │ A ││ X to │
├────────┼────────┼────────┼┼────────┤
├────────┼────────┼────────┼┼────────┤
│ 1 │ - │ - ││ None │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 0 │ 0 ││ X0 │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 0 │ 1 ││ X1 │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 1 │ 0 ││ X2 │
├────────┼────────┼────────┼┼────────┤
│ 0 │ 1 │ 1 ││ X3 │
└────────┴────────┴────────┴┴────────┘
Lets assume the following scenario:
You have 29 of your propeller pins used up with other circuitry.
In that circuitry you have used the following:
* DS1302
* L293D
* various other imaginary circuits
as long as we know when the DS1302 and L293D chip are being used we
can simply use one of the free pins for the multiplexer CHIP. How you
ask? Well as long as the other chips respective EN and CE lines are
not in their ACTIVE state we can use any of their other signal lines
giving us access to up to 6 data lines when we thought we only had two.
Technicaly we have a total of 8 pins we can use AS LONG AS we do not
enable the other chips while communicating.
With that in mind, lets assume our pins are as follows, or something
similar:
DS3102
SCLK to P8
I/O to P9
CE to P0
L293D
EN 0,1 to P1
EN 2,3 to P2
Input0 to P8
Input1 to P9
Input2 to P10
Input3 to P11
A Real MULTIPLEXER chip
EN to P3
A to P8
B to P9
X to P10
You would then be able to do some fancy coding to work it all out while
making sure you do not Clobber a signal. It would take alot of care to
do all this. Thats what the demultiplexer is designed for. That was just
a scenario to consider why to use the DEMUX, lets get onto the emulation of
it.
We don't need to ripup the previous lesson, the multiplexor, we can leave
it in place and use a second button and the same IO pins as the multiplexr.
PB1 to P15
LED0 to P16
LED1 to P17
LED2 to P18
LED3 to P19
The following connections should already be in place unless you ripped it up
after the last lesson.
DS7 to P8 Now X for this Emulation
DS_1 to P12, A
DS_0 to P13, B
With everything in place, lets code the following:
CODE:
REPEAT
IF INA[15] == 0
IF INA[12] == 0 AND INA[13] == 0
OUTA[16] := INA[8]
IF INA[12] == 1 AND INA[13] == 0
OUTA[16] := INA[9]
IF INA[12] == 0 AND INA[13] == 1
OUTA[16] := INA[10]
IF INA[12] == 1 AND INA[13] == 1
OUTA[16] := INA[11]
ELSE
OUTA[16]~
Nice, it works like a charm. Again, if you have any problems double
check your wiring and make sure the switches, buttons, and LEDs are wired
to mimic the PPDB.
}}
REPEAT
IF INA[15] == 0
IF INA[12] == 0 AND INA[13] == 0
OUTA[16] := INA[8]
IF INA[12] == 1 AND INA[13] == 0
OUTA[17] := INA[8]
IF INA[12] == 0 AND INA[13] == 1
OUTA[18] := INA[8]
IF INA[12] == 1 AND INA[13] == 1
OUTA[19] := INA[8]
ELSE
OUTA[16..19]~
PUB CHIP_COUNTER4 | tmp
{{
*********************
The COUNTER chip
*********************
I have never used a counter, I would assume they are used in devices like
change counters and vending machines to count coins and such. I would
imagine that a digital micrometer would have one as well, wired up to
a hall effect sensor of some sort.
If a counter has enough outputs, we could see the output of devices like
the PING using an aceleromiters motion sensing abilities to the reset.
We do not need to rewwire anything from the demultipler emulator circuit,
but if you ripped it up here is the wiring:
LED0 to P16, Q1
LED1 to P17, Q2
LED2 to P18, Q3
LED3 to P19, Q4
DS0 to P14, R
PB0 to P13, CLK active low
we will need a variable to hold our count so far, here is the code
CODE
tmp := 0
REPEAT
IF INA[14] == 1 ' R
tmp := 0
OUTA[19..16] := 0
ELSE
IF INA[13] == 0 ' CLK
tmp += 1
IF tmp == 16
tmp := 0
REPEAT UNTIL (INA[14] == 1) or (INA[13] == 1)
OUTA[19..16] := tmp
There we have it, a counter chip emulated on the propeller, don't forget
that the propeller has a set of 2 counters per COG for a total of 16. If
you need, you can use that instead to incriment the data. I have not, yet,
gotten arround to using them in my own code.
}}
tmp := 0
REPEAT
IF INA[14] == 1 ' R
tmp := 0
OUTA[19..16] := 0
ELSE
IF INA[13] == 0 ' CLK
tmp += 1
IF tmp == 16
tmp := 0
REPEAT UNTIL (INA[14] == 1) or (INA[13] == 1)
OUTA[19..16] := tmp
PUB CHIP_COUNTER8 | tmp
{{
CHIP_COUNTER4 is expanded with 4 more outputs for a total of 8
P16..23 are outputs wired to LEDs 0..7
P13 is input and connects to button 0, the clock
P14 is input and connected to dipswitch 0. Off resets, ON keeps count.
}}
REPEAT
IF INA[14] == 1 ' R
tmp := 0
OUTA[23..16] := 0
ELSE
IF INA[13] == 0 ' CLK
tmp += 1
IF tmp == 256
tmp := 0
REPEAT UNTIL (INA[14] == 1) or (INA[13] == 1)
OUTA[23..16] := tmp
PUB CHIP_FLIPFLOP_RS | set, reset, clock, data, q, qi
{{
*********************
the FLIPFLOP (RS Type)
*********************
RS FlipFlop is an edge triggerd device.
(INCOMPLETE)
}}
' setup propeller pins
SET := 15 ' falling edge
CLOCK := 14 ' rising edge
DATA := 13 '
RESET := 12 ' falling edge
Q := 17
QI := 16
' setup directions
DIRA[RESET..SET]~ ' inputs
DIRA[Q..QI]~~ ' outputs
' functional code
I hope to get some feedback on what I can improve, and possibly some timings on the gates as read by a scope, I do not have one, and how the code compares to actual logic IC's. I have a few more bits of code but will wait to post it all until I go over it again, its been missing for 2 years. So glad I found my old project.
Comment if you like the code/idea

Comments
As far as the first computer bug, this is a good read:
http://www.jamesshuggins.com/h/tek1/first_computer_bug.htm
Hmmm, well I guess the version I read has a bug, I should have done better research on that. I'll update the text when I update the FlipFlop code. Thanks for pointing that out.