R2R Ladder – Part 2

I have built the R2R ladder DAC, that I had previously built on breadboard, on a piece of copper clad board. This has fixed something that I forgot to mention in the last post; which was that at the lower end of the sawtooth ramp there was a high frequency oscillation. This was probably because of the poor grounding I had when testing. In the right-hand corner of the board I built a op-amp buffer stage.

photo of the prototype R2R ladder DAC

Below is a screenshot from my Oscilloscope of the DAC in operation. As you can see it works!

oscilloscope screenshot showing the sawtooth wave generated by the R2R ladder DAC
 

R2R Ladder DAC

This post is about an R2R Ladder DAC that I build one evening. I wanted to play around with the Arduino Mega 2560 board I have and this seemed like a perfect way to try it out. Below is the schematic for the DAC…

This is an 8-bit DAC built-up from just resistors, each bit is connected to a GPIO pin of the Arduino. I built the circuit on a breadboard and connected it to the Arduino using jumpers.

The first thing I did with the software is toggle the MSB bit using the Ardino digitalWrite() function, however using these functions makes writing to the DAC far too slow. So I needed to write directly to the ATmega GPIO registers and to avoid jitter I use a Timer interrupt. At the moment the software just increments PORTA each interrupt and lets it overflow, this creates a sawtooth wave on the output of the DAC and exercises each bit in the DAC.

int timer1_reload;
 
void setup() {
   pinMode(22, OUTPUT);
   pinMode(23, OUTPUT);
   pinMode(24, OUTPUT);
   pinMode(25, OUTPUT);
   pinMode(26, OUTPUT);
   pinMode(27, OUTPUT);
   pinMode(28, OUTPUT);
   pinMode(29, OUTPUT);
   PORTA = 0;
 
   noInterrupts();
   TCCR1A = 0;
   TCCR1B = 0;
 
   timer1_reload = 65535 - 5;
   TCNT1 = timer1_reload;
   TCCR1B |= (1 << CS10);
   TCCR1B |= (1 << CS11); // /644
   TIMSK1 |= (1 << TOIE1);
   interrupts();
}
 
ISR(TIMER1_OVF_vect)
{
  TCNT1 = timer1_reload;
  PORTA++;
}
 
void loop() {
}

Next I will generate a sine wave using the DAC.

   

A Switch Debouncing Method

There are a lot of different methods used to debounce switch inputs and this post is just about one method that I read about recently and used a couple of times now. So far it seems pretty good and does the job.

The C code for this method is just below, I defined it as a macro so I can use it for multiple switch inputs. All you need to do is execute this code at a fixed sample rate and it will do the rest.

if( input == OFF ) {
    if( integrator > 0 ) {
        integrator--;
    }
} else if( integrator < PERIOD ) {
    integrator++;
}
 
if( integrator == 0 ) {
    output = OFF;
} else if( integrator >= PERIOD ) {
    output = ON;
    integrator = PERIOD;
}

What this basically does is average samples. When the input is high the “integrator” counts up until it reaches the PERIOD constant. Then it sets the output high and also saturates the integrator to the value of PERIOD. When the input is low the integrator counts down until it reaches 0 when it sets the output low.

I cant remember where I found this method, I believe the link is somewhere on Jack Ganssle’s website. He also has a good tutorial on switch debouncing.

       

The Little Wire!

A couple of weeks ago I ordered some stuff from Seedstudio and after a few days they
arrived! I brought a Bus Pirate (with some accessories like the LCD adapter) and the Little Wire kit. I will post another article about the Bus Pirate later on, but this post will just be on the Little Wire.

I found out about the Little Wire on Dangerous Prototypes and
thought it looked really interesting and I got it while ordering the Bus Pirate. It’s a really tiny through-hole circuit board with an ATTINY85 device, an LED, some passives and a USB A connector. The on-board firmware allows you to control the IO pins of the MCU from a PC. The author of the kit has provided a lot of example software to show you how to use the kit.

It comes as a kit of parts so it does require assembly, and it is really easy to put together as there are not many parts on it. Below is a photograph of the bare PCB before I started soldering it.

Assembly

Assembly of the kit is really easy and quick. The first thing I soldered in were the resistors. There are four of them right next to the USB connector.

The next components are the two Zener diodes. These are necessary because the USB data lines D+ and D- are only designed to take 3.3V in and the ATTINY chip is powered by 5V. What the Zeners do is clamp the output of the ATTINY to 3V. Be sure to put them in the correct way around! The black ring signifies the Cathode of the diode.

The next items to go in are the chip socked, capacitors and the pin headers. Unfortunately I didn’t get a photo of these steps, but below is a photo of what the results look like.

Running the Blinky Demo

No that I have the board assembled I want to try it out! I cloned the GitHub repo which has the firmware and a collection of software you can run to interface to the board. Note that I’m using Ubuntu to run the software, your operating system may need different, and/or extra steps.

git clone git://github.com/littlewire/Little-Wire.git

The C and C++ libraries need libusb installed to compile and use them. If you don’t have libusb installed you can get it with this command

sudo apt-get install libusb-dev

Then you can make the software, in this case I’m running the C example programs. I found out that in I needed to run the example program as root in order for it to work. I am not sure why this is, it may have something to do with how libusb works. The Saleae Logic software also needs to be run as root as well.

make
sudo ./blink

Pin 4 of the LittleWire will now be producing a roughly 1Hz square wave. Below is a screen shot of what the Saleae Logic analyser measured on Pin 4.

screenshot of logic analyser output showing the blinking pin

The End….

I’d like to do some more playing around with the Little Wire, I think it will be very useful. I’d like have a go programming an AVR using it. I’d like to play around with the processing code as well. I have also just found out that there is a Basic interpreter written for the Little Wire on GitHub so I think I’ll play around with that bit at some point as well.

         

Playing with the Arduino UNO

Recently I ordered an Arduino UNO and two shields from Adafruit and two weeks ago it arrived… YAY! As soon as I signed for it I rushed to unpacked it! I was amazed at how small it is, it looked bigger in photos. So far over this couple of weeks I’ve only used a few times but those few times I have used I have been very impressed with it.

The first thing I did of course is get it flashing an LED, which only took about 10 minutes to get going. This was including the time to install the IDE on my laptop running Ubuntu 11.04. After a while I had an issue with the Ardunio IDE hanging whenever I click on the Tools menu and also an issue with the IDE reporting the serial port was locked by another application. I haven’t yet found a fix for this other than using my FiancĂ©e’s laptop instead, which is running Windows Vista… I love cross platform software, it can be so handy sometimes.

After that I built the two shields, the first was a Protoshield with screw terminals, and the second was the data logging shield. These were both pretty easy to build and the instructions where excellent. The next thing I did was get the arduino sampling with the ADC, I did this by simply hooking a 10k pot to A0. Then I soldered an LM35 onto the data logging shield and hooked 3V3 to the VREF pin as recommended by Adafruit. At this point I was using the Serial port to get the samples out.

The next day I decided to follow the tutorials on how to use the SD card interface. Thanks to the excellent work by the authors of the various libraries this was very easy. The same for using the RTC. It all just came together and I had the Arduino sampling temperature with a timestamp to the SD card.

In conclusion I think the Arduino is fantastic and I hope to use it much more my future projects. I especially like the idea of the Arduino Pro and Nano because they can be embedded in a system somewhere.