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

Podobne dokumenty
2 Przygotował: mgr inż. Maciej Lasota

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

Języki i metodyka programowania. Wprowadzenie do języka C

Zmienne, stałe i operatory

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

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

Język C zajęcia nr 11. Funkcje

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

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

Kompilator języka C na procesor 8051 RC51 implementacja

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

1 Podstawy c++ w pigułce.

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

1 Podstawy c++ w pigułce.

Programowanie strukturalne i obiektowe

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Mikrokontroler ATmega32. Język symboliczny

Programowanie strukturalne język C - wprowadzenie

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

( wykł. dr Marek Piasecki )

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Wstęp. do języka C na procesor (kompilator RC51)

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

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Języki i metody programowania. Omówienie języków C, C++ i Java

ZASOBY ZMIENNYCH W STEROWNIKACH SAIA-BURGESS

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

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

Wstęp do Programowania, laboratorium 02

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

PROGRAMOWANIE w C prolog

Programowanie mikrokontrolerów AVR

Tablice, funkcje - wprowadzenie

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Podstawy i języki programowania

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

PMiK Programowanie Mikrokontrolera 8051

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

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Wstęp do programowania

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Inżynieria Wytwarzania Systemów Wbudowanych

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

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

2. Architektura mikrokontrolerów PIC16F8x... 13

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

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

Struktury, unie, formatowanie, wskaźniki

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Programowanie obiektowe

Podstawy programowania w języku C

4 Standardy reprezentacji znaków. 5 Przechowywanie danych w pamięci. 6 Literatura

Biblioteka standardowa - operacje wejścia/wyjścia

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Podstawy programowania C. dr. Krystyna Łapin

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Podstawy programowania w języku C i C++

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Programowanie w języku C++

Wprowadzenie do języka Java

Wskaźniki. Informatyka

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

Powtórka algorytmów. Wprowadzenie do języka Java.

Wykład 2 Składnia języka C# (cz. 1)

Pytania sprawdzające wiedzę z programowania C++

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

PARADYGMATY PROGRAMOWANIA Wykład 4

Język C - podstawowe informacje

Powtórka algorytmów. Wprowadzenie do języka Java.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Wstęp do wskaźników w języku ANSI C

Tworzenie aplikacji rozproszonej w Sun RPC

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

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Podstawy Programowania 1 Wstęp. Plan. Informacje organizacyjne. Bibliografia Literatura Podstawowa. Notatki. Notatki. Notatki.

Lab 9 Podstawy Programowania

Język C, tablice i funkcje (laboratorium, EE1-DI)

Laboratorium 1: Podstawy języka c. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Wprowadzenie. Organizacja pracy i środowisko programistyczne. Mirosław Ochodek

Transkrypt:

Temat 7. Programowanie mikrokontrolerów z rodziny PIC16 w języku C przy użyciu HI-TECH C for PIC10/12/16 Spis treści do tematu 7 7.1. Używanie kompilatora 7.2. Rozszerzenia języka ANSI C 7.3. Optymalizacja kodu programu 7.4. Literatura fizyka.p.lodz.pl/pl/dla-studentow/tc/ T7-1

7.1. Używanie kompilatora Kompilator HI-TECH C for PIC10/12/16 w wersji LITE (z wyłączonymi niektórymi optymalizacjami) może być używany za darmo bez ograniczeń jako: 1) kompilator wywoływany przez środowisko MPLAB IDE, co wymaga utworzenia w tym środowisku projektu (tworzenie projektu opisano dokładniej w instrukcji do ćwiczenia laboratoryjnego E59). 2) aplikacja wywoływana z linii komend: PICC [opcje] pliki [biblioteki] gdzie typ pliku jest rozpoznawany po rozszerzeniu:.c - plik źródłowy w języku C,.as,.asm - plik źródłowy w asemblerze,.obj,.lib - pliki ze skompilowanym kodem. Wygenerowany kod programu trafia do pliku.hex W celu uzyskania listy możliwych opcji wywołać: PICC --HELP Argumenty wywołania można umieścić w pliku, np. xyz.cmd i wywołać: PICC @xyz.cmd T7-2

7.2. Rozszerzenia języka ANSI C Kompilator HI-TECH C for PIC10/12/16 oprócz standardu ANSI C oferuje szereg rozszerzeń dostosowanych do architektury mikrokontrolerów. 7.2.1. Literały stałe Oprócz formatów wartości stałych przewidzianych w standardzie ANSI C kompilator HI- TECH C umożliwia także zapis stałych binarnych: system liczbowy binarny ósemkowy dziesiętny szesnastkowy Format 0bliczba, 0Bliczba 0liczba liczba 0xliczba, 0Xliczba Przykład 0b10011010 0763 129 0x2F T7-3

7.2.2. Podstawowe typy danych Typ danych bit signed char unsigned char signed short unsigned short signed int unsigned int signed short long unsigned short long signed long unsigned long float double Rozmiar - liczba bitów 1 8 8 16 16 16 16 24 24 32 32 24 albo 32 24 albo 32 Typ arytmetyczny całkowity bez znaku całkowity ze znakiem całkowity bez znaku całkowity ze znakiem całkowity bez znaku całkowity ze znakiem całkowity bez znaku całkowity ze znakiem całkowity bez znaku całkowity ze znakiem całkowity bez znaku zmiennoprzecinkowy zmiennoprzecinkowy kolor czerwony typy niestandardowe T7-4

7.2.3. Rejestr konfiguracyjny Wartość rejestru konfiguracyjnego można ustawić na etapie programowania przy użyciu makrodefinicji CONFIG zdefiniowanej w pliku nagłówkowym htc.h, np.: #include<htc.h> CONFIG(WDTDIS & HS & UNPROTECT); Uwaga: ten rejestr nie jest dostępny wewnątrz wykonywanego programu. T7-5

7.2.4. Dostęp do rejestrów specjalnych podczas wykonywania programu Dostęp do specjalnych rejestrów leżących w przestrzeni adresowej wej./wyj. jest możliwy poprzez zmienne o ustalonych adresach absolutnych, np.: volatile unsigned char TRISB @ 0x086; volatile bit TRISB3 @ ((unsigned)&trisb*8)+3; Zamiast definiować samodzielnie takie zmienne warto skorzystać z gotowego pliku nagłówkowego htc.h, np: #include<htc.h> OPTION = PSA; TRIS = 0xFF; Dla poszczególnych typów mikrokontrolerów przygotowano pliki nagłówkowe opisujące ich specyficzne właściwości, np.: pic16f874a.h, pic16f819.h. Plik odpowiedni dla wybranego urządzenia docelowego zostanie wstawiony pośrednio poprzez #include<htc.h>. T7-6

7.2.5. Dostęp do pamięci EEPROM Większość mikrokontrolerów PIC16Fxxx posiada 3 typy pamięci: 1) FLASH dla kodu programu, słowa 14 bitowe, 2) (S)RAM szybka pamięć dla danych, ulotna po zaniku zasilania, 3) EEPROM wolna ale trwała pamięć dla danych. Początkowa zawartość pamięci EEPROM może być ustawiona na etapie programowania: #include<htc.h> EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7); EEPROM_DATA(8, 9, 10, 11, 12, 13, 14, 15); Makrodefinicja przyjmuje 8 parametrów typu bajt. Wywołanie tej makrodefinicji może być powtarzane wiele razy w celu zdefiniowania wymaganej liczby początkowych bajtów w pamięci EEPROM. T7-7

c.d. - dostęp do pamięci EEPROM Dostęp do pamięci EEPROM podczas wykonywania programu jest możliwy przy użyciu funkcji eeprom_write() oraz eeprom_read() do zapisu oraz odczytu jednego bajtu pod wskazanym adresem, np: #include<htc.h> void eetest(void) { unsigned char value = 1; unsigned char address = 0; // zapis do pamięci EEPROM eeprom_write(address, value); } // odczyt z pamięci EEPROM value = eeprom_read(address); //... T7-8

7.2.6. Obsługa przerwań w języku C Mikrokontrolery z rodziny PIC16F umożliwiają wykorzystanie tylko jednej funkcji do obsługi wszystkich niezamaskowanych przerwań, dlatego wewnątrz funkcji należy sprawdzać przyczyny wystąpienia przerwania, np.: #include<htc.h> volatile int tick_count = 0; void interrupt tc_int(void) { if (TOIE && T0IF) { // jeżeli przerwania TIMER0 są włączone // i przerwanie zostało zgłoszone T0IF = 0; // wytrzyj flagę zgłoszenia przerwania ++ tick_count; return; } // obsługa innego źródła przerwań } T7-9

c.d. - obsługa przerwań w języku C Przerwania domyślnie są wyłączone. Żeby je włączyć należy ustawić maski odpowiednio wybranych przerwań oraz globalnie włączyć przerwania: T0IE = 1; // przerwania zegara 0 będą używane ei(); // ogólne włączenie niezamaskowanych przerwań //... di(); // ogólne wyłączenie przerwań Uwaga: maski przerwań (np. T0IE) i flagi przerwań (np. T0IF) są specyficzne dla poszczególnych modeli mikrokontrolerów. Należy je sprawdzić w dokumentacji dla odpowiedniego urządzenia (tzw. Data sheet ). T7-10

7.2.7. Wejście i wyjście standardowe Wejście standardowe stdin oraz wyjście standardowe stdout nie są zdefiniowane! Jeżeli programista chce używać funkcji operujących na standardowym wejściu, to musi sam zdefiniować elementarne funkcje pobierające jeden znak: char getch(void) {... } char getche(void) {... } Funkcja getch() odczytuje 1 bajt z wejścia standardowego, natomiast getche() dodatkowo zapisuje echo wprowadzanych znaków na wyjście standardowe. Przykładowo funkcja char * gets(char * s) jest implementowana jako powtarzające się wywołania getche(). Wykorzystanie funkcji zapisujących standardowe wyjście, np. printf(), wymaga zdefiniowania przez programistę własnej funkcji putch(), która musi mieć postać void putch(char c) {... } T7-11

7.3. Optymalizacja kodu programu Oprócz wykorzystania przełączników kompilatora dotyczących optymalizacji kodu można podać kilka reguł dotyczących przygotowania tekstu źródłowego programu. 7.3.1. Wybór optymalnego typu danych Mikrokontrolery PIC16Fxxx zawierają 8-bitową jednostkę arytmetyczno logiczną, posiadającą także specjalne instrukcje do operacji na bitach. Ponieważ wszystkie operacje na zmiennych dłuższych niż 1 bajt (8 bitów) są realizowane jako sekwencja operacji na bajtach, należy preferować typy całkowite o najmniejszym możliwym zakresie, np.: 1) wymagany zakres 0...0x1E0000 optymalny typ signed/unsigned short long (zamiast standardowych typów signed long albo unsigned long), 2) wymagany zakres 0...80 optymalny typ signed/unsigned char, 3) wymagane tylko wartości 0 oraz 1 optymalny typ bit. Ponadto typy całkowitoliczbowe należy preferować przez typami zmiennoprzecinkowymi. T7-12

7.3.2. Wykorzystanie operatorów Mikrokontrolery PIC16xxx nie posiadają instrukcji do bezpośredniego wykonywania operacji mnożenia, dzielenia i modulo. W miarę możliwości należy unikać operatorów języka C rozwijanych w kodzie programu jako wywołanie funkcji złożonych z wielu instrukcji: *, /, %, *=, /=, %= Przesunięcia bitów w prawo oraz w lewo są wykonywane bezpośrednio tylko dla przesunięć o 1 bit. Należy unikać przesunięć o wiele bitów oraz przesunięć o liczbę bitów daną poprzez zmienną, np.: zmienna1 >> 5; zmienna1 << przesuniecie; T7-13

7.3.3. Deklarowanie stałych Deklarowanie wartości stałych zamiast zmiennych (tam gdzie to możliwe) pozwala ograniczyć wykorzystanie niewielkich zasobów pamięci RAM: int zmienna = 3; // zmienna w pamięci RAM, const int stala = 3; // stała może być umieszczona w pamięci FLASH dla kodu. Stałe łańcuchy znaków są przechowywane w pamięci kodu programu, a ich typem jest const char * (a nie char *). Tak więc definicja char tablica[] = "znaki"; spowoduje wygenerowanie kodu inicjalizującego tablicę w pamięci danych znakami skopiowanymi z pamięci kodu programu. Jeśli tablica będzie tylko odczytywana, to warto dodać const, np.: const char tablica[] = "znaki"; // tablica pozostaje w pamięci kodu const char * cpp = "znaki"; // wskaźnik do tablicy w pamięci kodu T7-14

7.3.4. Wykorzystanie wskaźników Dostęp do zmiennej lub stałej poprzez wskaźnik generuje dodatkowe instrukcje maszynowe w porównaniu do odwołania bezpośredniego. Ponadto kompilator rozróżnia kilka typów wskaźników o różnym zasięgu i odpowiednio różnym narzucie na kod programu: 8-bitowe wskaźniki do danych w dwóch kolejnych bankach, np. banki 0 i 1, 8-bitowe wskaźniki do kodu programu o zakresie do 256 bajtów, 16-bitowe wskaźniki do danych w całej przestrzeni adresowej danych, 16-bitowe wskaźniki do kodu programu w całej przestrzeni adresowej programu, 16-bitowe wskaźniki do całej przestrzeni adresowej danych oraz kodu programu. Programista nie może bezpośrednio zadeklarować zasięgu wskaźnika. Kompilator dokonuje tego automatycznie na podstawie analizy użycia wskaźnika. T7-15

c.d. - wykorzystanie wskaźników Przykład: 8-bitowy wskaźnik ip do danych 16-bitowy wskaźnik ip do danych i kodu // dwie zmienne w tym samym banku int i; int j; void main(void) { const int * ip = &i; // jakieś operacje na *ip const int * ip = &j; // jakieś operacje na *ip } // zmienna w banku 0 oraz stała w kodzie int i; const int j = 0x3456; void main(void) { const int * ip = &i; // jakieś operacje na *ip const int * ip = &j; // jakieś operacje na *ip } T7-16

7.3.5. Funkcje z rodziny printf Funkcje z rodziny printf z biblioteki standardowej są generowane ze specjalnego wzorca po analizie kodu źródłowego programu. Przykładowo, jeśli program zawiera tylko jedno wywołanie: int var = 77; printf("input is: %d", var); to zostanie dołączony tylko kod funkcji do konwersji liczby całkowitej typu int na łańcuch znaków z liczbą w postaci dziesiętnej. Uwaga: jeżeli łańcuch znaków formatujących nie jest dany bezpośrednio jako stały łańcuch, to zostanie dołączony bardziej ogólny i obszerniejszy kod funkcji. T7-17

7.4. Literatura [1] Michrochip HI-TECH C for PIC10/12/16 User s Guide, data sheet DS51865B, 2010 Microchip Technology Inc. [2] Instrukcja do ćwiczenia E59 w lab. techniki cyfrowej Programowanie mikrokontrolerów PIC16 i urządzeń peryferyjnych w języku C. [3] B.W. Kernighan, D.M. Ritchie, Język ANSI C. Programowanie, Wydanie II, Helion, Gliwice 2010. [4] T. Jabłoński, K. Pławsiuk, Programowanie mikrokontrolerów PIC w języku C, Wydawnictwo BTC, Warszawa 2005. Pozycje [1] i [2] w plikach PDF dostępne na stronie: https://fizyka.p.lodz.pl/pl/dla-studentow/tc/ Pozycja [1] dostępna także jako część instalacji pakietu HI TECH Software. T7-18