Lab 2: AVR Programming
Assigned: Wednesday, October 5
The goal of this lab is to become familiar with the ins and outs of
programming on the AVR mini.
0. Set up your environment to use the AVR
a. Follow OS specific instructions for installing the AVR environment
planetCCRMA@ccrma : planetCCRMA@home : linux : mac : windows
b. Make, in your home directory make a 250a/labs
directory.
~> _
~> mkdir 250a
~/250a> cd 250a
~/250a> mkdir labs
~> _
c. download the lab2 demo files into the labs directory.
~/250a/labs> gunzip lab2.tar.gz
~/250a/labs> tar -xvf lab2.tar
d. Set up AVRmini connection to PC
Connect power cable, connect serial cable to right hand port, and
power-up the AVRmini
d. Test AVR setup with "flash" test code
(windows users using an IDE like AVRStudio rather than the Unix like Cygwin approach, will need to eek out your own method of compiling and loading with that IDE).
In the
lab2/flash
folder, compile and download the code to the AVRmini: Press the RESET button on
the AVRmini and within 2 seconds type:
make load
You should see a sort of makeshift progress bar as a bunch of "#"
characters print in the terminal window. If the program transferred successfully, then press
RESET again.
Make sure that one end of the ribbon cable is attached to PBLED and the other to PORTB
If everything is working, a LED on the AVRmini board should start
flashing.
1. AVRMini Input/Output
a. Review architecture and programming, as necessary (all of these references are availible on the resources page)
b. Momentary pushbutton
Optional: Toggle pushbutton using debounce.
- Compile and load TOGGLE from the lab2/toggle folder.
- Look at the code in an editor. Compare button.c and toggle.c. Why
is there a debounce mechanism in toggle.c but not in button.c? How does
the debounce mechanism work?
- What happens if you change the debounce threshold to 1? (hint -
try toggling the LED 10 times)
- What happens if you change the debounce threshold to 30000?
- Can you change it to 100000? (hint - you need to change something
else, too. DO NOT SPEND MORE THAN 5 MINUTES TRYING TO FIGURE THIS OUT!)
- Especially optional section: instruction counting and timing
- Really, we mean it, don't waste time on this unless it
fascinates you
- Create the file button.ss by typing make button.ss
- Look at button.ss - these are the instructions that are
actually written to the microprocessor.
- Look in the two sections <checkButton> and <main>.
Each line corresponds to one instruction of the microprocessor. What
debounce threshold value would give approximately 1 second of delay
between the button press and the LED lighting up? (Hint: you will need
to look at the Atmel
Instruction Set documentation.)
- Why is using a very high debounce threshold a bad way to
implement a 1 second delay? (There are at least three good reasons.)
- The best way to implement a 1 second delay is with the timer
library in avrlib. Put the debounce threshold back to a reasonable
value for debouncing and reintroduce the 1 second delay properly:
- Add #include "timer.h" at the top of toggle.c
- Add timerInit(); to the beginning of your main()
procedure but after your varaible declariations..
- To find out specific functionality of timerPause() see "Globals" in Pacal's avrlib documentation.
- Add a call to the timerPause() procedure in the
right place in your program.
- In your makefile, add $(AVRLIB)/timer.c to the list
of files in the definition of SRC
The new makefile line should look like this:
SRC= $(TRG).c $(AVRLIB)/timer.c
- Find the maximum delay time before you can notice a pause between
the button press and the LED illuminating.
c. Four buttons:
- Write a program to control 4 LEDs with 4 buttons. It's up to you
to do some "interaction design": think of your own way for actions with
the four buttons to control the states of the LEDs. Feel free to write
this program from scratch, but we recommend that you start with the
FOURBUTTON demo.
d. Beep:
- Load BUTTONBEEP as you did BUTTON and FLASH above.
- Make sure the blue wire from your speaker is connected to pin D5
and the black wire from the speaker to ground.
- You should hear a beep when you press SW4.
- Try inserting a pause between turning on the LED and playing the
beep. In case you didn't do part 3b, here are the step-by-step
instructions for using the avrlib's timer facilities:
- Add #include "timer.h" at the top of buttonbeep.c
- Add timerInit(); to the beginning of your main()
procedure.
- Add a call to the timerPause() procedure in the
right place in your program.
- In your makefile, add $(AVRLIB)/timer.c to the list
of files in the definition of SRC
- At what point does the delay become noticeable? What if the beep
comes before the light?
- Try finding the largest unnoticeable delay time as in #3 using
the beep as feedback. Is it different?
3. Compile, Run and Play the AVRsimon:
- Compile and load AVRsimon (lab2/avrsimon):
- You should now be able to play the Simon game provided. Pay
attention to things you like and dislike about the flow of the game and
the interaction.
- Improve the game to make it more interesting and engaging. Here
are some suggestions, but feel free to come up with others:
- Keep stats - this is an easy addition involving adding two
counters for correct and incorrect performance, and adding a way to
start a new game without the reset button.
- Add levels of play - make it get progressively more difficult
(e.g., longer patterns, increasing tempo)
- Make it more interactive - give the user more choices on the
style of the game (e.g., select a level)
- Add timing - Try to evaluate the user's rhythmic accuracy
- Change the nature of the game somehow