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



Podobne dokumenty
#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 ); }

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

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

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

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

TECHNIKA MIKROPROCESOROWA

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

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

Biblioteka standardowa - operacje wejścia/wyjścia

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Komunikacja w mikrokontrolerach Laboratorium

2 Przygotował: mgr inż. Maciej Lasota

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

Pliki. Informacje ogólne. Obsługa plików w języku C

Instytut Teleinformatyki

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

dokument DOK wersja 1.0

Opis procedur asemblera AVR

Programowanie mikrokontrolerów. 15 stycznia 2008

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

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Architektury Komputerów - Laboratorium Informatyka III rok studia dzienne

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Mikrokontrolery AVR Wprowadzenie

1. Wprowadzanie danych z klawiatury funkcja scanf

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

Kod produktu: MP01105

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Przemysłowy odtwarzacz plików MP3

Oprogramowanie klawiatury matrycowej i alfanumerycznego wyświetlacza LCD

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

Funkcje zawarte w bibliotece < io.h >

1. Wprowadzenie Programowanie mikrokontrolerów Sprzęt i oprogramowanie... 33

Instytut Teleinformatyki

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

Instytut Teleinformatyki

Pliki. Informacje ogólne. Obsługa plików w języku C

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Programowanie strukturalne język C - wprowadzenie

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

Tworzenie prostej etykiety i synchronizacja etykiet z wagą. AXIS Sp. z o.o. Kod produktu:

Instytut Teleinformatyki

7 Przygotował: mgr inż. Maciej Lasota

Funkcje zawarte w bibliotece < io.h >

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

ND48-RS protokół komunikacyjny ASCII A2.04

Tablice, funkcje - wprowadzenie

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

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

Tworzenie prostej etykiety i synchronizacja etykiet z wagą. AXIS Sp. z o.o. Kod produktu:

Instytut Teleinformatyki

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Kod produktu: MP01611

Wizualizacja stanu czujników robota mobilnego. Sprawozdanie z wykonania projektu.

Parametryzacja przetworników analogowocyfrowych

ZL16AVR. Zestaw uruchomieniowy dla mikrokontrolerów ATmega8/48/88/168

wer. 7 z drobnymi modyfikacjami Wojciech Myszka :48:

Instrukcja do oprogramowania ENAP DEC-1

Instrukcja programu użytkownika OmegaUW.Exe. Program obsługuje następujące drukarki fiskalne: ELZAB OMEGA II generacji ELZAB OMEGA F, MERA, MERA F.

Język C i C++. Podstawy. Zagadnienia do opanowania. Przykład 1. (modyfikuj kod, aby zrealizować punkty 5., 7.)

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Sterownik silnika krokowego. Aleksander Koreń

KURS C/C++ WYKŁAD 1. Pierwszy program

ZL15AVR. Zestaw uruchomieniowy dla mikrokontrolerów ATmega32

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

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 7- sem.iii. M. Czyżak

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

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

TECHNIKA MIKROPROCESOROWA II

Podstawy programowania w języku C++

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

Zmienne, stałe i operatory

1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Schemat blokowy architektury AVR

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Instrukcja dla: Icomsat v1.0 SIM900 GSM/GPRS shield for Arduino oraz dla GPRS Shield produkcji Seeedstudio.

Stałe i zmienne znakowe. Stała znakowa: znak

Operacje wejścia/wyjścia odsłona pierwsza

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

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

BUFFOR WYDRUKU MBW-AT128UK

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

ZL2AVR. Zestaw uruchomieniowy z mikrokontrolerem ATmega8

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

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)

Kod produktu: MP01105T

Pomiar napięcia i szeregowa transmisja danych z uŝyciem mikrokontrolera

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

Ćwiczenia podstawowe, zestaw 5, część 1

Przemysłowy odtwarzacz plików MP3 SD

Transkrypt:

Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych Przykłady wykorzystanie funkcji printf i scanf do wyświetlania danych na wyświetlaczu LCD oraz komunikacji sterownika mikroprocesorowego z uŝytkownikiem za pomocą terminala szeregowego 1. Wprowadzenie Standardowa biblioteka avr-libc zawiera definicje funkcji z grupy printf, które umoŝliwiają tworzenie i zapisywanie formatowanego tekstu na podstawie szablonu oraz zestawu argumentów. Funkcje te, zaleŝnie od implementacji, moŝemy wykorzystywać w oprogramowaniu mikrokontrolera do formatowania tekstu wyświetlanego na wyświetlaczach, przesyłanego w formie kodów ASCII do drukarki lub terminala znakowego itp. Podstawowe funkcje z grupy printf to: int printf (const char *format,...); - utworzony tekst jest wysyłany na standardowy strumień wyjściowy int fprintf (FILE *stream, const char *format,...); - utworzony tekst wysyłany jest do strumienia stream int sprintf(char *str, const char *format,...); - utworzony tekst jest zapisywany do pamięci zgodnie z podanym wskaźnikiem str. Do pobierania i konwersji danych z urządzeń znakowych dedykowane są funkcje typu scanf. Podstawowa funkcja z tej grupy to: int scanf (const char *format,...); - pobiera znaki ze standardowego strumienia wejściowego, przekształca je zgodnie z podanym szablonem i przypisuje do zmiennych podanych w liście argumentów Biblioteka avr-libc definiuje standardowe strumienie stdin, stdout i stderr. PoniewaŜ w systemach opartych o mikrokontrolery nie są z góry określone urządzenia wejścia-wyjścia, strumienie te nie są inicjowane w kodzie startowym programu. Z tego samego powodu nie istnieje funkcja fopen(), która moŝe skojarzyć strumień z urządzeniem. Dlatego przed korzystaniem z funkcji printf lub/i scanf musimy zdefiniować funkcje wysyłające lub/i pobierające znaki i utworzyć odpowiednie strumienie. Sposób definiowania strumieni jest opisany w dalszej części. Przekazywany do funkcji wskaźnik (const char *format) wskazuje na szablon (stałą łańcuchową), która zawiera: zwykłe znaki, kopiowane do strumienia wyjściowego, 1

pola formatujące dla kolejnych argumentów. Pola zaczynają się od znaku % i określają typ pola (wstawianego argumentu). Podstawowe typy pól interpretowanych w bibliotece avr-libc: %d - liczba całkowita ze znakiem w formacie dziesiętnym, %x, %X - liczba całkowita bez znaku w formacie szesnastkowym, z uŝyciem odpowiednio małych liter i wielkich liter, %o - liczba całkowita bez znaku w formacie oktalnym, %u - liczba całkowita bez znaku w formacie dziesiętnym, %f, %e, %g - liczba zmiennoprzecinkowa ze znakiem, %c - znak, %s - łańcuch tekstowy, %p - wskaźnik typu void. Funkcje printf i scanf posiadają swoje odpowiedniki, w których wzorce (formaty) tekstowe umieszczone są w pamięci programu, co pozwala oszczędzać pamięć RAM. Funkcje te maja nazwę zakończoną '_P' (printf_p, sprintf_p, scanf_p itd.) 2. Definiowanie strumieni wejścia-wyjścia dla funkcji typu printf i scanf Zanim zaczniemy korzystać z funkcji printf i scanf musimy: 1. Zdefiniować funkcje wysyłające i obierające znaki z urządzenia wejścia-wyjścia. Funkcje te muszą mieć następujące prototypy: int put(char c, FILE *strem) funkcja wysyłająca znaki; powinna zwrócić 0 gdy wysłanie znaku przebiegło pomyślnie lub wartość róŝną od zera gdy wysłanie znaku nie było moŝliwe; argumenty funkcji to znak do wysłania i wskaźnik do FILE, int get(file *strem) funkcja pobierająca znaki; zwraca kod pobranego znaku. Jeśli wystąpi błąd, funkcja zwraca wartość ujemną (_FDEV_ERR). 2. Otworzyć/zainicjować strumień wejścia-wyjścia korzystając z: funkcji: FILE *fdevopen( int()(char, FILE*) put, int()(file*)get ) - otwierającej strumień dla urządzenia z podanymi funkcjami wejścia-wyjścia lub makra : #define FDEV_SETUP_STREAM( put, get, rwflag ) - definiującego strumień stdio, gdzie argument rwflag określa atrybuty dostępu do strumienia : _FDEV_SETUP_READ, _FDEV_,SETUP_WRITE, _FDEV_SETUP_RW. 2

3. Przykłady implementacji Przedstawione dalej przykładowe programy wykorzystują funkcje do formatowania danych odbieranych i wysyłanych portem szeregowym. Jako terminal szeregowy zostanie wykorzystany komputerem PC z programem narzędziowym Hyper Terminal, w którym skonfigurowano takie same parametry transmisji jakie przyjęto przy inicjowaniu układów USART mikrokontrolera (zaznaczając BREAK dla sterowania przepływem). Konfiguracja zestawu uruchomieniowego ZL10AVR: mikrokontroler ATmega16 zworka JP21 w pozycji U2/3/5/6, zestaw ZL10 z dodatkowym modułem konwertera ZL4_USB, piny procesora PD0 (RXD0) i PD1 (TXD) połączone do układu konwerter USB, JP13 i JP14 w pozycji ON, JP12 i JP8 w pozycji USB. Przykład 1 Wydruk 2 przedstawia kod programu, w którym utworzono strumień wyjściowy dla portu szeregowego. Program wysyła na terminal aktualny stan zmiennej int w formacie dziesiętnym i szesnastkowym. Zmienna jest zwiększana co sekundę. Układ transmisji szeregowej USART został skonfigurowany w funkcji uart_init() (Wydruk 1): prędkość transmisji 9600 bodów, ramka danych 8-bitowa, bez parzystości, dwa bity Stopu. #define BAUDRATE 9600L //predkosc transmisji w bodach #define BAUD_REG ((F_CPU/(16*BAUDRATE))-1) //dzielnik dla transm. szeregowej void uart_init(void) UBRRH=(BAUD_REG>>8); UBRRL= BAUD_REG; //inicjowanie portu UART //dzielnik dzestotliwości transmisji //Format ramki danych: 8data,2stopbit UCSRC=(1<<URSEL) (1<<USBS) (3<<UCSZ0); UCSRB=(1<<RXEN) (1<<TXEN); //włączenie odbiornika i nadajnika Wydruk 1. Funkcja konfigurująca port szeregowy 3

#include <avr/io.h> #include <stdio.h> #define F_CPU 8000000L //częstotliwość zegara systemu #include <util/delay.h> void uart_init(void); //Inicjowanie portu transmisji szeregowej static int uart_putchar(char c, FILE *stream) //funkcja wyjściowa strumienia loop_until_bit_is_set(ucsra, UDRE); UDR=c; return 0; // definicja standardowego strumienia do zapisu static FILE mystdout= FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE); //---------------------------------------------------- int main(void) int counter=0; uart_init(); stdout = &mystdout; printf("\n\rsism 2011\n\r"); for(; ;) _delay_ms(1000); printf("\rlicznik:%5d (0x%04X)", counter, counter); counter++; return 0; Wydruk 2. Kod programu z przykładu 1 4

Widok okna terminala podczas działania programu przedstawia Rys.1. Rys. 1. Tekst wysyłany przez mikrokontroler portem szeregowym 5

Przykład 2 Przykład demonstruje definicję strumienia wejścia-wyjścia dla portu szeregowego. Program oczekuje na wprowadzenie liczby, którą następnie wyświetla w postaci dziesiętnej i szesnastkowej. #include <avr/io.h> #include <stdio.h> #define F_CPU 8000000L #include <util/delay.h> void uart_init(void); //Inicjowanie portu transmisji szeregowej //funkcja wyjsciowa strumienia static int uart_putchar(char c, FILE *stream) loop_until_bit_is_set(ucsra, UDRE); UDR=c; return 0; //funkcja wejsciowa strumienia static int uart_getch(file *stream) loop_until_bit_is_set(ucsra,rxc); return UDR; // definicja standardowego strumienia do zapisu i odczytu static FILE mystdio = FDEV_SETUP_STREAM(uart_putchar, uart_getch, _FDEV_SETUP_RW ); //---------------------------------------------------- int main(void) int input_i; uart_init(); stdout = &mystdio; stdin = &mystdio; for( ; ; ) printf("\n\n\rpodaj adres(0-255):"); scanf("%d",&input_i); printf("\n\rwprowadziles %d (0x%02X)", input_i,input_i); return 0; Wydruk 3. Kod programu z przykładu 2 6

Rys.2 przedstawia okno terminala szeregowego podczas działania programu. Układ transmisji szeregowej USART został skonfigurowany tak jak w przykładzie 1. Uwaga: Po wprowadzeniu cyfr liczby, naciśnij Enter. Rys.2. Okno terminala podczas działania programu z przykładu 2 7

4. Przykłady zadań do zrealizowania 1. Napisać program umoŝliwiający zapis danej do pamięci EEPROM, za pomocą terminala RS połączonego do systemu mikrokontrolera. Program powinien umoŝliwiać wprowadzenie adresu pamięci, wyświetlenie aktualnej zawartości oraz wpisanie nowej. 2. Napisać program udostępniający uŝytkownikowi proste menu, które umoŝliwi odczyt portów wejściowych oraz ustawianie wybranych portów wyjściowych. 3. Napisać program, który przed wyświetleniem menu, oczekuje na podanie 5-cyfrowego kodu dostępu. 4. Utworzyć strumień wyjściowy dla funkcji printf wysyłający kody ASCII dla wyświetlacza LCD. 5. Pytania 1. Co naleŝy zmienić w przykładzie 1, aby zamiast wysyłać dane do terminala, wyświetlać je na wyświetlaczu tekstowym LCD? 2. Czy moŝemy utworzyć kilka strumieni tak, aby program mógł jednocześnie np. wysyłać dane do terminala tekstowego i wyświetlać napisy na wyświetlaczu LCD? 3. Czy wzorce formatowania mogą być umieszczone w pamięci programu (ROM)? 8. Literatura 1. Jerzy Szczesiul, AVR-GCC: kompilator C dla mikrokontrolerów AVR, Elektronika Praktyczna, Kurs od 3 /2005 do 4/2006 2. Andrzej Witkowski, Mikrokontrolery AVR programowanie w języku C przykłady zastosowań, Gliwice 2006 3. www.atmel.com/dyn/resources/prod_documents/8154s.pdf dokumentacja atmega16 4. www.nongnu.org/avr-libc/user-manual/ podręcznik uŝytkownika biblioteki avr-libc 5. www.kamami.com/dl/zl10avr_en.pdf dokumentacja techniczna: ZL10AVR- uniwersalny zestaw uruchomieniowy dla mikrokontrolerów AVR 8