Mikrokontroler ATmega32 Język symboliczny 1
Język symboliczny (asembler) jest językiem niskiego poziomu - pozwala pisać programy złożone z instrukcji procesora. Kody instrukcji są reprezentowane nazwami symbolicznymi - mnemonikami 2
- cechy Mnemoniczne nazwy operacji Operowanie symbolicznymi nazwami adresów danych i etykiet Możliwość stosowania makrooperacji Możliwość łatwiejszego modyfikowania programu 3
- translator Zostanie omówiony translator języka symbolicznego AVR Assembler 2 dostępny w środowisku AVR Studio. W szczególności będą omówione następujące zagadnienia: Składnia linii programu Wyrażenia Dyrektywy Deklaracja zmiennych i stałych Makrooperacje Translacja warunkowa 4
cechy translatora Translator języka symbolicznego jest wyposażony w preprocesor tekstu, sterowany z pomocą dyrektyw preprocesora Translator nie rozpoznaje małych i wielkich znaków oprócz dyrektyw preprocesora Długość wiersza programu powinna się mieścić w 120 znakach (w przeciwnym przypadku tekst można przenosić do następnego wiersza z użyciem znaku kontynuacji \\ ) 5
- składnia Możliwa składnia wiersza pliku źródłowego: [etykieta:].dyrektywa [argument] [;komentarz] [etykieta:] instrukcja [argument] [;komentarz] [#dyrektywa_preprocesora] [argument] [//komentarz] [;komentarz] 6
- wyrażenia Wyrażenia, na których operują instrukcje i dyrektywy, mogą być budowane z: Elementów prostych stałych liczbowych Operatorów Funkcji Wartość wyrażenia jest obliczana w trakcie procesu asemblacji (jest stałą). 7
- wyrażenia Elementy proste liczby o rozdzielczości max. 64 bity: Wartości całkowite: dziesiętne (np. 255), szesnastkowe (0xFF, $FF), ósemkowe (075), binarne (0b00001001), znakowe ( a ) Wartości zmiennoprzecinkowe (np. 3.14159) Etykiety, którym przyporządkowano pewien adres Etykiety zdefiniowane przez dyrektywy SET i EQU Skrót PC, któremu jest przyporządkowany adres instrukcji, której PC jest argumentem 8
- wyrażenia Operatory rozdzielają elementy proste i funkcje w wyrażeniu Rozróżnia się operatory arytmetyczne, logiczne i porównania Kolejność działań jest określona priorytetem operatora (można ją modyfikować przez użycie nawiasów), rozróżnia się 11 poziomów priorytetu 9
- wyrażenia Zestawienie operatorów Symbol Opis Priorytet! Negacja logiczna 11 ~ Negacja bitowa 11 - Negacja arytmetyczna 11 * Mnożenie arytmetyczne 10 / Dzielenie arytmetyczne 10 % Reszta z dzielenia 10 + Dodawanie arytmetyczne 9 - Odejmowanie arytmetyczne 9 << Przesunięcie logiczne w lewo 8 >> Przesunięcie logiczne w prawo 8 10
- wyrażenia Zestawienie operatorów, cd. Symbol <, <=, >, >= ==,!= & ^ && Opis Porównania (relacje większości, mniejszości) Porównania (testy równości, braku równości) Mnożenie bitowe Suma bitowa modulo 2 Suma bitowa Mnożenie logiczne Sumowanie logiczne Priorytet 7 6 5 4 3 2 1 11
- wyrażenia Funkcje pozwalają na przeprowadzenie operacji jednoargumenowych. Argument funkcji podaje się w nawiasach okrągłych. Zestawienie funkcji: low(), high(), byte2(), byte3(), byte4(), lword(), hword(), page(),abs(), exp2(), log2(), int(), frac(), q7(), q15(). 12
- wyrażenia Przykłady wyrażeń w instrukcjach asemblera: Poczatek: ldi R16, low(500) ;ładuj R16 młodszym bajtem wartości 500 ldi R17, high(poczatek*2) ;ładuj R17 starszym bajtem dwukrotnie ;zwiększonego adresu ldi R18, (1<<2) (1<<5) ;ładuj R18 wartością 0b00100100 ldi R19, (log2(5)<3)*0x15 ;ładuj R19 wartością 0x15, jeśli log 2 (5)<3 13
- dyrektywy asemblera Dyrektywy sterujące procesem asemblacji:.device typ_układu informuje translator o typie mikrokontrolera.include nazwa_pliku dołącza pliki biblioteczne.list załącza generowanie listingu.nolist wyłącza generowanie listingu.listmac załącza rozwijanie makr w listingu.exit powoduje zakończenie asemblacji pliku źródłowego 14
- dyrektywy asemblera Definicje:.EQU etykieta=wyrażenie definiuje etykietę i przypisuje jej wartość liczbową bez możliwości jej modyfikacji.set etykieta=wyrażenie definiuje etykietę i przypisuje jej wartość liczbową z możliwości jej wielokrotnej modyfikacji za pomocą tej samej dyrektywy.def nazwa [= rejestr ] przypisuje rejestrom roboczym nazwy symboliczne Przykłady:.EQU stala = 9.SET zmienna = 10.SET zmienna = 11.DEF akumulator = R16 15
- dyrektywy asemblera Segmenty programu określają rodzaj pamięci, na której aktualnie operujemy:.cseg pamięć programu.dseg pamięć danych.eseg pamięć EEPROM Możliwe jest przemieszczanie się w obszarze aktualnie wybranej pamięci za pomocą dyrektywy:.org wyrażenie 16
- dyrektywy asemblera Zmienne w pamięci danych:.byte wyrażenie rezerwuje pamięć danych na zmienną (w segmentcie.dseg) w liczbie bajtów określonej wyrażeniem. Aby móc się odwołać do zmiennej dyrektywę należy poprzedzić etykietą. 17
- dyrektywy asemblera Stałe w pamięci programu i EEPROM:.DB wyrażenie[, wyrażenie ] rezerwuje pamięć programu lub EEPROM na stałą lub ciąg stałych podanych jako lista argumentów, w liczbie bajtów równej liczbie wyrażeń w liście. Aby móc się odwołać do stałej dyrektywę należy poprzedzić etykietą. Istnieją podobne dyrektywy dla słów o większym rozmiarze:.dw słowo 16-bitowe, DD 32, DQ 64. Stałe wielobajtowe zapisane są w pamięci w formacie Little-Endian 18
- dyrektywy asemblera Przykład użycia powyższych dyrektyw:.dseg.org 0x0060 Zmienna1:.BYTE 2 Zmienna2:.BYTE 1.ESEG Stale_E:.DB 134, 35, -30, 0xFF, 034.CSEG.ORG 0x0000 rjmp Zerowanie.ORG 50 Zerowanie: 19
- dyrektywy asemblera Makra to struktury predefiniujące bloki programowe o zmiennych parametrach. Wywołanie makra powoduje, że translator zastępuje nazwę makra jego rozwinięciem z uwzględnieniem zadanych parametrów. Parametry są przekazywane przez konstrukcję: @numer_paramertu. Do makra można przekazać maksymalnie 10 parametrów. Makra mogą być zagnieżdżone. Składnia definicji makra:.macro nazwa_makra struktura makra.endmacro 20
- dyrektywy asemblera Przykład:.MACRO dodaj_16b add @0, @2 adc @1, @3.ENDMACRO dodaj_16 R0, R1, R16, R17 21
- dyrektywy asemblera Translacja warunkowa jest wykorzystywana do wyłączania części kodu z procesu translacji, np. w plikach bibliotecznych lub programach wielowariantowych. Składnia:.IF wyrażenie kontynuuje translację dalszych linii jeśli wyrażenie jest różne od 0.ELIF wyrażenie załącza translację aż do następnej dyr..elif lub.else.else załącza translację, jeśli żaden z powyższych warunków nie był spełniony.endif kończy translację warunkową 22
- preprocesor Preprocesor funkcjonuje podobnie, jak preprocesor w języku C. Dyrektywy preprocesora zaczynają się od znaku # Dyrektywy preprocesora należy pisać od początku wiersza Przykłady dyrektyw preprocesora: #INCLUDE #DEFINE #IF 23
- pliki nagłówkowe Pliki nagłówkowe definiują wartości charakterystyczne dla danego mikrokontrolera: Adresów rejestrów funkcyjnych Numerów bitów w rejestrach funkcyjnych Adresów końca obszarów pamięci Wektorów przerwań Pliki nagłówkowe mają rozszerzenie.inc i dołącza się je do kodu programu za pomocą dyrektywy.include. 24