Sfaturi pentru programarea c în banca de lucru avr embedded 4

În acest articol am decis să scriu tot ce este interesant pe care am reușit să-l scot în timp ce lucram în IAR Embedded Workbench pentru mediul de programare AVR (și pentru programarea folosind AVR GCC).







void principal (void)
în timp ce (1)
//. aici trebuie să adăugați codul programului
>
>

2. Adăugați un fișier antet în partea de sus a fișierului principal.c care descrie registrele procesorului:

3. Adăugați următorul cod în antetul modulului:

#define false 0
#define true 1

#define char char unsigned
#define uint unsigned int
# definește ulong unsigned lung

4. După adăugarea fișierului iotiny24.h (numele fișierului antet este determinat de tipul procesorului selectat, aici este luat ca exemplu un procesor ATTINY24), este posibilă gestionarea convenabilă a porturilor. Se utilizează, de asemenea, steagul ENABLE_BIT_DEFINITIONS. inclusiv definiția biților. După includerea fișierului antet iotiny24.h și a pavilionului ENABLE_BIT_DEFINITIONS, operațiuni cum ar fi, de exemplu:

#define ENABLE_BIT_DEFINITIONS
#include
.
// așa că am schimbat biții 4, 5 și 6 ai portului A în modul de ieșire.
DDRA_DDA6 = 1;
DDRA_DDA5 = 1;
DDRA_DDA4 = 1;

Operatorii din registrul de tip = (1 <<имя_бита), например:

// dezactivați tamponul digital pe picioarele 0, 4 și 5 ale portului A
DIDR0 = (1<

5. Un exemplu de program care clipește cu LED-uri roșii (LED-urile _RED, _GRN și _YEL sunt conectate la alimentarea cu + 5V prin intermediul rezistențelor limitatoare de curent):

#include
// Linia #include Trebuie să lucrez
// function __delay_cycles.
#include
#define _RED PORTA_PORTA6
#define _GRN PORTA_PORTA5
#define _YEL PORTA_PORTA4

void principal (void)
#definiti intarzierea 1000000

// comutați porturile LED în modul de ieșire
DDRA_DDA6 = 1;
DDRA_DDA5 = 1;
DDRA_DDA4 = 1;

// opriți LED-urile
_RED = 1;
_YEL = 1;
_GRN = 1;
în timp ce (adevărat)
_RED = 0; // la ieșirea 0, LED-ul roșu este aprins
__delay_cycles (întârziere / 10);
_RED = 1; // la ieșirea 1, LED-ul roșu se stinge
__delay_cycles (întârziere - (a / 10));
>
>


#define _KEY PINA_PINA6
.
dacă (_KEY == false)
// se apasă butonul!
>

#include
#define _KEY PINB_PINB2
# definește YEL PB2
#define _YEL PORTB_PORTB2
.
dacă (_KEY == false)
// se apasă butonul!
.
>

HKEY_CURRENT_USER \ Software \ Sisteme IAR \ IAR Embedded Workbench IDE \ Spații de lucru recente \
C - Fișiere program - IAR AVR Embedded Workbench 4.0-common-bin-IarIdePm.exe.

Puteți să-l curățați numai cu regedit.

De asemenea, este recomandabil să adăugați următoarele combinații de butoane (în meniul Debug):
Resetați Ctrl + R
Opriți depanarea Alt + D
Pauză Esc

8. Cea mai ușoară modalitate de a intra în modul Power Down pe ATtiny45:

După aceea, puteți ieși din modul Sleep numai prin întreruperea Watchdog-ului, întreruperea INT0 sau întreruperea Schimbării PIN-ului, a starii USI și resetarea.

9. Același lucru, dar cu permisiunea de a ieși din Power Down prin întreruperea întreruperii schimbării PCI-Pin. Exemplul folosește piciorul 7 ATtiny45 pe care este atârnat butonul (vezi diagrama):

// SE = 1 - Enable Sleep
// SM1 = 1 și SM0 = 0 - după comanda __sleep () comanda modului
// Putere în jos
MCUCR = (1< // PCIE = 1 - Permite schimbarea întreruperii pinului
GIMSK = 1< // PCINT2 = 1 - permite întreruperea piciorului 7
// (KEY == PCINT2 == PB2)
PCMSK = 1< // permite toate întreruperile
SREG_I = 1;
__sleep ();
// Apare următorul cod, care va fi executat numai după
// apăsând butonul.
.

10. Cum se scrie un handler de întrerupere. de exemplu, pentru vectorul PCINT0:

// directive #pragma vector = trebuie să specificați numărul vectorului
// întrerupe, lista de vectori este specificată în fișierul iotiny45.h
#pragma vector = PCINT0_vect
// numele PCINT0_routine este luat în mod arbitrar
__interrupt void PCINT0_routine (void)
__no_operation ();
>

Acum, dacă am setat întreruperea Schimbării întreruperii PIN-ului, așa cum sa menționat în sfatul anterior, acest cod (__no_operation ();) va fi apelat în locul stubului RETI.







#define WDT128ms 0x03
WDTCR = (1< // permite toate întreruperile
SREG_I = 1;

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

Acum nu va exista o resetare, doar procesorul se va trezi la fiecare 128 ms (dacă a fost apelată comanda __sleep (););

12. Comanda SLEEP rulează foarte repede, deci uneori rezultatele comenzii anterioare nu pot fi aplicate:

Dacă nu aveau patru comenzi NOP, atunci portul B nu avea timp să treacă la intrare. De exemplu, am continuat să ard LED-ul conectat la piciorul PB2 (după SLEEP, a continuat să funcționeze ca ieșire). Numărul operațiilor în așteptare înainte de comanda SLEEP ar trebui să fie selectat experimental (uneori este mai bine să utilizați cicluri pentru acest lucru).

13. Variabila float durează 4 octeți.

14. Pentru variabila stocată în EEPROM și să fie disponibile când reporniți și reconectați sursa de alimentare, trebuie să specificați atributul de memorie __eeprom și __no_init cuvinte cheie (fără __no_init variabilă la începutul va fi resetat), de exemplu:

__no_init __eeprom float fVar;

uchar Adr;
Adr = (uchar)&fVar;

15. Devreme să se bucure și să se relaxeze, profitând de plăcerile de programare în C - memorie zboară în tub destul de ușor, mai ales dacă folosiți tipuri de float, linie (acest drept include funcțiile de cod de bibliotecă) - comoditatea de a plăti. Probabil cel mai mare dezavantaj al arhitecturii AVR - un consum de cel puțin o dată pe 2 octeți pe instrucțiuni de asamblare.

17. Pentru a genera un întreg aleator în intervalul 0..32767 (sau de la 0 la constantul RAND_MAX), funcția rand () există în biblioteca CLIB sau DLIB. Pentru ao folosi, trebuie să adăugați fișierul stdlib.h inclus în main.c. Pentru a genera un număr aleator în orice interval dorit, trebuie să utilizați operația modulo (%). De exemplu, aceasta generează un număr binar aleator (adevărat sau fals, adică un număr aleator de la 0 la 1):

Și astfel numărul de la 0 la 9 este generat:

18. Pentru a imprima semnul procentual% folosind printf (sau sprintf), trebuie sa o repetati de doua ori:

printf ("Acesta este un semn procentual: %%");

19. Unele variabile globale sau statice pot fi plasate direct în procesorul înregistrează R4-R15, care va îmbunătăți în mod semnificativ viteza variabila. Pentru aceasta, trebuie să utilizați cuvântul cheie __regvar extins atunci când declarați o variabilă. și, de asemenea, utilizați opțiunea --lock_regs pentru compilator. Exemplu de declarare a unei variabile de registru (se va utiliza perechea de registru R15: R14):

__regvar __no_init int contra @ 14;

Limitări: Dimensiunea maximă a unui obiect care poate fi alocată în registrele cu directiva __regvar este de 4 octeți. Nu este posibil să folosiți pointerii la o variabilă alocată directivei __regvar. În plus, nu puteți seta valoarea inițială la obiect atunci când declarați. În plus, dacă utilizați __regvar, atunci blocați registrele la o variabilă și bibliotecile utilizate trebuie recompilate cu același set de registre blocate. Prin urmare, astfel de distorsiuni sunt mai bine de utilizat în cazuri extreme - probabil cea mai bună alternativă este de a scrie un modul separat în asamblare.

Tot ceea ce a spus în acest Consiliu poate fi găsit în directorul de compilator IAR, fișierul c: \ Program Files \ IAR AVR Embedded Workbench 4.0 \ avr \ doc \ EWAVR_CompilerReference.pdf. A se vedea. __regvar, --lock_regs, --memory_model.

20. Problema cu Build Acțiuni -> linie de comandă Post-build: nu se poate executa după compilarea instrumentele necesare.

problema este de obicei asociat cu programe rula moduri. În acest caz, Vizualizare fereastra -> Mesaje -> Build după record compilare apare „Numărul total de erori: 1“ (deși eroarea de sintaxă nu a fost la momentul compilării), precum și pașii necesari în linia de comandă la lansarea liniei de comandă post-construcție nu se produce. Dificultatea de a identifica și de a corecta astfel de erori este că nici o informație cu privire la cauza problemei.

Primul lucru pentru a verifica - calea spre locația utilitarului executabil. Acesta trebuie să fie condusă de plin drept calea specificată, sau a alerga calea trebuie să fie specificate în variabila de mediu% Path%. Dacă programul executabil este localizat în directorul de proiect, utilizați built-in macro-urile IAR $ PROJ_DIR $, ceea ce indică locația fișierelor de configurare ale proiectului * .ewp și * .eww. utilizare profit $ $ PROJ_DIR este că vă permite să scape de calea absolută, și puteți copia cu ușurință sau mutați proiectul într-un dosar de pe disc, fără a pierde eficiența.

Cel de-al doilea lucru care trebuie verificat este dacă programul care urmează să fie rulat vede fișierele care trebuie procesate. Dacă programul se așteaptă să vadă fișierele de intrare în directorul său curent, utilizați fișierul batch pentru a lansa utilitarul și utilizați comanda cd din fișierul batch pentru a accesa directorul utilitar. Transferați calea curentă a proiectului prin opțiunea de fișier de comandă. Un exemplu de linie de comandă Post-build:

Fișierul exemplu post_build_pu.bat:

21. Cum pot calcula numărul de elemente într-o serie de structuri sau o serie de elemente de un anumit tip? Numarul de macro-uri:

Cum de a rezolva problema fără a fi nevoie să opriți depanarea (-O0 opțiuni etc.)? Uneori nu este posibil să dezactivați depanarea. IMHO este cel mai simplu mod de a atribui o variabilă variabilă variabilei, atunci compilatorul nu o va optimiza și nu va aloca o celulă de memorie separată pentru această variabilă.

Acum, variabilele ss, mm și hh vor fi ușor accesibile cu depanare pas cu pas. Acest sfat este potrivit pentru majoritatea compilatorilor, atât IAR cât și GCC.

De asemenea, pentru AVR GCC (începând cu versiunea 4.4), puteți dezactiva optimizarea pentru un bloc de cod folosind directiva Pragma:

Pentru o funcție, puteți dezactiva optimizarea adăugând atributul __attribute __ ((optimizați ("O0")))). de exemplu:







Articole similare

Trimiteți-le prietenilor: