ECE 4760: Laboratory 1

Digital Capacitance Meter.


You will produce a digital capacitance meter (DCM) which displays the capacitance in the LCD. The DCM will measure capacitances from 1 to 100 nF. But first you need to set up a board, arrange jumpers, learn how to connect peripheral devices and use the compiler. You will first do a quick exercise to compile an existing program and watch the blinking lights. The LEDs on the board are the embedded programmers low-level, fast, debug tool.


The hardware you will be using to support the MEGA-series is the Flash MCU evaluation board, a small board providing:


Software you will use is freely downloadable and consists of:

More information

General hardware Procedures

  1. Make sure the evaluation board is connected to power and to the PC as specified in the evaluation board description. Turn on the power supply with the switch on the board. An LED in the middle of the board should cycle from red to yellow to green. For the first part of this lab, there should be jumpers on the PortB to the LED header and on PortD to the switch header. Ask your instructor for help if these are not installed. There should be a two wire connector from pins D.0 and D.1 to the RS232 jumper.
  2. Make sure the crystal on the STK500 is actually 16 MHz.
  3. There will two serial connections to the STK500. One for programming the Mega644 and one for serial communication between the running program and the PC, which will be running PuTTY. Set up PuTTY for 9600 baud, no parity, 1 stop-bit, no flow-control. In the PuTTY config window, choose serial connection, then click serial in the left hand panel and set the parameters. Connect PuTTY to whatever serial port the USB dongle configures. Use Control Panel...System...Hardware Tab...Device Manager Button...+Ports to find out which serial port is connected to the USB dongle. The STK500 serial port RS232 Spare will be connnected to the dongle.
  4. Put all files on your Z drive! Do not creat a project on the local drive! Be sure to put all your files there and to back up daily!.
  5. There should be a shortcut to AVRstudio on the desktop or start menu.
  6. After you define a new project, you can add a C source file and edit it. This first example code is just for testing the hardware setup and to learn how to use AVR studio. Later you will use a different program to measure timer intervals, which is the basis for lab 1.
    1. Save this code into your z drive. This program blinks LEDs and responds to buttons. It is organized as three task subroutines. You will use this code to test your hardware setup.
    2. In the AVRstudio Project menu choose Project Wizard. When the dialog box appears, choose New Project.
    3. In the new dialog box choose a GCC project, give the project a name, and indicate a source file to use. Choose a location on your Z drive to store the project.
    4. In the next dialog box choose to debug with AVR simulator and choose ATmega644, then press Finish
    5. In the menu item Project-> Configuration Options -> General -> Frequency enter 16000000 because the crystal frequency is 16 MHz.
    6. Paste this code into the newly created source file.
    7. Choose the menu item Build from the Build menu. A message window will open to tell you if there are errors in the code.
    8. If the compile is successful, you should be able to download the program to the STK500 board and see some blinking LEDs.
      To download, select the Tools>Program AVR>Autoconnect menu item which will open a dialog box. In the dialog box:
      1. In the Main tab, set the ISP frequency (Settings... dropdown) to 57 Khz, then press Write then Close. You can try using a higher speed, but always be prepared to drop back to the low speed to check the fuze settings in step 3 below.
      2. Make sure the device is Mega644.
      3. Always check Mega644 fuze settings:
        1. Go to the Fuses tab in the programmer window and set the SUT_CLKSEL fuse to:
          Ext crystal osc 8- MHz; startup time: 16k clk+65 mSec.
        2. Uncheck the CLKDIV8 box.
        3. Uncheck the JTAGEN box and answer YES in the confirming dialog. (If you leave the box checked, PORTC does not work correctly).
        4. Click Program
      4. In the Program Tab, Flash box, select the hex file generated by the compiler. The file will be in the
        project folder>default folder. Press the Program button. If the program does not download to the chip, call a TA. Note that the hex file name is NOT updated for you and will default to the last project compiled on the computer.

When the program is running and blinking lights, you should be able to press button 7 to change the blinking rate. Uncomment all the statements necessary to enable serial communication to the PC and make sure it works. Printf statements are a useful way to debug. At this point you can move on to the actual lab exercise below.

Capacitance Procedure:

  1. Save TimersGCC644.c, uart.c and uart.h into your directory, add uart.c to the source file list, and build the project. Connect B.3 to D.7 to hook the squarewave output to the comparator input. This program measures the period of a square wave in two diffent ways and demonstrates that polling for a bit is inferior to using the Timer1 capture ISR for measuring time intervals. It is organized as main, one task subroutine and two ISRs. I suggest modifying this code in the assignment below so that the task updates the LCD and another task slowly blinks an LED so that you know your code is running. The example uses timer0 interrupt to maintain the time base for printing data. It uses timer1 capture ISR to measure intervals. You will need to change the ACSR definitions so that AIN1 (B.3) is compared to AIN0 (B.2), rather than the the bandgap reference.
  2. Connect the LCD (see below) and run the LCD test program (LCDtestGCC644v2.c, lcd_lib.c, lcd_lib.h). You should see a counter on line 0 and a moving dot on line 1. The LCD library lcd_lib.c and lcd_lib.h are from Be sure to set the crystal frequency in the project options.
  3. Remember that a switch which is pushed reads back a logic zero.
  4. Timing of all functions in this lab, and every exercise in this course will be handled by interrupt-driven counters, not by software wait-loops. This will be enforced because wait-loops are hard to debug and tend to limit multitasking. Specifically, you may not use the delay library routine delay_ms. Using delay_us will be acceptable when you need to produce delays on the order of a few microseconds.

    The Liquid Crystal Display (LCD):

    A 16 character, two line (16x2), LCD display be used as a numerical display. The display we are using has an industry-standard interface. A more detailed data sheet for a similar display shows the command set, but start by reading the demo code, not by reading the data sheet. There are several aspects of the display you should note:

Capacitance measurement

The approach we will use is to measure the time it takes for a RC circuit to charge a capacitor to a given level. If R3=R4 in the schematic below then the level will be v(t1/2)=Vcc/2. Specifically, we will use the internal analog comparator as shown in the following diagram to trigger a timer1 event. Since R2 will be known, we can get C because the voltage on the capacitor v(t)=Vcc(1-exp(-t/τ)) with τ=(R2)*C. The capacitor shown is the device you are trying to measure. The resistor going to PortB2 should be around 100 ohms to limit current. You must choose R2 so that the capacitor charging time is not too short or too long. If it is too short you will lose measurement accuracy. It if is too long, the timer will overflow.

If you decide to print floating point numbers to the LCD you need to follow the directions in Using sprintf function for float numbers in AVR-GCC the AVRstudio directions are at the bottom of the page, but NOTE that one library is left out. The correct summary is: Open the Project>Project Configuration dialog box, then go to the custom options , then select linker options, and then add the
-Wl,-u,vfprintf -lprintf_flt switches.

Your program will have to (in time order):

  1. Set PortB3 to an input.
  2. Drive PortB2 to zero by making it an output and wait long enough to discharge the capacitor through 100 ohms. Clearly, to dischage to zero volts with 1% accuracy, R2>100*(100ohms).
  3. Convert PortB2 to an input and start a timer. The capacitor will start to charge toward Vcc.
  4. Detect when the voltage at PortB2 is greater than than the voltage at PortB3. That is, you will have to record when the comparator changes state. You could do this by polling the ACO bit of the ACSR and stopping the clock when ACO changes state, but a much better way to do it is to use the timer1 input capture function set up to be triggered by the comparator. Using input capture gives better timing accuracy and more dynamic range.
  5. Repeat

I suggest that you organize the program as follows:


Timing of all functions in this lab, and every exercise in this course will be handled by interrupt-driven counters, not by software wait-loops. This will be enforced because wait-loops are hard to debug and tend to limit multitasking.

Write a C program which will:

When you demonstrate the program to a staff member, you should demonstrate that the capacitance is correct within the tolerance of the resistors you use. Your program should not need to be reset during the demo.

Your written lab report should include the sections mentioned in the policy page, and :

Copyright Cornell University January 20, 2011