                     Avr-Microcontrollers-in-Linux-Howto

   Revision History
   Revision 44        2009-04-20 17:13:07      Revised by: jdd
   obfuscate e-mail at the author demand
   Revision 43        2009-03-29 20:49:12      Revised by: ranjeeth
   Revision 42        2009-03-29 20:45:09      Revised by: jdd
   reverting after publication
   Revision 41        2009-03-29 20:41:59      Revised by: jdd
   edit to export docbook
   Revision 40        2009-03-28 21:07:57      Revised by: RickMoen
   Adjust style of mailto link to author's original preference.
   Revision 39        2009-03-28 21:05:45      Revised by: RickMoen
   Revert e-mail obfuscation, supply some missing punctuation, [re-]fix
   capitalisation, fix and clarify new run-on sentence.
   Revision 38        2009-03-23 18:21:24      Revised by: ranjeeth
   Revision 37        2009-03-23 18:19:51      Revised by: ranjeeth
   Revision 36        2009-03-23 17:20:32      Revised by: ranjeeth
   Revision 35        2009-03-23 17:19:47      Revised by: ranjeeth
   Revision 34        2009-03-23 10:26:00      Revised by: jdd
   publishing tests
   Revision 33        2009-03-23 10:25:06      Revised by: jdd
   Revision 32        2009-03-23 10:24:24      Revised by: jdd
   use of macro to obfuscate e-mail
   Revision 31        2009-03-23 10:11:47      Revised by: jdd
   change was only to export docbook without admonitions
   Revision 30        2009-03-23 10:09:15      Revised by: jdd
   Revision 29        2009-03-23 10:05:07      Revised by: jdd
   Revision 28        2009-03-23 09:58:40      Revised by: jdd
   adding the wiki as link
   Revision 27        2009-03-23 09:53:28      Revised by: RickMoen
   Insert needed space characters into "pin9", "pin10", "pin25" constructs
   Revision 26        2009-03-23 09:49:05      Revised by: RickMoen
   Make markup of all the software items mentioned be consistent
   Revision 25        2009-03-23 09:43:40      Revised by: RickMoen
   Remove a couple of stray commas.
   Revision 24        2009-03-23 09:41:30      Revised by: RickMoen
   Polishing up a few last bits of punctuation
   Revision 23        2009-03-23 04:11:31      Revised by: ranjeeth
   Revision 22        2009-03-23 04:10:34      Revised by: ranjeeth
   Revision 21        2009-03-23 04:09:07      Revised by: ranjeeth
   Revision 20        2009-03-17 16:20:27      Revised by: ranjeeth
   Revision 19        2009-03-17 16:18:33      Revised by: ranjeeth
   Revision 18        2009-03-16 19:10:30      Revised by: RickMoen
   Fix hyperlink, fix English diction of new sentence.
   Revision 17        2009-03-16 18:50:19      Revised by: ranjeeth
   Revision 16        2009-03-16 11:36:49      Revised by: RickMoen
   A couple of punctuation nits
   Revision 15        2009-03-16 11:21:14      Revised by: RickMoen
   Corrected numerous run-on sentences, punctuation and grammar errors, and
   questionable idiom.
   Revision 14        2009-03-15 10:27:24      Revised by: BordenRhodes
   Cleaned up basic grammar and spelling
   Revision 13        2009-03-15 09:52:41      Revised by: jdd
   Revision 12        2009-03-15 09:51:37      Revised by: jdd
   add link to the manual of avr-libc
   Revision 11        2009-03-14 21:47:18      Revised by: jdd
   end of basic conversion
   Revision 10        2009-03-14 21:40:18      Revised by: jdd
   Revision 9         2009-03-14 21:39:26      Revised by: jdd
   Revision 8         2009-03-14 21:33:04      Revised by: jdd
   add the image
   Revision 7         2009-03-14 21:27:59      Revised by: jdd
   Revision 6         2009-03-14 21:26:48      Revised by: jdd
   Revision 5         2009-03-14 21:25:13      Revised by: jdd
   Firts step - conversion fro html by jdd and basic format edition
   Revision 4         2009-03-14 21:22:37      Revised by: jdd
   Revision 3         2009-03-14 21:18:25      Revised by: jdd
   Revision 2         2009-03-14 21:13:09      Revised by: jdd
   Revision 1         2009-03-14 21:10:33      Revised by: jdd

   ------------------------------------------------------------------------

   Table of Contents

   1. HOWTO

   2. AVR Microcontrollers in Linux HOWTO

                2.1. Licence

                2.2. What Is a Microcontroller?

                2.3. Software Required

                2.4. Hello World

                2.5. Author

                2.6. Last version

                                   1. HOWTO

   AVR Microcontrollers in Linux HOWTO, Copyright (C) 2009 Ranjeeth p t
   (ranjeeth_gecmail[at]yahoo[dot]com)

   This HOWTO is for readers wishing to program an AVR microcontroller
   using a GNU/Linux machine. For burning your code, we will be using a
   parallel port. You may need other electronics components (like a few
   resistors, capacitors, parallel port connector, etc.), which can be
   bought from any electronics shop.

   ------------------------------------------------------------------------

                    2. AVR Microcontrollers in Linux HOWTO

2.1. Licence

         Permission is granted to copy, distribute, and/or modify this
         document under the terms of the GNU Free Documentation License,
         Version 1.2, or any later version published by the Free Software
         Foundation; with no Invariant Sections, no Front-Cover Texts, and
         no Back-Cover Texts.  A copy of the license is included in the
         section entitled "GNU Free Documentation License".

   [http://wiki.tldp.org/LdpWikiDefaultLicence#GNUFreeDocumentationLicense]
   GNU Free Documentation License

   ------------------------------------------------------------------------

2.2. What Is a Microcontroller?

   A microcontroller is a single-chip computer. It has internal RAM, ROM,
   timers, counters, interrupt circuitry, I/O ports, analog comparators,
   serial USARTs, analog to digital converters, watchdog timers, and a RISC
   architecture. When you are using a microprocessor, you cannot program it
   alone. You need other components, like RAM, ROM, timers, etc. For
   programming, you should know its architecture thoroughly: You must read
   the datasheet for your microcontroller.

   ------------------------------------------------------------------------

2.3. Software Required

   binutils: Tools like the assembler, linker, etc.

   gcc-avr: The GNU C compiler (cross-compiler for avr).

   avr-libc: Package for the AVR C library, containing many utility
   functions.

   uisp: A Micro In-System Programmer for Atmel's AVR MCUs (for burning
   code to MCUs' memory).

   The following Atmel microcontrollers are supported by avr-gcc in Linux:

   at90s Type Devices

   at90s2313, at90s2323, at90s2333, at90s2343, at90s4414, at90s4433,
   at90s4434, at90s8515, at90s8515, at90s8515, at90s8535, at90s1200.

   atmega Type Devices

   atmega103, atmega603, atmega8, atmega48, atmega88, atmega8515,
   atmega8535, atmega16, atmega161, atmega162, atmega163, atmega165,
   atmega168, atmega169, atmega32, atmega323, atmega325, atmega3250,
   atmega64, atmega645, atmega6450, atmega128.

   attiny Type Devices

   attiny22, attiny26, attiny26, attiny13, attiny13, attiny13, attiny13,
   attiny2313, attiny11, attiny12, attiny15, attiny28.

   Other AVR Devices

   avr2, at90c8534, at86rf401, avr3, at43usb320, at43usb355, at76c711,
   avr4, avr5, at90can128, at94k, avr1.

   binutils: Programs to manipulate binary and object files that may have
   been created for Atmel's AVR architecture. This package is primarily for
   AVR developers and cross-compilers.

   gcc-avr: The GNU C compiler, a fairly portable optimising compiler that
   supports multiple languages. This package includes C language support.

   avr-libc: Standard library used for developing C programs for Atmel AVR
   microcontrollers. This package contains static libraries, as well as
   needed header files.

   uisp: Utility to program AVR chips with object code created by gcc-avr.
   It supports in-system programming.

   You download the above packages untar, configure, and install it. If you
   are using Debian or Ubuntu, these packages are available in your
   distribution: Install them using apt or synaptic package manager.

   ------------------------------------------------------------------------

2.4. Hello World

   We are writing hello world for the atmega8 microcontroller, which has a
   28-pin, 8-bit, RISC architecture.

   Before proceeding, have a look at
   [http://www.nongnu.org/avr-libc/user-manual/] this manual about
   __avr-libc__, which will help you program better, and understand. Also,
   refer to the datasheets for the various AVR microcontrollers.

   Here is our first program:

   /* ledblink.c, an LED blinking program */
   #include<avr/io.h>
   #include<util/delay.h>
   void sleep(uint8_t millisec)
   {
           while(millisec)

           {
                   _delay_ms(1);/* 1 ms delay */
                   millisec--;
           }
   }
   main()
   {

           DDRC |=1<<PC2;  /* PC2 will now be the output pin */
           while(1)
           {
                   PORTC &= ~(1<<PC2);/* PC2 LOW */
                   sleep(100);/* 100 ms delay */

                   PORTC |=(1<<PC2); /* PC2 HIGH */
                   sleep(100);/* 100 ms delay */
           }
   }

   ------------------------------------------------------------------------

  2.4.1. Code Explanation

   The GNU C compiler for the Atmel family identifies all functional units
   within the microcontroller with meaningful names. Thus, writing
   `PORTC=0xff' will result in the compiler generating machine code that
   writes 0xff to I/O port C, which will set all port C pins to logic high.
   Because ports are bidirectional, we must decide whether each pin should
   act as input or output. If the i'th bit of a register called DDRC (data
   direction register C) is 1, then the i'th pin of PORTC's i'th pin will
   be an output. Otherwise, it will act as an input pin. (Note that pin and
   bit numbers start at zero.) To make an LED blink, you have to make a pin
   high, then low. (Here, we use PORTC's 2^nd port. That is, PC2 will be
   the 25^th pin.) There should be a delay between the two. This is what
   the rest of the code does. For the delay, we use built-in function
   _delay_ms(1), which causes a 1 ms delay.

   ------------------------------------------------------------------------

  2.4.2. Compilation

   avr-gcc -mmcu=atmega8 Os ledblink.c o ledblink.o

   which will result in object file ledblink.o. Now, we will covert it to
   hex file, suitable for burning to the microcontroller's memory.

   avr-objcopy -j .text -j .data -O ihex  ledblink.o  ledblink.hex

   We are converting it to a hex file because, for burning the code to
   atmega8, we will use uisp, whose input file must be a .hex file.

   Notice that you can less the ledblink.hex file.

   :1000000012C02BC02AC029C028C027C026C025C0C6
   :1000100024C023C022C021C020C01FC01EC01DC0DC
   :100020001CC01BC01AC011241FBECFE5D4E0DEBF28
   :10003000CDBF10E0A0E6B0E0EAE8F0E002C0059035
   :100040000D92A036B107D9F710E0A0E6B0E001C0EC
   :100050001D92A036B107E1F70CC0D2CF282FE4ECF7
   :10006000F9E004C0CF010197F1F721502223D1F725
   :100070000895CFE5D4E0DEBFCDBFA29AAA9884E66A

   :0A008000EDDFAA9A84E6EADFF9CF6B
   :00000001FF

   ------------------------------------------------------------------------

  2.4.3. Burning the Code

    2.4.3.1. Hardware

   We will be using the parallel port for burning. First, we have to
   develop a burning circuit for it.

   This is the circuit for the atmega8 microcontroller. Pin 9 & pin 10 are
   connected by a 4 MHz crystal oscillator, which is the external clock.
   The bottom right connector is for a parallel port.

   If you are using any other microcontroller, as mentioned above, you
   should change accordingly. }}}

   You should watch for RESET,XTAL1,XTAL2,SCK,MISO,MOSI pins,  and connect.

   ------------------------------------------------------------------------

    2.4.3.2. Software

   Now, we will burn ledblink.hex to the microcontroller.

   uisp -dprog=dapa -dlpt=0x378

   You should get message Atmega8 Found.

   dprog is the programming method specifier, which in this case is dapa,
   i.e., Direct AVR Parallel Access. dlpt is for the parallel device
   setting, which is 0x378, the parallel port's device address.

   uisp -dprog=dapa -dlpt=0x378 --erase

   Will erase the microcontroller's code.

   uisp -dprog=dapa -dlpt=0x378 --upload if=ledblink.hex

   Will upload the Input File ledblink.hex

   Notice that you can see the LED at pin 25 blinking.

   ------------------------------------------------------------------------

2.5. Author

   Comments to: [mailto:ranjeeth_gecmail[at]yahoo[dot]com]
   mailto:ranjeeth_gecmail[at]yahoo[dot]com

   [http://ranjeethpt.wordpress.com] Ranjeeth Weblog

   Govt Engg College Sreekrishnapuram,

   Palakkad,Kerala India.

   ------------------------------------------------------------------------

2.6. Last version

   You may find the last up-to-date version of this HOWTO
   [http://wiki.tldp.org/Avr-Microcontrollers-in-Linux-Howto] on the LDP
   wiki.
