How to get started with microcontrollers - Part 1

Basics with Atmel microcontrollers
Author: Aki Korhonen
Published: 26.01.2009
In English In English
Suomeksi Suomeksi

Example 3: 5-LED scanner, aka Knight Rider lights

You might have read Metku's couple old modding articles about animating leds (Animated Leds 1 and Animated Leds 2) that were made few years ago. Now we make a same kind of system with a microcontroller. The main advantages of using a microcontroller instead of a normal IC is that you can program the microcontroller to do what ever animations you like without changing the physical arranging of the leds. Just write a new sequence, plug the programming cable to the chip and transfer the new code in and vóila.

If you are experiencing errors while trying to program the chip (such as 'Device not found' etc) try removing the leds from pins 5, 6 and 7, which are used for programming (the leds take their power from the programming lines and the chip doesn't get enough juice to be able to be programmed). Then after the programming has finished, connect the leds back. Easy fix to this would be that you have a common ground to all of the leds and you just disconnect the "led ground" from the "main ground" while programming.


How to get started with microcontrollers - Part 1
More leds added to the original circuit

// Frequency number needed by the delay function.
// The chip is factory set to run on internal
// oscillator at 1 MHz so the value is 1000000UL
#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

// Number of frames in the animation
#define FRAMES 8

// The animation sequence array.
// All the values are in binary for easy
// reading (1 = LED on / 0 = LED off)
// The rightmost bit is PB0 and the leftmost
// bit after '0b' is PB4.
// -> 0b[4][3][2][1][0]
char animation[FRAMES] =

int main(void)
	DDRB = 0x1F; // PB0-PB4 output
	PORTB = 0x00; // Set all pins low
	int i;
		// Loop through all the frames in the animation
		for(i=0 ; i<FRAMES ; i++)
			// Write the value from the array to the port
			PORTB = animation[i];
			// Wait 100 ms before going to the next frame
	return 0;


How to get started with microcontrollers - Part 1
Example 3 in action


We hope that you got your rig set up and leds flashing with the instructions. Please leave a comment or a question if you have something to ask. There is a part two of the article on planning stage and you can drop some ideas to the comments section about what you might want to see there (examples etc). All ideas and suggestions are taken into consideration and the most useful are then chosen.

Below are some useful links you might want to give a look at:
» Atmel AVR - Atmel's AVR product page
» AVR Freaks - AVR community, AVR related projects, forum etc
» Arduino - AVR based open-source prototyping platform
» Open Directory: AVR - More interesting links related to AVR

Also remember to register and post some photos of your device to AllTheMods (feel free to post your other mods too!)

Subscribe to
Digg It
Save This Page
Stumble it!
Add to Facebook

Related articles in

Animating Multilayered Engravings

Animated leds:Episode 2

Basic electricity


HDD Eyez

Led Resistor On-line calculator

Questions, Comments?. Visit the topic about this article on our forum.
  • 27.01.2009 12:58 zaketus

  • Great!
    I use ATtiny85s, ATmega8s and Arduino. ATtiny85 is same as ATtiny45 that was used in article, but it has more flash memory (more than enough for small projects). With small package, low price and great performance it's great uC to start with.

    Only sky is the limit when it comes to uC projects. For example it's possible to scan many buttons with one i/o pin by making voltage divider with resistors and using ADC (analog to digital converter).

    There are lots of libraries to be used when interfacing some devices (like some LCDs (nokia 3310's display for example)), so it's easier to make something. After some time, it gets easier to modify those libraries, due the learned stuff.

    And what comes to programming languages... I started with C then tried Bascom-AVR (it's like telling uC what to do, in english :P) and then came back to C. The real fun will begin shortly, when I start programming with ASM :D

    One advice for starters: print (or draw) picture of you uC with pinout to paper, open texteditor (or AVR-Studio...what ever you use from writing your programs) to half of the screen and open your uC's datasheet to another half of the screen. This way you don't need to "surf" through the windows.

    I've been thinking to make that USBasp for long long time... Maybe I'll make it someday, so I can use my eee from programming uC:s (except pics...still have to program them with desktop pc).

    Hmmph too lazy to translate this to finnish... Hopefully everyone understands what I wrote. If you don't, just ask.

    E: AVRFreaks's (link also in article, forums are great place to search AVR related stuff. Lots of tutorials, projects, questions and answers related to common and not so common problems... EVERYTHING and more.

    Everyone who plays with uC:s raise your hand!

    o/ -One AVR and pic user over here!
  • 27.01.2009 23:09 Zyrppa

  • Itse käyttäisi mikrokontrollereita, mutta en ole opetellut C:tä eikä oikein innosta ruveta harjoittelemaan sitä.
    Onko C-kieli paljonkin vaikeampaa kuin PHP? Esimerkkikoodeista ymmärsin kyllä osan, mutta esim. nuo heksajutut menevät yli hilseen.
  • 27.01.2009 23:11 qwerty

  • Odotan innolla jatkoa...
  • 27.01.2009 23:15 japala

  • PHP ja C ovat hyvinkin lähellä toisiaan loppupeleissä. Noi hex tai yleensäkin luvut, kun mennään pois kymmenjärjestelmästä voivat tuntua aluksi hankalilta mutta, kun ymmärtää mitä noilla luvuilla koetetaan ohjaimelle sanoa niin kyllä niitä oppii sitten käyttämäänkin. Ihan säännöt noiden käyttöön on, ei ole salatiede kyseessä. :) Yleensä noi alun heksatkin menee enemmän tai vähemmän samoilla lähtöarvoilla, joten voi panostaa sitten tuohon C-koodin vääntöön.
  • 28.01.2009 00:09 zaketus

  • DDRB = 0x1F; kohta voidaan kirjoittaa myös binäärimuodossa:
    DDRB = 0b00011111;

    Molemmat tekevät saman jutun... PB0-PB4 asetetaan ulostuloiksi. Kuten saattaa huomata, viisi oikeanpuoleista numeroa ovat ykkösiä (PB0-PB4 -> viisi pinniä, jotka on asetettu ulostuloiksi) , loput ovat nollia. Tuota 0b:n perässä olevaa lukua lähdetään lukemaan oikealta: ensimmäinen on bit0, seuraava on bit1, seuraava on bit2 jne.
    Samaa 0b******** muotoa voidaan käyttää myös muihin rekistereihin kirjoitettaessa.

    DDRB on tiedon kulkusuunta -rekisteri B-portille. Kyseinen rekisteri sisältää kahdeksan bittiä. ATtiny15/-25/-45/-85 piireissä on vain B-portti ja siinäkin on vain kuusi i/o-pinniä. Tällöin siis esim DDRC:llä ei voi määritellä piirin pinnien input/output tyyppiä.

    Eli jos DDRB:n bit* on ykkönen, on PB* ulostulo. Jos DDRB:n bit* taasen nolla on PB*....aivan, sisääntulo.

    Pitkähkö viesti kirjoitettuna puoliunissaan tietää harvoin hyvää, mutta otan riskin.
  • 28.01.2009 02:21 toffie

  • first thing, great guide!
    second thing, bad people from Finland posting replies here in Finnish ;)

    poor Swedes and all others :D
    anyway.. great guide and I really look forward to next part!

    ideas for next part.. why not make an uC control one servo and one dc engine on the same circuit?
    controlled by two buttons each, back/forward for the engine and left/right for the servo..

    that would be a project I would like to follow and try out myself if you could get the software for it, as I just cant understand C programming yet ;)
    I have no problems with PHP as I've worked it for a couple of years, so I know the basics in programming.. but learning C for an uC, that isnt the easiest.. for now :D

    looking forward to part 2 !! :)

    // Chris from SweMOD ;)
  • 28.01.2009 08:19 japala

  • It seems that motors are something that our friends on channen in IRC are also interested in. I too feel that this could be a good choice for the next topic. If not in the part 2 but at least in parts that follow it.
  • 28.01.2009 11:12 Mipi

  • Japala; Could you post schematics & code from your projects (water heat indicator, etc.) as an example? They would make a great self-study material.
  • 29.01.2009 01:18 Jipa

  • zaketus wrote:
    DDRB = 0x1F; can also be written in binary:
    DDRB = 0b00011111;

    I'm slowly starting to remember stuff from the school :D After all I DID go through the four year school and SHOULD know this stuff... I just haven't used it for a year now... Most likely some day I'll get back to that :)
  • 17.02.2009 22:45 deadman

  • koskas seuraava osa tulee?
  • 03.03.2009 07:56 Wilzu

  • Jos mahdollista, voisitteko seuraavaan osioon laittaa myös vaihtoehtoisia tapoja toteuttaa nuo koodit? Meillä koulussa tuollainen ritariässävalo on tehty hitusen eri tavalla, joten en kaikkia koodinpätkiä ihan ymmärtänyt. Myöskään C-kielestä yleisestiottaen ei liikaa ole kokemusta, joten joku pieni "sanakirja" mitä mikäkin komento tarkoittaa tai linkki johonkin idioottivarmaan oppaaseen olisi tosi jees..
  • 03.03.2009 13:44 Jack_Hammer

  • Ensi jaksossa jotakin mutkikkaanpaa ku ledien välkyttelyä, esim. automaattinen tuulettimensäädin.
  • 04.03.2009 19:42 gNome^

  • Meneekin mahdottoman mutkikkaaksi ;)

    A nice guide

    Anyone who is interested in embedded projects and µC's should check out I noticed that Japala is registered there also.

    And for converting hex to binary to decimal and back again, Windows calculator does this automatically.

    Hopefully we'll see more of this, since embedded systems are becoming a trend in modding these days.
  • 07.04.2009 16:24 Wilzu

  • Missäs vaiheessa seuraava osuus tutoriaalista on? atinyssä ei taida olla a/d-muuntimia, joten nuo säätimet taitavat olla vähän utopistisia?

    Tosiaan olisi hyvä jos raapaistaisiin vähän syvemmin sitä ohjelmointipuolta. Ei nuo normaalit c-kielen oppaat oikein sytytä, kun yleensä niiden avulla ei tehdä mitään konkreettista..
  • 07.04.2009 21:53 zaketus

  • *Kuulemani mukaan jatkoa on tulossa ja vieläpä ihan mukavalla sisällölläkin... mutta sitä odotellessa (luvassa odottamisen arvoista tavaraa, tekijän tietäen):*
    AVR-Freaksin foorumeilla tutorials-osiossa on kyllä todella hyviä ohjelmointioppaita. Sieltä löytyy ihan step-by-step vinkkejä. Lähtökohtana ihan selkokielellä ohjelma kohta kohdalta ja aina pienin askelin vaihdetaan selkokieli C:ksi. Sieltä löytyy hyvät oppaat niin ADC:n, PWM:n, keskeytyksien, kuin monen muunkin ominaisuuden käyttöön. Näitä kun yhdistelee/muokkailee oman mielen/tarpeen mukaan, pääsee jo pitkälle. Isojen projektien tekohan on usein melko pitkälti ihan perinteisten ominaisuuksien yhdistelyä oman tarpeen mukaan.

    Edit: Ja monissa ATtinyissä on ADC. Myös noissa ATtiny15, -25, -45 ja -85.

  • 07.04.2009 22:48 japala

  • Höh, ei näin. Ei innostunutta lukijaa heti ensimmäisenä ohjata muualle vaan naputetaan se juttu!!!11 ;)
  • 08.04.2009 01:09 AK

  • Jutun toinen osa valmistuu pikkuhiljaa. Näillä näkyvin luvassa ainakin jotain moottoreihin liittyvää, vilkutellaan ledejä vähän eri tavalla, laitetaan kontrolleri jutustelemaan tietokoneen kanssa ja varmaankin jotain a/d-muuntimeen liittyvää.

    And repeats in english; the second part of the article is on its way and there should be something related to motors, a bit different led flashing, controller talking with the computer and something related to a/d-converters.

    [quote="japala"]Höh, ei näin. Ei innostunutta lukijaa heti ensimmäisenä ohjata muualle vaan naputetaan se juttu!!!11 ;)[/quote]
    Taisi mennä henkilöt sekaisin? ;)
  • 08.04.2009 07:29 japala

  • "Missä se edit-nappula onkaan !%#&#" ... Heh, no juu, myönnetään. :roll:
  • 07.07.2009 08:14 Bramfeld

  • Tulee mieleen vain yksi kysymys. Mistä ihmeestä noita Atmelin mikrokontrollereita voi ostaa? Ei tunnu löytyvän oikein mistään.
  • 07.07.2009 16:16 Bramfeld

  • [quote="gNome^"]

    sieltä niitä saa. muitakin nettikauppoja varmaan on, mutta noilla on pärjätty tähän asti.[/quote]

    Ja mitenkä ihmeessä tilata sieltä yksityishenkilönä?
  • 08.07.2009 15:58 Bramfeld

  • Tämä oli aluksi ihan huvittavaa, mutta nyt se on lähinnä surullista... On mielenkiintoista että näitä siruja voisi ohjelmoida kymmenvuotias lapsikin ainakin tämän oppaan kanssa, mutta niitä ei yksityishenkilönä voi ostaa mistään. Olen oikeasti selaillut googlea tässä jo pari päivää eikä niitä saa ostettua mistään. Noilla farnellin jälleenmyyjillä ei yhdelläkään taida olla lainkaan atmelin tuotteita. Partcolta voisi tilata toki yksityishenkilönä mutta siellä ei ole attiny25/45 siruja. Tottakai niitä ulkomailta löytyisi, mutta siinä tulee kivat postikulut mukaan, joten ei oikein huvita tilata kokeilun vuoksi. Paras minkä olen löytänyt on Tietopetri Oy, mutta se nyt tuntuu hieman pimeältä kaupalta. Mistä te hyvät ihmiset oikeasti hommaate näitä siruja?
  • 09.07.2009 13:26 zaketus

  • Itse olen muutamaankin kertaan tilaillut Tietopetriltä (ja Tietomyrkyltä) piirejä ja jotain muutakin ihan hyvällä kokemuksella.
    Kerran ei ollut tilattua tuotetta hyllyssä, joten lähettivät sähköpostia asiasta ja ehdottivat, mitkä tuotteet voisivat kelvata tilalle jne. Jotkut kaupat saattavat ilmoittamatta etukäteen odottaa, kunnes tuotetta saapuu ja lähettävät sitten. Tai sitten saattavat pistää jotain "vastaavia" tuotteita tilalle.

    Toimitus ja asiakaspalvelu toimii mielestäni erinomaisesti ainakin sähköisesti asioidessa. Hinnatkaan eivät (ainakaan tilaamissani tuotteissa) ole olleet kovin korkeita Suomen hintatasolla. Toki piirit maksavat hieman enemmän kuin esimerkiksi Farnellilla yms, mutta silti ovat usein "kohtuullisia".

    EDIT: Kannattaa myös kysyä esimerkiksi Farnellin jälleenmyyjiltä, voivatko he toimittaa Farnellin valikoimissa olevia piirejä, mikäli niitä ei jälleenmyjän valikoimista löydy. Sain juuri vastauksen K-S Elektroniikalta (eräs Farnellin jällenmyyjä), että he saavat tarvittaessa hankittua avr-piirejä esimerkiksi Farnellilta.
  • 24.11.2009 17:47 anmo1257

  • I did a double check of all my wiring and eventhough I have an error at the time of trying to download the code into my ATtiny25 (unknown device (-24), have you ever gone through this kind of error ???
  • 24.11.2009 18:32 AK

  • >> "I did a double check of all my wiring and eventhough I have an error at the time of trying to download the code into my ATtiny25 (unknown device (-24), have you ever gone through this kind of error ???"

    Are you using the passive or active parallel port programming cable and are you using a laptop or a normal computer for programming? If you're using the passive cable and a laptop (although this problem might exist with a normal computer also) the voltage levels might be to low for programming. In this case I'd suggest you to first test it with another computer (or two) or maybe consider building the active cable.

Pages:  1 2 3 4 5 6 

  Content in english!
  Sisältö suomeksi!


 .:Back to top Bandwidth by Mpoli

Copyright ©, All Rights Reserved.
All content and graphics in MetkuMods are sole property of Jani Pönkkö and may not be reproduced or copied in any manner without written permission from him.
All brand names, trademarks and copyrights are the property of their respective owners.Privacy Policy