AVR-GCC AVRStudio aplinkoje. Antra dalis

Nuo AVRStudio4 versijos atsirado galimybė integruoti AVR-GCC kompiliatorių. Pats AVRStudio4 kompiliatoriaus neturi. Integravimas atliekamas kaip plugin’as. Kitaip tariant, kad visa tai veiktu, reikia kompiuteryje turėti WinAVR ir AVRStudio. Pluginas pats detektuoja AVR-GCC ir nereikia tuo rūpintis.

ASTUDIO1.jpg

Taigi ką mes iš to gauname. Paprasčiausiai gauname pilnavertį įrankių rinkinį, ne ka prastesnį už komercinius. Patogus interfeisas, automatinis makefile generavimas, sukompiliavus galima vaizdžiai debuginti, stebint procesoriaus registrus. čia pat galima ir programuoti FLASH.
Labai nesinori perrašinėti helpu, paminėsiu, jog AVR-GCC ir AVRStudio suteikia tokias galimybes:

1. Kompiliavimas, parametrų nustatymas, AVR-GCC automatinis detektavimas;
2. Grafinis interfeisas – patogus valdymas;
3. Medžio tipo projekto failų išdėstymas;
4. Galima kompiliuoti iš anksto išsaugotomis keliomis konfigūracijomis;
5. Patogus klaidų valdymas;
6. Galimybė naudoti išorinius makefile;
7. Map ir List failų generavimas;
8. Pluginas seka ryšius tarp failų (c ir h failų sąryšius, kurie nėra projekto dalis);
9. Vartotojas gali dirbti tiek su c tiek su asm projektais vienoj aplinkoje.
Projekto pradėjimo bei konfigūravimo dokumentaciją galima rasti AVRStudio help. Tikrai neblogai aprašyta. Nebent labai bus norinčiu galėsiu įdėti čia, bet manau neverta. Gal būt smulkiau viską panagrinėsiu pavydžiuose.

AVRLIB biblioteka

Standartinė biblioteka avr-libc yra per siaura kad tenkintų visus programuotojų poreikius. Projektuojant atsiranda poreikis patogiau ir greitai užprogramuoti LCD, MMC ar koki tinklo įrenginį. Rašyti visą aparatūros valdymą ilgas ir nuobodus, bei varginantis darbas, kuris trukdo susitelkti prei tikrosios projekto idėjos.
Todėl nepriklausomai nuo WINAVR yra kuriamas nebloga atviro kodo biblioteka AVRLIB, kuri gali patenkinti net įmantriausius poreikius. Visą informaciją apie AVRLIB galima rasti čia http://hubbard.engr.scu.edu/embedded/avr/avrlib/, o taip pat parsisiųsti naujausią jos versiją. Biblioteka tikrai turtinga savo funkcijomis ir palaikomais įrenginiais bei standartais. Kiekvienas kodas labai gerai pakomentuotas, labai gera ir išsami dokumentacija, bei pateikta nemažai pavyzdžių.
Pagrindinės AVRLib funkcijos:

  • Byte Buffering (circular)

  • Bit Buffering (linear)

  • Printf and other formatted print functions

  • VT100 Terminal Output

  • Command Line Interface

  • FAT16/32 File System (support is read-only for now)

  • STX/ETX Packet Protocol

  • Fixed-Point Math Library (basic operations only)

AVR įrenginių valdymas:

  • Timers (with PWM, interrupt management)

  • UART (interrupt driven)

  • A/D Converter

  • I2C Master/Slave (interrupt and non-intr)

  • SPI Interface

  • External Interrupts

Išorinių įrenginių valdymas:

  • Character LCD Modules (HD44780-based)

  • I2C EEPROM Memories

  • SPI EEPROM Memories

  • MMC/SD Card Interface (SPI mode)

  • LIS3L02 ST Accelerometer

  • IDE/ATA Interface (for hard disks and CF cards)

  • Quadrature Encoders

  • RC-Servos (up to 8 channels)

  • STA013 MP3 Decoder Chip

  • GPS Receivers (via serial port)

    • NMEA-0813 Protocol

  • Trimble TSIP Protocol

  • Graphic LCD Modules

    • KS0108/HD61202 Controller

  • T6963 Controller

  • LCD Fonts and Symbols

AVR simuliuojami įrenginiai:

  • I2c Master (Bit-Bang)

  • UART (software-based, timer interrupt driven)

  • Pulse Output (timer-based, variable frequency)

  • Intel-type Memory Bus (Address & Data Buses + nRD,nWR)

Tinklo palaikymas:

  • Device Drivers

    • RTL8019 Ethernet

  • AX88796 Ethernet

  • CS8900 Ethernet

  • Prism2 Wireless LAN

  • Network Protocols

    • ARP

  • ICMP

  • IP

  • UDP

  • DHCP

  • Network Stack infrastructure

Reikia paminėti, jog negalima maišyti avr libc bibliotekos, kuri yra standartine avr-gcc biblioteka su standartinėmis C funkcijomis. Procyon AVRlib yra aukštesnio lygio biblioteka, kuri skirta aukštesniam lygyje valdyti įterptines sistemas.

Iš asmeninės patirties galiu pasakyti, jog pradedančiajam gali pakišti koją šitų bibliotekų pritaikymas savo projektams. naudojant standartines bibliotekas atrodo viskas paprasta – padarai #include <avr/oi.h> ar panašiai ir kodas kompiliuojasi, “includinus” iš AVRLIB galima užstrigti, nes dažniausiai pamirštama jog tai yra išoriniai failai kurie yra kitame kataloge ir jų kompiliatorius neranda. Todėl visus failus reikia nurodyti makefile SRC = $(TARGET).c c:\AVRLIB\failas.c. Palengvinimui, kad nereikėtų galvoti kur yra failų katalogai, instaliuojant yra sukuriamas (Environment variable )

ASTUDIO2.jpg

Dabar makefile užtenka nurodyti SRC = $(TARGET).c $(AVRLIB)\failas.c $(AVRLIB)\lcd.c
panašiai ir su headeriais (.h failais) kurie nesusiję su c failais. Juos reikia nurodyti EXTRAINCDIRS=$(AVRLIB) ar panašiai. Aišku galima nurodyti ir tiesioginį kelią. Reikia nebijoti eksperimentuoti.

AVR GCC pavyzdys naudojant WINAVR ir AVRLIB

AVR GCC taip pat WinAVR paketai turi nemažai pavyzdžių, pagal kuriuos galima nesunkiai pradėti rašyti savo programas. Todėl čia nebandysiu sukurti ka nors naujo, o tiesiog paaiškinsiu kaip sukonfigūruoti Makefile kad butu galima sukompiliuoti programa naudojant AVRLib biblioteką.

LCD_egz.jpg

Kadangi AVRLib yra pavyzdys su LCD tik su 8 bitu jungimu. Tai įdomumo dėlei sujunkime 4 bitų rėžimu. Pamatysime kaip paprasta yra sukonfigūruoti viena ar kitą režimą. Paveikslėlyje tik pateikiau paties LCD modulio prijungimą prie ATmega8.
Pirmiausia sukuriame tuščią projektą su Programmers Notepad ir jame sukuriame naują c failą, mūsų atveju <lcds.c>:

LCD_egz1.jpg

Tada iš AVRLIB\Conf katalogo nukopijuojame į projekto katalogą <global.h> ir <lcdconf.h> failus. Jie bus reikalingi konfigūruojant projekto bei lcd parametrus. Patogumo dėlei galima šiuos failus įtraukti į projekto medį paspaudus jame add files.
Pirmiausia paredaguojam <global.h>(komentarus specialiai ištryniau kad kompaktiškesnis kodas gautųsi):
//************global.h*************
#ifndef GLOBAL_H
#define GLOBAL_H
#include „avrlibdefs.h“
#include „avrlibtypes.h“
#define F_CPU 8000000 // 7.37MHz processor
#define CYCLES_PER_US ((F_CPU+500000)/1000000) // cpu cycles per microsecond
#endif
//****************************
čia pirmiausiai nustatomas naudojamas dažnis su #define F_CPU 8000000 taip pat galiam irasyti savo norimus nustatymus ir makrosus ir t.t.
Toliau reikia susikonfiguruoti <lcdconf.h>:
//*******************<lcdconf.h>*********************
#ifndef LCDCONF_H
#define LCDCONF_H
#define LCD_PORT_INTERFACE
#ifdef LCD_PORT_INTERFACE
#ifndef LCD_CTRL_PORT
// port and pins you will use for control lines
#define LCD_CTRL_PORT PORTD //Kontrol porto pinu pasirinkimas
#define LCD_CTRL_DDR DDRD
#define LCD_CTRL_RS 0
#define LCD_CTRL_RW 1
#define LCD_CTRL_E 2
#endif
#ifndef LCD_DATA_POUT
// port you will use for data lines
#define LCD_DATA_POUT PORTD //Siuo atveju bus naudojami 4,5,6,7 pinai duomenims
#define LCD_DATA_PIN PIND
#define LCD_DATA_DDR DDRD
// access mode you will use (default is 8bit unless 4bit is selected)
#define LCD_DATA_4BIT //Ijungia 4 bitu rezima
#endif
#endif

// if you chose the LCD_MEMORY_INTERFACE:
#ifdef LCD_MEMORY_INTERFACE
#ifndef LCD_CTRL_ADDR
// CPU memory address of the LCD control register
#define LCD_CTRL_ADDR 0x1000
#endif
#ifndef LCD_DATA_ADDR
// CPU memory address of the LCD data register
#define LCD_DATA_ADDR 0x1001
#endif
#endif
// LCD display geometry
// change these definitions to adapt settings
#define LCD_LINES 2 // Eiluciu skaicius
#define LCD_LINE_LENGTH 16 // Eiluciu ilgis simboliais
// cursor position to DDRAM mapping
#define LCD_LINE0_DDRAMADDR 0x00
#define LCD_LINE1_DDRAMADDR 0x40
#define LCD_LINE2_DDRAMADDR 0x14
#define LCD_LINE3_DDRAMADDR 0x54
#endif
//****************************************
Kaip matome, reikia pakeisti atitinkamus parametrus pritaikant juos prie projekto. Pirmiausia pasirenkamas kontrolės porto išvadai ir juos atitinkantys numeriai, po to duomenų porto išvadai. įjungiamas 4 bitu režimas su #define LCD_DATA_4BIT . jeigu naudojamas 8 bitu režimas, tai ta komanda turi buti užkomentuota.
Toliau nustatomas LCD tipas
#define LCD_LINES 2 // Eiluciu skaicius
#define LCD_LINE_LENGTH 16 // Eiluciu ilgis simboliais

ir daugiau praktiškai nieko liesti nereikia.
Parašome pagrindine programą <lcd.c>:
//********************<lcds.c>*******************
//—– Include Files ———————————————————
#include <avr/io.h> // include I/O definitions (port names, pin names, etc)
#include <avr/signal.h> // include „signal“ names (interrupt names)
#include <avr/interrupt.h> // include interrupt support
#include <avr/iom8.h> //atmega8 biblioteka
#include „global.h“ // include our global settings
#include „rprintf.h“ // include printf function library
#include „lcd.h“

//—– Begin Code ————————————————————
int main(void)
{
// initialize LCD
lcdInit();
// direct printf output to LCD
rprintfInit(lcdDataWrite);
// print message on LCD
rprintf(„Welcome to AVRlib!“);
while(1)
{
}
return 0;
}

//********************************************
Programos nekomentuosiu, nes pavyzdžiuose yra neblogai viskas pakomentuota. be to yra Helpas neblogas 🙂
Ir galiausiai paskutinė dalis – makefile sukūrimas.
Atsidarę MFile programą paredaguojame makefile tokias vietas:
TARGET = lcds
MCU = atmega8
FORMAT = ihex
SRC = $(TARGET).c $(AVRLIB)/lcd.c $(AVRLIB)/rprintf.c $(AVRLIB)/timer.c
EXTRAINCDIRS = $(AVRLIB)

išsaugome makefile projekto kataloge.
tada sukompiliuojame projektą su Make All komanda. Viskas. <lcds.hex> failas yra projekto kataloge kurį galima įrašyti i mikrokontrolerį.

Pažymėti: , ,
3 comments on “AVR-GCC AVRStudio aplinkoje. Antra dalis
  1. Anonymous parašė:

    sitame projektelyje butu kaip ir viskas gerai tik va beda, neparasiai kad jis neveikia, simuliuoju su proteus bet kasko jis nenori veikti.
    kompiliavimas be problemu

  2. kondencuota parašė:

    kur rasti ta Make all komanda?
    nes Mfile programoje jos neradau.

  3. harizhent parašė:

    kazkodel nesinori kompilintis. meta „klaidas“ PN darant make all.

    > „make.exe“ all

    ——– begin ——–
    avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    make.exe: *** No rule to make target `lcds.elf’, needed by `elf’. Stop.

    > Process Exit Code: 2
    > Time Taken: 00:01

    ka cia turetu reiksti? labai buciau dekyngas jei paaishkintum 🙂

Parašykite komentarą