Tippek a programozáshoz iar avr beágyazott munkaállomáson 4

Ebben a cikkben úgy döntöttem, hogy mindent megjegyezek, ami érdekes, hogy az AVR programozási környezetben (és az AVR GCC használatával történő programozáshoz) az IAR Embedded Workbenchben dolgoztam.

érvénytelen fő (üres)
míg (1)
//. itt meg kell adnia a programkódot
>
>

2. Adjon hozzá fejlécfájlt a main.c fájl tetejéhez, amely leírja a processzor regisztereit:

3. Adja hozzá a következő kódot a modul fejlécéhez:

#define false 0
#define true 1

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

4. Miután hozzáadta az iotiny24.h fájlt (a fejlécfájl nevét a kiválasztott processzor típusa határozza meg, itt az ATTINY24 processzor példaként szerepel) lehetővé teszi a portok kényelmes kezelését. Az ENABLE_BIT_DEFINITIONS zászló is használható. beleértve a bitek meghatározását is. Miután bekerült az iotiny24.h fejlécfájlba és az ENABLE_BIT_DEFINITIONS zászlóba, olyan műveletek, mint például:

#define ENABLE_BIT_DEFINITIONS
#include
.
// ezért az A-port 4., 5. és 6. bitjeit a kilépéshez kapcsoltuk.
DDRA_DDA6 = 1;
DDRA_DDA5 = 1;
DDRA_DDA4 = 1;

A nyilvántartás típusa = (1 <<имя_бита), например:

// tiltsa le az A port 0, 4 és 5 lábán lévő digitális puffert
DIDR0 = (1<

5. Példa egy piros LED villogó programra (a _RED, _GRN és a _YEL LED-ek + 5V-os tápfeszültségre vannak csatlakoztatva áramkorlátozó ellenállásokkal):

#include
// A #include sor Meg kell dolgoznom
// függvény __delay_cycles.
#include
#define _RED PORTA_PORTA6
#define _GRN PORTA_PORTA5
#define _YEL PORTA_PORTA4

érvénytelen fő (üres)
#define késleltetés 1000000

// kapcsolja a LED-portokat a kimeneti módba
DDRA_DDA6 = 1;
DDRA_DDA5 = 1;
DDRA_DDA4 = 1;

// kapcsolja ki a LED-eket
_RED = 1;
_YEL = 1;
_GRN = 1;
míg (igaz)
_RED = 0; // a 0-as kimeneten, a piros LED világít
__delay_cycles (késleltetés / 10);
_RED = 1; // az 1. kimeneten a piros LED kialszik
__delay_cycles (késleltetés - (a / 10));
>
>


#define _KEY PINA_PINA6
.
ha (_KEY == false)
// megnyomja a gombot!
>

#include
#define _KEY PINB_PINB2
#define YEL PB2
#define _YEL PORTB_PORTB2
.
ha (_KEY == false)
// megnyomja a gombot!
.
>

HKEY_CURRENT_USER \ Szoftver \ IAR rendszerek \ IAR Beágyazott munkapad IDE \ Legutóbbi munkaterületek \
C - Programfájlok - IAR AVR beépített munkaállomás 4.0-common-bin-IarIdePm.exe.

A regedit csak tisztíthatja.

Javasoljuk továbbá a következő gomb kombinációkat (a Debug menüben):
Reset Ctrl + R
A hibakeresés leállítása Alt + D
Break Esc

8. A legegyszerűbb mód a Power Down üzemmódba való belépéshez ATtiny45:

Ezt követően csak a Watchdog megszakításával, az INT0 megszakításával vagy a Pin Change, az USI Start állapot és a reset törlésével léphet ki.

9. Ugyanez, de engedélyezve van a Power Down leállítása a PCI-Pin Change Interrupt megszakításával. A példa a 7 ATtiny45 lábat használja, amelyen a gomb lógott (lásd a breadboard diagramot):

// SE = 1 - Alvás engedélyezése
// SM1 = 1 és SM0 = 0 - az __sleep () parancs után a módot
// Power Down
MCUCR = (1< // PCIE = 1 - Pin Change Interrupt Engedélyezés
GIMSK = 1< // PCINT2 = 1 - a lábról való megszakítás engedélyezése 7
// (KEY == PCINT2 == PB2)
PCMSK = 1< // engedélyezzen minden megszakítást
SREG_I = 1;
__sleep ();
// A következő jön a kód, amelyet csak utána fog végrehajtani
// megnyomja a gombot.
.

10. Hogyan írhatunk meg egy megszakításkezelőt? például a PCINT0 vektor esetében:

// directive #pragma vector = meg kell adni a vektor számát
// megszakítás, a vektorok listája a iotiny45.h fájlban van megadva
#pragma vector = PCINT0_vect
// a PCINT0_routine nevet önkényesen veszik
__interrupt void PCINT0_routine (üres)
__no_operation ();
>

Most, ha beállítottuk a Pin Change Interrupt megszakítást, amint azt az előző tanácsban említettük, ezt a kódot (__no_operation ();) a RETI csonk helyett hívják.

#define WDT128ms 0x03
WDTCR = (1< // engedélyezzen minden megszakítást
SREG_I = 1;

#pragma vector = WDT_vect
__interrupt void WDT_routine (üres)
__no_operation ();
WDTCR_WDTIE = 1;
>

Most nem lesz reset, csak a processzor fog ébredni minden 128 ms (ha a __sleep () parancsot hívták;);

12. Az SLEEP parancs nagyon gyorsan fut, így néha az előző parancs eredményei nem alkalmazhatók:

Ha nem volt négy NOP parancs, akkor a B portnak nincs ideje bemenetre váltani. Például folytattam a PB2 lábához csatlakozó LED égetését (a SLEEP után folytatta a kimenetet). Az SLEEP parancs előtt az alapjárati műveletek számát kísérletileg kell kiválasztani (néha jobb ciklusokat használni).

13. A változó úszó 4 bájtot vesz igénybe.

14. A változó a memóriájában tárolja, és lesz elérhető, ha újraindul, és csatlakoztassa a tápegységet, meg kell adnia __eeprom memória attribútumot és kulcsszó __no_init (anélkül __no_init változó elején lesz reset), például:

__no_init __eeprom float fVar;

uchar Adr;
Adr = (uchar)&fVar;

15. Korai kényelméről, kihasználva az örömök programozás C - memória repül a cső nagyon könnyen, különösen akkor, ha float típusú, sor (ez tartalmazza a helyes kód könyvtár funkciók) - a kényelmet fizetni. Talán az AVR architektúra legnagyobb hátránya, legalább egy bájt költsége összeszerelési parancsonként.

17. Véletlenszerű egész szám létrehozásához a 0..32767 tartományban (vagy 0-tól a RAND_MAX állandóig) a rand () függvény létezik a CLIB vagy a DLIB könyvtárban. Ennek használatához hozzá kell adni a mellékelt stdlib.h fájlt a main.c. fájlhoz. Véletlenszám létrehozásához bármely kívánt tartományban meg kell adni a modulo műveletet (%). Ez például véletlenszerű bináris számot generál (igaz vagy hamis, azaz véletlenszerű szám 0-tól 1-ig):

Így létrejön a 0 és 9 közötti szám:

18. Az%% jel% k nyomtatásához printf (vagy sprintf) használatával kétszer meg kell ismételni:

printf ("Ez egy% jel: %%");

19. Néhány globális vagy statikus változó közvetlenül elhelyezhető az R4-R15 processzor regisztereiben, ami jelentősen javítja a változókkal való együttműködés sebességét. Ehhez a változó deklarálásakor a kiterjesztett kulcsszót __regvar kell használnia. és használja a --lock_regs opciót a fordítóhoz. Példa egy regiszterváltozó kijelzésére (R15: R14 regiszterpár):

__regvar __no_init int számláló @ 14;

Korlátozások: A __regvar direktíva nyilvántartása szerint elosztandó objektum maximális mérete 4 bájt. Nem lehetséges a mutatókat a __regvar-irányelvhez rendelt változóval használni. Ezenkívül nem állíthatja be a kezdeti értéket az objektumhoz, amikor kijelenti. Ezenkívül ha a __regvar értéket használja, akkor a regisztereket egy változóhoz zárja, és a használt könyvtárakat ugyanazzal a zárolt regiszterekkel kell újrafordítani. Ezért az ilyen torzulások szélesebb körben használhatók - valószínűleg a legjobb alternatíva az, hogy egy külön modulot írjon az összeszerelőben.

Minden, amit mondott ebben Tanács megtalálhatók a könyvtárban a fordító IAR, file c: \ Program Files \ IAR Embedded Workbench AVR 4,0 \ avr \ doc \ EWAVR_CompilerReference.pdf. Lásd: __regvar, --lock_regs, --memory_model.

20. Probléma a Build műveletekkel -> Felépítés utáni parancssor: a fordítás után nem lehet elvégezni a szükséges segédprogramokat.

Általában a probléma a programok indítási módjaival függ össze. Ebben az esetben a nézet ablak -> Üzenetek -> Építsd összeállításuk után rekord megjelenik „hibák száma: 1” (bár a szintaktikai hiba nem volt fordításkor) és a szükséges lépéseket a parancssorban indításakor a Post-build parancs nem fordul elő. Az ilyen hibák azonosításának és kijavításának nehézsége az, hogy nincs információ a probléma okairól.

A futtatható segédprogram helyének elérési útja az első. Ezt a teljes elérési útvonalon kell futtatni, vagy az útvonalat a% Path% környezeti változóban kell beállítani. Ha a végrehajtható program található a projekt keretében mappát, a beépített makrók IAR $ PROJ_DIR $, ami jelzi a helyét a projekt konfigurációs fájlok * .ewp és * .eww. Profit használatra $ PROJ_DIR $, hogy lehetővé teszi, hogy megszabaduljon az abszolút útvonal, és könnyen lehet másolni vagy áthelyezni a projekt egy mappát a lemezen, anélkül, hogy elveszítené hatékonyságát.

A második dolog, hogy ellenőrizze, hogy a futtatni kívánt program megvizsgálja a feldolgozni kívánt fájlokat. Ha a program elvárja, hogy az aktuális könyvtárban lévő bemeneti fájlok láthatók legyenek, használja a kötegelt fájlt a segédprogram indításához, és használja a parancssorba a cd parancsot a segédprogram könyvtárába való lépéshez. Az aktuális projektút átvitele a parancsfájl opció segítségével. Példa egy helyesen hangolt string Post-build parancssorra:

Példa fájl post_build_pu.bat:

21. Hogyan számolhatom ki az elemek számát egy bizonyos típusú struktúrákban vagy elemek tömbjében? A makró megnevezése:

Hogyan lehet megoldani a problémát a hibakeresés kikapcsolása nélkül (-O0 opciók stb.)? Néha nem lehetséges a hibakeresés kikapcsolása. Az IMHO a legegyszerűbb módja az, hogy egy változót illeszt be a változóhoz, akkor a fordító nem optimalizálja azt, és ehhez a változóhoz külön memóriakártyát oszt ki.

Most az ss, mm és hh változók könnyen elérhetõk lépésenkénti hibakereséssel. Ez a csúcs alkalmas a legtöbb fordítónak, mind az IAR, mind az GCC számára.

Az AVR GCC esetében is (a 4.4-es verzió óta) a pragma-direktíva használatával letilthatja a kódblokk optimalizálását:

Egy függvény esetében kikapcsolhatja az optimalizációt az attribútum __attribute __ ((optimalizálás ("O0")))) hozzáadásával. például:

Kapcsolódó cikkek