Hardware Design

While most of our project was in software, there were a couple devices implemented in hardware. First, there was the LCD controller. This was written mostly in verilog, and was mostly about timing. After reading the documentation on the LCD interfacing, and a bit of trial and error, it worked flawlessly.

Later in the project we added the ADC so that we could read the temperature from the temperature sensor. This inolved adapting the work from lab 8 to the new expansion board. It also presented an interesting challenge of interfacing to two seperate devices on the same 8 pins. This was made possible because the LCD has a control pin external to the ADC, but there is still the problem of bus contention if the use of tri-state buffers are not carefully thought out and used.

Since the temperature sensor by default has a change of 1°F is 10mV change in output voltage (regardless of input voltage), and the ADC has a LSB resolution of 20mV, this limited our temperature resolution to 2°F. We had the idea to put the output from the temperature sensor through a scalling op-amp, and this "worked" in the sense that the output was scaled such that 1 LSB was now .5°F. However, it was difficult to connect to the ADC, as the ground is no longer the ground that the ADC is using. Time constraints limited us from ultimately getting this higher resolution to work, however it could have been solved by another inverting op-amp, and a DC offset op-amp.


Although more of this project could have been in hardware, we decided that it was better for several reasons to implement in software when given the choice. The goal for our hardware was to produce a simple but abstract interface to external devices. This greatly helps when you want to do something slightly different than before in software, without having to completely redesign your hardware. Providing this simplicity helped us greatly when we combined code toward the end of this project, especially in resolving bus contention issues.