Skriven av: Benjamin Vedder
Skapad: 2009-05-28
Senast uppdaterad: 2012-04-03
Kontakt: vedder at student.chalmers.se
Diskutera artikeln på forumet → Guider: Linux: AVR, Linux och Eclipse
Den här guiden beskriver hur man kommer igång med programmering av alla 8-bitars AVR-mikroprocessorer från Atmel under Ubuntu Linux. Användare av andra distributioner kan säker hitta det som krävs för att komma igång här också, men guiden riktar sig framför allt till användare av Ubuntu 8.04, 8.10, 9.04, 9.10, 10.04 och 10.10 för tillfället.
Syftet med den här guiden är att tjäna som en referens för såväl nya som erfarna programmerare. Nya programmerare bör efter detta kunna skriva ett Hello world program. Mer erfarna programmerare som tidigare har jobbat med exempelvis AVR studio under windows bör känna sig som hemma (och säkert bättre med eclipse
) efter denna guide, under Linux.
Som många säkert redan vet använder man sig av avr-gcc som kompilator och avr-libc som funktionsbibliotek när man programmerar 8-bitars mikroprocessorer från AVR. Nya versioner (2009-2010) av dessa paket finns i programvaruförråden hos Ubuntu från början, och det följer hur man hämtar dessa. Så de som är oroliga för att inte ha tillgång till alla standardfunktioner kan andas ut nu. Utöver detta behöver man kunna ladda ner de kompilerade programmen till mikroprocessorn, och även för detta finns paket i förråden, så att använda USB-programmerare ska inte visa sig vara ett problem.
Eclipse är en mycket kraftfull utvecklingsmiljö som från början var utvecklad för att skriva Java-kod, men nu finns hundratusentals plugin till Eclipse (ja, det finns hur många som helst) så det finns även stöd för andra programmeringsspråk som c och c++. Det finns även en mycket kraftfull plugin som är till för att jobba med AVR-mikroprocessorer, så allt man förväntar sig kunna göra under hela programmeringsprocessen bör vara möjligt med en och samma utvecklingsmiljö. (se skärmdumpar nedan)
Börja med att ta ner några paket från programvaruförråden. Dessa är gcc-avr, avr-libc, binutils-avr, avrdude, samt gdb-avr, för debugging. Dessa paket kan enkelt hämtas med pakethanteraren synaptic, alternativt kan men öppna en terminal (Program > Tillbehör > Terminal) och skriva:
sudo apt-get install gcc-avr gdb-avr avr-libc avrdude binutils-avr
NOTETA: ctrl + v fungerar inte i ett terminalfönster då denna kombination är reserverad för annat, men man kan högerklicka och välja klistra in (paste) eller trycka på shift + ins.
Eventuella beroenden kommer pakethanteraren ta hand om automatiskt.
Nu skulle man i princip kunna skriva kod med vilken textredigerare som helst, men en utvecklingsmiljö kan göra processen oerhört mycket smidigare, och utvecklingsmiljön som presenteras här är som tidigare nämnt, Eclipse.
Eclipse finns i programvaruförråden hos Ubuntu, men den versionen är gammal. En nyare version bör laddas ner från deras hemsida, och hur man gör det följer i nästa steg.
För att kunna använda usb-programmerare som en vanlig användare (dvs utan sudo) behöver man lägga till en fil under /etc/udev/rules.d/. Om man följer det här behöver man inte köra eclipse som root (med sudo) senare för att använda en usb-programmerare.
Öppna en terminal och skriv
sudo gedit /etc/udev/rules.d/39-mcu-programmers.rules
klistra in
# udev rules file for some usb connected mcu programmers
# only check subsystem 'usb' with device type 'usb_device', or subsystem 'usb_device'
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="mcu-prog_rules_continue"
SUBSYSTEM!="usb_device", GOTO="mcu-prog_rules_end"
LABEL="mcu-prog_rules_continue"
# only check when device is being added
ACTION!="add", GOTO="mcu-prog_rules_end"
# JTAG ICE mkII
SYSFS{idVendor}=="03eb", SYSFS{idProduct}=="2103", MODE="0660", GROUP="plugdev"
# Atmel AVRISP MkII
SYSFS{idVendor}=="03eb", SYSFS{idProduct}=="2104", MODE="0660", GROUP="plugdev", SYMLINK+="avrispmkII-%n"
# Atmel AVR Dragon
SYSFS{idVendor}=="03eb", SYSFS{idProduct}=="2107", MODE="0660", GROUP="plugdev"
# AVR Doper
SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05df", MODE="0660", GROUP="plugdev"
# Microchip PICkit 2
SYSFS{idVendor}=="04d8", SYSFS{idProduct}=="0033", MODE="0660", GROUP="plugdev", SYMLINK+="pickit2-%n"
LABEL="mcu-prog_rules_end"
spara och avsluta. Ladda om dessa regler med
sudo reload udev
eller om du kör en gammal version av ubuntu
sudo /etc/init.d/udev restart
Som det framgår i kommentarerna fungerar dessa regler till flera olika programmerare, även till en som är till PIC-mikroprocessorer.
Nu är det dags att ta ner och installera eclipse. Börja med att hämta eclipse från http://www.eclipse.org/downloads/. Hämta Eclipse Classic som finns längst ner på sidan.
Efter att nedladdningen är klar ska den nedladdade filen packas upp. Detta kan göras genom att högerklicka på filen och välja packa upp här. Då ska en mapp dyka upp som heter eclipse. Nu är det möjligt att köra eclipse direkt från denna mapp, men om man vill ha ordning på sina program bör man lägga eclipse-mappen under /opt/eclipse, vilket är standard under linux för program man installerat manuellt. För att göra detta måsta man vara administratör, så sudo bör användas igen. Förutsatt att den uppackade eclipse-mappen ligger i er hem-mapp (i mitt fall /home/benjamin) kan man flytta den till /opt/ med följande kommando i terminalen:
sudo mv eclipse /opt/
Nu vill man kunna starta eclipse från terminalen genom att skriva eclipse, och detta kan göras genom att skapa en symbolisk länk under /usr/bin. För att göra detta, skriv följande i en terminal:
sudo ln -s /opt/eclipse/eclipse /usr/bin/eclipse
Nu bör man kunna starta Eclipse genom att skriva eclipse i terminalen.
Om man vill ha en länk till eclipse i menyraden kan man högerklicka på denna (eller välja System > Inställningar > Huvudmeny) för att redigera den.
I nyare versioner av Ubuntu med Unity kan man redigera ”menyn” med ett program som heter alacarte. Installera det genom att skriva
sudo apt-get install alacarte
och öppna det sedan genom att skriva alacarte i en terminal eller från Unity. Sedan gäller samma procedur som beskrivs nedan.
Under programmering välj Nytt objekt
och ange följande (Kommandot är viktigt, namn kan vara vad som helst)
Starta eclipse med
eclipse
i en terminal eller från memyikonen om du skapade en sådan. Välj sedan i eclipse Help > Install new software
. Klicka där på Add och klistra in
http://avr-eclipse.sourceforge.net/updatesite/
i fältet Location
Markera den nya programvaran som kommer upp (någonting med AVR Eclipse plugin), installera den och starta om eclipse från menyn utan att vara root. (se http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download för mer information).
Nu när Eclipse är klart för att användas ska jag demonstrera hur man skriver ett enkelt blinkprogram för atmega168 samt hur man importerar introbotprogrammet och redigerar det.
På en helt ny arbetsyta (workspace) kommer eclipse att se ut så här:
Klicka då på workbench.
Som standard är eclipse inställt på att arbeta med java-kod, men vi vill skriva i c, assembler eller c++, så klicka på Window > Open Perspective > Other… och välj C/C++.
Nu bör Eclipse se ut så här:
Högerklicka i Project Explorer och välj New > C Project för att skapa ett nytt projekt, kalla det exempelvis Hello. Notera under projektträdet att avr-biblioteken redan är inkluderade i det nya projektet. Högerklicka på det nya projektet och välj New > Source File och kalla den exempelvis main.c. Notera att du måste ange att filen skall sluta på .c manuellt, och .h för headerfiler.
Nu är det dags att ställa in alla parametrar för projektet. Från huvudmenyn, välj Project > Properties, där väljer du AVRDude under AVR i panelen till vänster.
Först måste programmeraren konfigureras. Längst upp under fliken Programmer klickar du på New… för att skapa en ny konfiguration. Det kan se ut så här:
For AVRISP mkII (usb-programmeraren som finns på föreningen) bör det ställas in som i bilden ovan. Det man bör göra utöver att klicka på den från listan är att ställa porten (override default port) till usb. Klicka på OK, och glöm inte att klicka på apply under programmer-fliken. Klickar man inte på apply där kommer ingenting att ändras.
EDIT: För AVR Doper (programmerarbyggsatsen som säljs på föreningen) väljer man Atmel STK500 Version 2.x firmware från listan och ändrar porten till avrdoper
.
Välj sedan mikroprocessor under Targer Hardware i panelen till vänster.
Är programmeraren ipluggad kan man klicka på Load from MCU, så väljs rätt MCU automatiskt. Glöm inte att klicka på Apply här också.
Vill man ställa in FUSE-bitarna kan man enkelt göre det under AVRDude > Fuses:
Det finns även en fin editor för dessa:
som man kan komma in på om man klickar på Start editor knappen. Glöm inte Apply här heller.
Känner du för att ändra olika flaggor för kompilatorn och länkaren kan detta enkelt göras under C/C++ Build. Notera att Configuration står på Release.
Här följer ett litet testprogram som blinkar lysdioder. Det är designat för introbot07, men borde fungera till vilken atmega168 processor som helst, som har lysdioder på PB2 och PB3. De flesta testprogrammen brukar bara vara på ett par rader, vilket detta också skulle kunna vara, men jag tänkte passa på att demonstrera hur man använder avbrott ganska grundläggande. Det visar också hur fint det kommer att se ut i eclipse
.
/*
* main.c
*
* Created on: 2009-maj-28
* Author: benjamin
*/
#include <avr/io.h>
#include <avr/power.h>
#include <util/delay.h>
#include <avr/interrupt.h>
/*
* Avbrottsrutinen. Hit kommer vi varje gång timer 1 genererar ett "compare match" avbrott.
*/
ISR (TIMER1_COMPA_vect) {
/*
* Här kommer vi "toggla" den andra lysdioden. Att detta görs i ett avbrott
* är bara för att demonstrera avbrott.
*/
if (PORTB & _BV(PORTB3)) {
PORTB &= ~_BV(PORTB3);
} else {
PORTB |= _BV(PORTB3);
}
}
void init(void) {
/*
* Skala inte ner frekvenser. DVS, kör på 8 mhz. clock_prescale_set finns i
* avr/power.h. 8 mhz kanske är lite overkill för att blinka lysdioder, men
* detta är bara för att demonstrera hur man enkelt skalar om processorfrekvensen
* i mjukvara. Detta kan göras flera gånger i koden.
*/
clock_prescale_set(0);
// Port B2 och B3 som utgångar. (där finns lysdioder på introbot07)
DDRB |= _BV(PORTB2) | _BV(PORTB3);
// Fixa timer0 här.
TCCR1B |= _BV(CS12); // Prescale 256 till timer1.
TCCR1B |= _BV(WGM12); // Kör timer1 i CTC.
OCR1A = 31250; // Detta och timern i CTC ger ett avbrott varje sekund.
TIMSK1 |= _BV(OCIE1A); // Avbrott när räknaren har räknat till lika mycket som OCR1A
sei(); // Tillåt avbrott globalt.
}
int main(void) {
init();
while(1) {
/*
* Blinka diod2 med vanliga delays. Notera att nya avr-libc (som finns i ubuntus
* förråd) klarar längre delayer, så man behöver inte göra som det är gjort i
* introprogrammet.
*/
PORTB |= _BV(PORTB2); // Tänd diod2
_delay_ms(200); // Vänta lite...
PORTB &= ~_BV(PORTB2); // Släck diod2
_delay_ms(200); // Vänta lite..
}
return 0;
}
Klistra bara in detta i main.c som du skapade tidigare. Spara (glöm inte att spara, den gör inte det automatiskt när man kompilerar) och kompilera. Detta kan göras ifrån verktygsfältet:
Det kan vara en bra idé att ha Console uppe när man kompilerar för att se vad som händer. Den finns under källkodsredigeraren. EDIT: Man behöver oftast inte kompilera allt, då det kompilerar alla projekt i samma workspace och det tar lång tid om man har många projekt.
NOTERA: Som standard står kompileringen på debug, vilket inte skapar filer som går att ladda upp till mikroprocessorn. Detta kan ändras på genom att klicka på den lilla pilen i kompilerings-ikonen i verktygsfältet och välja Release.
För att ladda upp detta till mikroprocessorn efter kompileringen är det bara att klicka på AVR-bilden i verktygsfältet.
Notera För att ladda upp måste rätt projekt vara valt i projektträdet. Annars klagar den på det. Om det skulle bli fel när man laddar upp och det i consolen (finns under källkodsredigeraren) står någonting med ”permissions” är det för att eclipse inte körs som administratör. Mer om detta finns tidigare i denna artikel.
Liten avslutning
Med allt hittills i denna artikel bör en bra grund ha skapats över alla de steg som är involverade för att programmera en AVR-mikroprocessor från Atmel under Ubuntu Linux. Jag hoppas att det hjälpte någon. Skriv gärna kommentarer i forumet, det är mycket uppskattat då jag med säkerhet har skrivit fel på ett eller flera ställen.
Som en sista avslutning ska jag demonstrera hur man importerar introprogrammet till introbot07, men detta i nästa del av artikeln.
Skapa ett nytt projekt och ställ in allt som beskrivet ovan. Klistra in alla .c och .h -filer från motsvarande introprogram. Om kompilatorn klagar på vissa #include-delar så se till att byta ut alla (”bakåtsnedstreck”) mot / (”framåtsnedstreck”).
Kompilera programmet automatiskt när man sparar
Project → Properties → C/C++ Build → Behaviour. Kryssa i rutan Build on resource save (Auto build)
Spara automatiskt när man kompilerar
Window → Preferences → Workspace. Kryssa i rutan Save automatically before build
Går det att programmera XMEGA-serien om man följer den här guiden?
Ja. Under ubuntu 10.10+ så fungerar det direkt. För ubuntu 10.04 så bör man uppdatera avr-libc (det går att installera maverick-paketen om man laddar ner dem). Allmänt så bör man se till att ha avrdude 5.10+ och uppdaterade versioner av avr-gcc och avr-libc.
Programmeraren jag använde var avrispmkII över PDI. Konfigurationen av programmeraren som nämns ovan i artikeln fungerar utmärkt. Även fuse-bitarna går att ändra med editorn.
Lösning: Ditt projekt är inte markerat i listan ”Project explorer”, markera och testa upload igen.
Lösning: Välj File>Import
Välj Genral>Existing Projects into Workspace
Nu får du in ditt projekt i workspace:n