Język C dla mikroprocesorów AVR Wykład 6

Podobne dokumenty
Programowanie mikrokontrolerów AVR

Komunikacja w mikrokontrolerach. Podstawy programowania. Wydział Elektroniki Mikrosystemów i Fotoniki dr inż. Piotr Markowski

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

SYSTEM PRZERWAŃ ATmega 32

Aplikacje Systemów Wbudowanych

Komunikacja w mikrokontrolerach. Wydział Elektroniki Mikrosystemów i Fotoniki Piotr Markowski

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32)

Instytut Teleinformatyki

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Mikrokontrolery AVR Wprowadzenie

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Język C. Wykład 9: Mikrokontrolery cz.1. Łukasz Gaweł Chemia C pokój 307

Szkolenia specjalistyczne

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Komunikacja w mikrokontrolerach Laboratorium

Schemat blokowy architektury AVR

Mikroprocesory i Mikrosterowniki

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Jak rozpocząć pracę z mikrokontrolerami?

Instytut Teleinformatyki

Immobilizer samochodowy otwierający dostęp poprzez kod czteroznakowy.

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Mikroprocesory i Mikrosterowniki

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

Mikrokontroler ATmega32. Język symboliczny

Mikroprocesory i mikrosterowniki

Wbudowane układy peryferyjne cz. 1 Wykład 7

Laboratorium Systemów wbudowanych Wyższa Szkoła Zarządzania i Bankowości, Informatyka studia inżynierskie

Niektóre piny mogą pełnić różne role, zależnie od aktualnej wartości sygnałów sterujących.

2 Przygotował: mgr inż. Maciej Lasota

Współpraca mikrokontrolera z wyświetlaczami: ciekłokrystalicznym i siedmiosegmentowym

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Podstawy programowania C. dr. Krystyna Łapin

Temat 7. Programowanie mikrokontrolerów z rodziny PIC16 w języku C przy użyciu HI-TECH C for PIC10/12/16

PROGRAMOWANIE w C prolog

Liczniki, rejestry lab. 08 Mikrokontrolery WSTĘP

Współpraca mikrokontrolera z klawiaturą

Podstawy programowania skrót z wykładów:

1 Podstawy c++ w pigułce.

1.1 Co to jest USBasp? Parametry techniczne Obsługiwane procesory Zawartość zestawu... 4

Instytut Teleinformatyki

SYSTEMY CZASU RZECZYWISTEGO (SCR)

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Kompilator języka C na procesor 8051 RC51 implementacja

Język C. Wykład 9: Mikrokontrolery cz.2. Łukasz Gaweł Chemia C pokój 307

o Instalacja środowiska programistycznego (18) o Blink (18) o Zasilanie (21) o Złącza zasilania (22) o Wejścia analogowe (22) o Złącza cyfrowe (22)

Programator procesorów rodziny AVR AVR-T910

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Kurs Elektroniki. Część 5 - Mikrokontrolery. 1/26

Programator AVR USBasp

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Materiały. Języki programowania II (Java+AVR-GCC) Literatura

Tworzenie oprogramowania

Zmienne, stałe i operatory

Wykład 4. Przegląd mikrokontrolerów 16-bit: - PIC24 - dspic - MSP430

Wstęp do Programowania, laboratorium 02

Sterowniki Programowalne (SP) Wykład 13

2. Architektura mikrokontrolerów PIC16F8x... 13

Systemy Wbudowane. Arduino, AVR. Arduino. Arduino. Arduino. Oprogramowanie. Mikrokontroler. Mikrokontroler Platforma Arduino. Arduino IDE: Arduino C:

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Programowanie strukturalne i obiektowe

micro Programator ISP mikrokontrolerów AVR zgodny z STK500v2 Opis Obs³ugiwane mikrokontrolery Wspó³praca z programami Podstawowe w³aœciwoœci - 1 -

Inżynieria Wytwarzania Systemów Wbudowanych

Funkcja (podprogram) void

Podstawy programowania w języku C i C++

Programowanie współbieżne i rozproszone

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

KOMUNIKACJA Z OTOCZENIEM MIKROKONTROLERA

1 Podstawy c++ w pigułce.

Programowanie strukturalne język C - wprowadzenie

Instrukcja do laboratorium Akademii ETI *

Język C - podstawowe informacje

Dyrektywy asemblera. Składnia: etykieta:.dyrektywa argument. rezerwuje zasoby w SRAM początek segmentu kodu

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

SPRAWOZDANIE. Architektura systemów komputerowych projekt robota W Y K O N A N I E :

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

Programowanie w elektronice: Podstawy C

Arduino dla początkujących. Kolejny krok Autor: Simon Monk. Spis treści

Techniki mikroprocesorowe i systemy wbudowane

Assembler w C++ Syntaksa AT&T oraz Intela

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Wstęp do programowania

DOKUMENTACJA. dot. Budowy i przebiegu konstrukcji linefollower-a. Data: MCHT2 Jakub Tomczyk Łukasz Pawelec Mateusz Wróbel

Instrukcja obsługi programatora AVR Prog USB v2

CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Podstawy programowania w języku C

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Transkrypt:

Język C dla mikroprocesorów AVR Wykład 6

Programowanie AVR Narzędzia 2

Języki programowania Mikrokontrolery AVR ze względu na swoją popularność doczekały się implementacji kompilatorów dla znacznej części dostępnych języków programowania Najpopularniejsze w chwili obecnej są assembler i C 3

Kompilator języka C Najpopularniejszy zestaw narzędzi dla języka C dla platformy AVR bazuje na porcie kompilatora gcc: avr-gcc Zestaw ten dla środowiska Windows nasi nazwę WinAVR http://winavr.sourceforge.net/ 4

WinAVR W skład pakietu WinAVR wchodzą następujące elementy Kompilator C/C++ (avr-gcc, avr-g++) Zestaw plików nagłówkowych dla wszystkich mikrokontrolerów AVR Program make Powłoka bash wraz z podstawowymi narzędziami Wygodny edytor Programmer s Notepad 2 (PN2) Program avrdude do programowania pamięci mikrokontrolerów AVR 5

Programmer s Notepad 2 Jest to darmowy prosty edytor dla programistów, z obsługą projektów, kolorowaniem składni wielu języków oraz możliwością korzystania z kompilatora i programatora z poziomu edytora http://www.pnotepad.org/ 6

Programmer s Notepad 2 7

Atmel Studio 6 Jest to darmowe zintegrowane środowisko programistyczne, rozwijane przez firmę Atmel, producenta mikrokontrolerów AVR Umożliwia pisanie programów dla architektura AVR i ARM w assemblerze oraz C/C++ Bazuje na MS Visual Studio, zintegrowanym z avr-gcc i arm-gcc 8

Atmel Studio 6 Środowisko wspiera kilka typów programatorów oraz mechanizmy ułatwiające debugowanie http://www.atmel.com/microsite/atmel_studi o6/ 9

Atmel Studio 6 10

Przygotowanie projektu Przygotowanie projektu WinAVR + PN2 11

Etapy Utworzenie w PN2 nowego projektu Skopiowanie do katalogu projektu generycznego pliku Makefile, który można znaleźć w katalogu domowym WinAVR (podkatalog sample) Dodanie plik Makefile do projektu w PN2 Konfiguracja pliku Makefile 12

Etapy Utworzenie jednego lub kilku plików z kodem źródłowym Dodanie informacji o plikach źródłowych do Makefile Kompilacja z poziomu PN2 Programowanie mikrokontrolera AVR z poziomu PN2 13

Konfiguracja pliku Makefile W domyślnym pliku Makefile zmiany wymagają następujące elementy Model mikrokontrolera i częstotliwość zegara taktującego Lista plików z kodem źródłowym do kompilacji Flagi kompilatorów (opcjonalnie) Konfiguracja programatora (opcjonalnie) 14

Makefile - konfiguracja Zmiany w domyślnym pliku Makefile MCU = atmega32 #model mikrokontrolera F_CPU = 11059200 #częstotliwość zegara w Hz TARGET = main #prefix plików wynikowych SRC = $(TARGET).c #lista plików źródłowych C CPPSRC = #lista plików źródłowych C++ ASRC = #lista plików źródłowych assemblera 15

Makefile konfiguracja Flagi optymalizacji OPT = 0 #optymalizacja wyłączona OPT = 1 #2 lub 3 optymalizacja wydajności OPT = s #optymalizacja rozmiaru pliku wynikowego 16

Makefile flagi CFLAGS i CXXFLAGS kompilatora C/C++ -funsigned-char używaj domyślnie unsigned char zamiast char -funsigned-bitfields - używaj domyślnie pól bitowych bez znaku zamiast ze znakiem -fpack-struct umieszczaj elementy struktur bezpośrednio jeden za drugim, bez wyrównywania i powstałych w ten sposób dziur -fshort-enums alokuj tylko tyle miejsce dla typu enum ile mogą zająć możliwe wartości o zadeklarowanych zakresach 17

Makefile flagi kompilatora C/C++ -Wstrict-prototypes ostrzegaj, jeśli funkcja jest zadeklarowana lub zdefiniowana bez deklaracji typów argumentów -mshort-calls używaj funkcji rjmp/rcall (funkcje skoku o ograniczonym zakresie) dla układów z >8kB pamięci, domyślnie dla takich układów wykorzystywane są funkcje jmp/call -fno-unit-at-a-time opcja pozostawiona w celu zapewnienia kompatybilności 18

Makefile flagi kompilatora C/C++ -Wundef ostrzegaj, jeśli dyrektywa #if korzysta z niezadeklarowanego argumentu -Wunreachable-code ostrzegaj, jeśli program zawiera kod, który nigdy nie zostanie wykonany -Wsign-compare ostrzegaj, gdy jest porównywana zmienna ze znakiem i bez znaku -Wall wyświetlaj wszystkie typy ostrzeżeń podczas kompilacji 19

Makefile - programator W procesie programowania wykorzystywany jest program avrdude, obsługujący wszystkie popularne programatory dla AVR dostępne na rynku, w tym USBASP i STK500v2 Konfiguracja polega na wybraniu modelu programatora i portu, do którego jest podłączony 20

Makefile - programator #wskazanie modelu programatora AVRDUDE_PROGRAMMER = stk500v2 #port, do którego jest podłączony programator AVRDUDE_PORT = com1 21

Użyteczne komendy Kompilacja programu make all Usunięcie plików tymczasowych i wynikowych make clean Programowanie mikrokontrolera make program 22

avrdude obsługa z konsoli Konfiguracja programu avrdude w pliku Makefile nie zawsze wystarcza do wykonania nietypowych operacji podczas programowania Niektóre przypadki, takie jak modyfikacja fusebitów jest niewygodna podczas realizacji przez Makefile i wygodniej jest wykonać niezbędne operacje z konsoli 23

avrdude obsługa z konsoli Komenda bazowa avrdude -p atmega32 -c stk500v2 -P com1 Odczyt pamięci EEPROM -D -U eeprom:r:"eeprom.eep":i Odczyt pamięci FLASH -U flash:r:"flash.hex":i Odczyt fusebitów -u -U lfuse:r:"fuse_lo.hex":i -U hfuse:r:"fuse_hi.hex":i Odczyt lockbitów -U lock:r:"fuse_lock.hex":i 24

avrdude obsługa z konsoli Komenda bazowa avrdude -p atmega32 -c stk500v2 -P com1 -V Zapis pamięci EEPROM -D -U eeprom:w:"eeprom.eep":i Zapis pamięci FLASH -U flash:w:"flash.hex":i Zapis fusebitów -u -U lfuse:w:0xe1:m -U hfuse:w:0x99:m Zapis lockbitów -U lock:w:0x3f:m 25

avrdude obsługa z konsoli Kasowanie pamięci mikrokontrolera avrdude -p atmega32 -c stk500v2 -P com1 -e Komendy z jednego slajdu mogą być ze sobą łączone 26

Język C dla AVR Język C dla AVR 27

Język C dla AVR Konstrukcja programu w języku C dla mikrokontrolerów AVR jest bardzo podobna do programu dla PC W celu optymalnej i wygodnej obsługi wszystkich elementów mikrokontrolera programista ma do dyspozycji szereg makr, funkcji i typów, niespotykanych w bibliotece standardowej dla innych platform 28

Typy w języku C dla AVR Rozmiar generycznych typów zmiennych Typ Rozmiar (bitów) Wartość minimalna char 8-128 (0) 127 (255) signed char 8-128 127 unsigned char 8 0 255 short int 16-32768 32767 unsigned short int 16 0 65535 int 16-32768 32767 unsigned int 16 0 65535 long int 32-2^31 2^31-1 Wartość maksymalna 29

Typy w języku C dla AVR Typ Rozmiar (bitów) Wartość minimalna unsigned long int 32 0 2^32-1 long long int 64-2^63 2^63-1 unsigned long long int 64 0 2^64-1 Wartość maksymalna float 32 ±1.18 10^(-38) ±3.4 10^38 double 32 ±1.18 10^(-38) ±3.4 10^38 long double 32 ±1.18 10^(-38) ±3.4 10^38 30

Typy w języku C dla AVR Skrócone nazwy typów C dla AVR signed char unsigned char signed int unsigned int signed long int unsigned long int signed long long int unsigned long long int int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t 31

Obsługa rejestrów w języku C dla AVR Zastąpienie zawartości NAZWA_REJESTRU = (1 << NAZWA_BITU); Ustawienie bitu NAZWA_REJESTRU = (1 << NAZWA_BITU); Wyczyszczenie bitu NAZWA_REJESTRU &= ~(1 << NAZWA_BITU); Odczyt stanu bitu wartosc_bitu = ((NAZWA_REJESTRU >> NAZWA_BITU) & 0x1); 32

Obsługa rejestrów w języku C dla AVR Aby skonfigurować port PA0 jako wyjście: DDRA = (1 << DDA0); Aby skonfigurować port PB1 jako wejście z domyślnym stanem logicznym 1 : DDRB &= ~(1 << DDB1); PORTB = (1 << PORTB1); Aby ustawić na porcie PC2 logiczną 1 : PORTC = (1 << PORTC2); Aby odczytać stan portu PD3: stan_pd3 = ((PIND >> PIND3) & 0x1); 33

Przerwania w języku C dla AVR Do obsługi przerwań w języku C służy makro ISR ISR (NAZWA_WEKTORA_PRZERWANIA) { } //obsługa przerwania 34

Przerwania w języku C dla AVR Alternatywnie można użyć do tego celu makra SIGNAL (NAZWA_SYGNAŁU) { //obsługa przerwania } 35

Przerwania lista wektorów i sygnałów ATmega32 Opis Wektor Sygnał External Interrupt Request 0 INT0_vect SIG_INTERRUPT0 External Interrupt Request 1 INT1_vect SIG_INTERRUPT1 External Interrupt Request 2 INT2_vect SIG_INTERRUPT2 Timer/Counter2 Compare Match TIMER2_COMP_vect SIG_OUTPUT_COMPARE2 Timer/Counter2 Overflow TIMER2_OVF_vect SIG_OVERFLOW2 Timer/Counter1 Capture Event TIMER1_CAPT_vect SIG_INPUT_CAPTURE1 Timer/Counter1 Compare Match A TIMER1_COMPA_vect SIG_OUTPUT_COMPARE1A Timer/Counter1 Compare Match B TIMER1_COMPB_vect SIG_OUTPUT_COMPARE1B Timer/Counter1 Overflow TIMER1_OVF_vect SIG_OVERFLOW1 Timer/Counter0 Compare Match TIMER0_COMP_vect SIG_OUTPUT_COMPARE0 Timer/Counter0 Overflow TIMER0_OVF_vect SIG_OVERFLOW0 Serial Transfer Complete SPI_STC_vect SIG_SPI 36

Przerwania lista wektorów i sygnałów ATmega32 Opis Wektor Sygnał USART, Rx Complete USART_RXC_vect SIG_USART_RECV SIG_UART_RECV USART Data Register Empty USART_UDRE_vect SIG_USART_DATA SIG_UART_DATA USART, Tx Complete USART_TXC_vect SIG_USART_TRANS SIG_UART_TRANS ADC Conversion Complete ADC_vect SIG_ADC EEPROM Ready EE_RDY_vect SIG_EEPROM_READY Analog Comparator ANA_COMP_vect SIG_COMPARATOR 2-wire Serial Interface TWI_vect SIG_2WIRE_SERIAL Store Program Memory Ready SPM_RDY_vect SIG_SPM_READY 37

Modyfikator volatile Zmienne globalne, które mają być wykorzystywane wewnątrz zwykłych funkcji i funkcji obsługi przerwań powinny być zaopatrzone w modyfikator volatile volatile TYP_ZMIENNEJ NAZWA_ZMIENNEJ; Modyfikator volatile zapobiega optymalizacji polegającej na operowaniu przez program na tymczasowej kopii zmiennej, co może być źródłem utraty danych 38

PROGMEM Zmienne, które nie będą modyfikowane, a potrzebują dużo pamięci mogą być trzymane w pamięci programu, zamiast pamięci RAM #include <avr/pgmspace.h> TYP ZMIENNA PROGMEM = WARTOŚĆ; TYP ZMIENNA_1 = pgm_read_xxx(adres_zmiennej); 39

PROGMEM W zależności od lokalizacji zmiennej w pamięci wyróżnia się wersje near i far funkcji pgm_read_xxx Adres w wersji near jest 16-bitowy, natomiast w wersji far 32-bitowy 40

PROGMEM Funkcje w wersji far pgm_read_byte_far(address_long) pgm_read_word_far(address_long) pgm_read_dword_far(address_long) pgm_read_float_far(address_long) 41

PROGMEM Funkcje w wersji near pgm_read_byte(address_short) pgm_read_word(address_short) pgm_read_dword(address_short) pgm_read_float(address_short) 42

Modyfikator inline Modyfikator ten informuje kompilator, że jeśli nastąpi wywołanie funkcji inline, to zamiast wygenerować w tym miejscu przeniesienie sterowania (skok) do tej funkcji, bezpośrednio wstawi wygenerowany kod tej funkcji Funkcje inline stosuje się w sytuacji, gdy wydajność jest ważniejsza od objętości kodu wynikowego 43

Modyfikator inline Przykład inline uint8_t max(uint8_t a, uint8_t b) { return a > b? a : b; } 44

cli() i sei() Aby zapewnić niepodzielność operacji przez przerwania, które mogłyby być w tym czasie zgłoszone, stosuje się funkcje cli() i sei(), blokującą i odblokowującą globalną obsługę przerwań na czas wykonywania takiej operacji 45

Obsługa portów I/O Makra upraszczające obsługę portów I/O #define PORT(x) XPORT(x) #define XPORT(x) (PORT##x) #define PIN(x) XPIN(x) #define XPIN(x) (PIN##x) #define DDR(x) XDDR(x) #define XDDR(x) (DDR##x) Np. #define DRIVER_PORT A #define DRIVER_PIN_0 0 PORT(DRIVER_PORT) = (1 << DRIVER_PIN); 46

Optymalizacja kodu Optymalizacja kodu 47

Cele optymalizacji Ograniczenie rozmiaru kodu wynikowego Ograniczenie zużycia pamięci operacyjnej Ograniczenie zużycia czasu procesora Zapewnienie niezawodności programu Ograniczenie liczby potencjalnie niebezpiecznych elementów kodu 48

Ograniczenie rozmiaru kodu wynikowego Przykłady realizacji Unikanie funkcji inline Unikanie powtarzania tych samych fragmentów kodu, jeśli to możliwe zastąpić je jedną funkcją Niekorzystanie z rozbudowanych gotowych funkcji, jeśli ich możliwości nie będą w pełni wykorzystane Użycie flagi optymalizacji s 49

Ograniczenie zużycia pamięci operacyjnej Stosowanie zmiennych ze znakiem i/lub zmiennoprzecinkowych tylko w razie konieczności Stosowanie możliwie małych typów danych Dokładne szacowanie objętości potrzebnych danych w pamięci RAM Unikanie rekurencji Stosowanie dynamicznego przydziału pamięci tylko w ostateczności (ryzyko wycieku) 50

Ograniczenie zużycia czasu procesora Wykorzystywanie funkcji inline Wstawki assemblerowe Jeśli to możliwe zastąpienie złożonych funkcji arytmetycznych (np. sin, cos) tablicami Korzystanie z flag optymalizacji 1, 2, 3 Unikanie typów zmiennych liczbowych, na których operacje arytmetyczne wykonywane są w sposób programowy Operacje arytmetyczne wykonywać na liczbach całkowitych 51

Poprawienie czasu odpowiedzi programu Wykorzystywanie asychronicznych trybów pracy peryferiów Przeniesienie możliwie dużej części sterowania programem do funkcji obsługi przerwań (pamiętając o priorytetach przerwań!) Priorytetyzacja zadań w programie Uproszczenie i optymalizacja funkcji krytycznych dla responsywności systemu 52

Zapewnienie niezawodności programu Unikanie dynamicznego alokowania pamięci oraz korzystanie z narzędzi do analizy użycia pamięci Unikanie funkcji operujących na strumieniach, o zmiennej liczbie argumentów itp. Unikanie operowania na rejestrach korzystając z numerów bitów zamiast nazw bitów Korzystanie z układów BOD (Brown-out Detection) i watchdog 53

Przykład Przykład prostego programu 54

Przykład prostego programu #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t led = 0; //obsluga przerwan INT0 (przycisk) ISR (INT0_vect) { led = (led + 1) % 2; } 55

Przykład prostego programu int main(void) { //konfiguracja portow I/O DDRA = (1<<DDA0); //wyjscia sterujace diodami PORTA = (1<<PORTA0); PORTD = (1<<PORTD2); //wejscie przycisku cli(); //blokujemy globalnie dzialanie przerwan MCUCR = (1<<ISC01); //przerwania INT0 reagujace na zbocze opadajace (nacisniecie przycisku) GICR = (1<<INT0)); //wlaczamy przerwania INT0 sei(); //odblokowujemy globalnie dzialanie przerwan 56

Przykład prostego programu //nieskonczona petla glowna programu while(1) { if(led == 0) PORTA &= ~(1<<dioda); else PORTA = (1<<dioda); } } return 0; 57