Warning: Trying to access array offset on value of type null in /customers/f/2/4/chalmersrobotics.se/httpd.www/wiki/includes/profiler/SectionProfiler.php on line 99 Warning: Trying to access array offset on value of type null in /customers/f/2/4/chalmersrobotics.se/httpd.www/wiki/includes/profiler/SectionProfiler.php on line 99 Warning: Trying to access array offset on value of type null in /customers/f/2/4/chalmersrobotics.se/httpd.www/wiki/includes/profiler/SectionProfiler.php on line 100 Warning: Trying to access array offset on value of type null in /customers/f/2/4/chalmersrobotics.se/httpd.www/wiki/includes/profiler/SectionProfiler.php on line 100 Warning: Trying to access array offset on value of type null in /customers/f/2/4/chalmersrobotics.se/httpd.www/wiki/includes/profiler/SectionProfiler.php on line 101 Warning: Trying to access array offset on value of type null in /customers/f/2/4/chalmersrobotics.se/httpd.www/wiki/includes/profiler/SectionProfiler.php on line 101 Programmera AVR med Linux - Chalmers Robotics
 Actions

Programmera AVR med Linux

From Chalmers Robotics

Sammanfattning

Artikeln

Skriven av: Benjamin Vedder Skapad: 2009-05-28 Senast uppdaterad: 2012-04-03 Kontakt: vedder at student.chalmers.se Diskutera artikeln på forumet -> Linux: AVR, Linux och Eclipse

Förord

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.

Vem bör läsa detta

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 [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.

Om programmering av AVR mikroprocessorer från Atmel

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.

Om Eclipse

[[1]] ä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)


Förberedelser

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.

Se till att man kan använda programmeraren utan att vara root

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 
 
# JTAG ICE mkII
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="03eb", ATTR{idProduct}=="2103", MODE="0666", GROUP="plugdev"
 
# Atmel AVRISP MkII
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="03eb", ATTR{idProduct}=="2104", MODE="0666", GROUP="plugdev", SYMLINK+="avrispmkII-%n"
 
# Atmel AVR Dragon
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="03eb", ATTR{idProduct}=="2107", MODE="0666", GROUP="plugdev"
 
# AVR Doper
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="16c0", ATTR{idProduct}=="05df", MODE="0666", GROUP="plugdev"
 
# Olimex USB-TINY-H
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="15ba", ATTR{idProduct}=="002a", MODE="0666", GROUP="plugdev"
 
# Raisonance jtag
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="138e", ATTR{idProduct}=="9000", MODE="0666", GROUP="plugdev"
 
# Microchip PICkit 2
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04d8", ATTR{idProduct}=="0033", MODE="0666", GROUP="plugdev", SYMLINK+="pickit2-%n"
 
# Xilinx jtag cable
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="03fd", MODE="0666", GROUP="plugdev"

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.

Hämta och installera eclipse

Nu är det dags att ta ner och installera eclipse. Börja med att hämta eclipse från [[2]]. 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) (artiklar:huvudmeny_programstartare.png)

Installera avr-pluginen (eclipse 3.5+)

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 [[3]] för mer information).

Användning

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: (artiklar:eclipse_newws.png?550) 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++//. (artiklar:eclipse_perspective.png) Nu bör Eclipse se ut så här: (artiklar:eclipse_new.png?660)

Nytt projekt

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.

Konfiguration

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: (artiklar:eclipse_prop_prog.png?660) 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 //Target Hardware// i panelen till vänster. (artiklar:eclipse_prop_hw.png?660) Ä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//: (artiklar:eclipse_prop_fuses1.png?660) Det finns även en fin editor för dessa: (artiklar:eclipse_prop_fuse2.png?660) 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//. (artiklar:eclipse_prop_compiler.png?660)

Ett litet testprogram

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: (artiklar:eclipse_verktyg.png|) 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.

Att arbeta med introprogrammet

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").

Tips

    • 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//= FAQ =

    • 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.

Felsökning

  • **Problem:** Vid uppladdning till microkontrollern kommer meddelandet "AVRDude: No AVR project selected."**Lösning:** Ditt projekt är inte markerat i listan "Project explorer", markera och testa upload igen.
  • **Problem:** Det går inte att öppna en projektmapp i Eclipse.**Lösning:** Välj File>Import

Välj Genral>Existing Projects into Workspace Nu får du in ditt projekt i workspace:n