Here are revised versions of the x0xb0x schematics in a more readable form. A few part values were changed to match what was actually used in the build, but the components are exactly the same. They have been checked against the board files, and match as well as the original schematics, which means they have the same warnings and errors (except in a few noncritical cases). If anything seems amiss, please let us know.
Analog voltage map: pcb image
BA662 Internal Wiring
One of the most difficult to source parts from the original 303 is the OTA (Operational Trasnconductance Amplifier), the BA662. It acts as the VCA for the 303, and was replaced with the very similar BA6110 in the x0x. In order to get the BA6110 to act more like the BA662, a current mirror was used to replicate the input stage. This was done from memory, as i had looked at an original BA662 datasheet back in the late 90's that showed the internal wiring diagram. Since then, i have not been able to locate that datasheet, so i decided to reverse engineer the wiring diagram using a spare BA662. From my analysis, this is the best i could come up with:
Basically, it has a 2 transistor current mirror for the control current (same as the CA3080), 3 transistor wilson mirrors for the gain stage (same as the LM13700), and a complimentary darlington at the output with bias current control (same as the BA6110, sans control). Why the bias control? It's not really necessary, and usually tied to Vcc in most circuits, but if you want to increase the input impedance (reduce leakage current) on the input stage of the complimentary darlington, you can decrease the bias current. Basically, it allows you to fine tune the circuit for your application.
If you want to build a discrete version of this, you will need matched pairs. Ideally, you would have matched triplets for the wilson mirrors, but if this not possible, match the tranistors as shown in the diagram above (A and B represent the pairs). Q7 does not need (and probably shouldn't be) matched between the wilson mirror and the complimentary darlington output buffer, this was only done for convenience. The nice thing about the differential pair topology (the heart of the OTA) is that it is beta independent, so it doesn't matter what the beta of the transistors are, just as long as they are matched. The same is mostly true for the current mirrors, and to a lesser degree the output buffer as well. So you should get decent performance regardless of the transistors you use, as long as they are matched.
A CPU Upgrade daughter board for the x0x was designed by textile on the x0x forums. it's a drop-in replacement, with an ATmega2561 processor and another spot for external EEPROM, plus a host of breakout pins for ADCs and such. Linked below are prototype bootloader and firmware code for the new chip (see note below on ISP programming). The bootloader is the same one used on the Arduino, so you can use that platform to program and load with. The only major difference between this firmware and the stock v1.05 is that the tempo knob is sampled rather than run on an interrupt. This was changed due to its lines not being connected to external interrupts on the new CPU.
To bootload the CPU, you will need to install AVRDUDE, which is a free piece of software, and have the the FTDI USB to serial drivers installed. Both of these things are similar to the old method. You must turn off your x0x, and power it back on in bootload mode. You then have 5 minutes to get your code loaded before it aborts. You upload your code by typing at the command line:
avrdude -p atmega2561 -c stk500v2 -P COM3 -b 57600 -e -U flash:w:x0xb0x2.hex
where COM3 is replaced with the COM port that your x0x shows up on. In this example, i have the new firmware (x0xb0x.hex) directly in my C:\ directory, which is also where i execute from. I found this works best, as directories with spaces sometimes confuse it. After the code is uploaded, the x0x will automatically reset itself, so you can just rotate the function knob and test out the new code.
Only 5 files changed in the firmware:
- makefile - minor mod to change the output file name
- x0xb0x2.hex - new compiled firmware
- main.c - mostly timer and tempo fixes
- main.h - ported internal registers
- synth.h - ported external pin registers
The fuse settings for this new chip are as follows:
- BOD level = 4.3V
- JTAG enabled
- ISP enabled
- BOOTSZ = 4096 words (8k)
- BOOTRST enabled
- EESAVE enabled (no overwrite of internal EEPROM (saves last tempo, etc.))
- SUT/CKSEL = full swing oscillator, 16CK + 65ms
LOCK BITS only set for SPM and LPM protection on bootload section
- FUSE XTEN = 0xFC
- FUSE HIGH = 0x90
- FUSE LOW = 0xF7
- FUSE BOOT = 0xCF
If you are interested in using the Arduino platform to program with, you will need to update your boards.txt file to include a new board, the x0x2561. This file is located in arduino-0022\hardware\arduino\boards.txt. Rather than give a completely new file to replace yours with, which would overwrite any other updates made by the Arduino people to this file, merely open the file below and add its lines to your boards.txt file. When you look at the two files, it should be clear how to do this. Also included below is a test file, which should have LEDs respond to button presses in a random fashion.
ISP Programming the Atmega2561
Due to Atmel's migration to the new PDI serial programming interface, the ISP programming pins do NOT go to the usual SPI pins. Instead, the PDO and PDI pins are used. If you are connecting to the x0x2561 upgrade board, here are the DIP header pins to connect to: