Image245

Image245



Programowanie


ABC... C

Jak działają strumienie?

Pamiętasz, jak do tej pcry obsługiwaliśmy napisy na wyświetlacza LCD? Pisaliśmy oddzielne funkcje do wypisania łańcucha znaków, do wypisania liczby w formacie dzics.ętnym czy szesnastkowym.

Idea funkcji operujących na zasadzie strumieni zdejmuje z nas obowiązek tworzenia wszystkich pize-


lańcuch w pwl{tl programu hib danyck


kształceń Wymaga od nas jedynie stworzenia funkcji wypisującej oraz odczytującej jeden znak. Genialność pomysłu pokazuje rysunek w ramce:

Funkcje get i put

Dwie powyższe funkcje nie są dokładnie określone przez standard ANSl C. W AYR-GCC muszą one mieć formę jak poniżej:

int pur(char znak) int get(void)

Funkcja put powinna zwracać 0. jeśli wysyłanie znaku przebiegło pomyślnie, w innym przypadku zwracamy wartość ujemną, co spowoduje przerwanie działania operującej na niej funkcji - nawet jeśli wszystkie jej dane nie zostały wysłane. Podobnie sytuacja ma się z funkcją get. Tutaj jednak funkcja nor malnic zwraca odebraną daną, gdy wystąpi błąd, należy zwrócić wartość ujemną.


Inicjowanie urządzenia

Zakładając, że posiadamy już gotowe funkcje put oraz get, musimy jeszcze poinformować funkcje z biblioteki stdio o tym, żc chcemy właśnie z nich korzystać. Wykonujemy to za pomocą funkcji fdevopen. Jej składnię przedstawiam poniżej:

fdevopen(put, get, 0);

Ostatni parametr jest niewykorzystany i powinien mieć zawsze wartość 0. Po wywołaniu jak wyżej, pedane funkcje zostaną przyporządkowane, odpowiednio, domyślnemu wyjściu oraz wejściu. Od tej chwili wywołanie przykładowej funkcji puls z listingu 52 da oczekiwany efekt przesłania kolejnych znaków ‘H’ ‘e* T T ‘o‘ * ‘ w’ ‘o’ *r* T *d‘ kolejnodo funkcji put. Co z kolei w niej będzie się działo z przesłanymi znakami, to już kwestia naszych poUzeb i inwencji.


* List c source fUes here.


Listing 54 — plik rs./i


Rys. 38 Dodanie pliku rs.c Rys. 39 Efekt działania programu


HAV <1*»1 AVR Tt*milii<il miniatur


[folie u<r lcl


fol U ucrlcl


:OMI:«OOlN,Oll


Utwórz teraz ostatni potrzebny nam, nowy plik. Zapisz go pod nazwą harddef.h. Tak jak robiliśmy to poprzednio, zmieścimy w nim wszystkie definicje dotyczące części sprzętowej. Za taką możemy uznać prędkość transmisji. Może wydaje Ci się to bezcelowe tworzenie nowego pliku dla jednej tylko danej. Jednak trzeba wziąć pod uwagę, że program może się rozrastać. Najlepiej od początku utrzymywać w nim porządek. Zawartość wspomnianego pliku pokazuje listing 55.

Jeśli zaczynasz się gubić w tym, co robimy, nic poddawaj się teraz! Przed nami ostatnia prosta, która nada sens wszystkim naszym działaniom. Listing 56 pokazuje zmienioną funkcję main. Teraz program po skompilowaniu i władowaniu danych do procesora zacznie działać zgodnie z naszym zamierzeniem. Konieczne będzie podłączenie płytki do wolnego portu RS232 w naszym komputerze. Do komunikacji wykorzystać można dowolny program terminala. Może być to nawet terminal wbudowany w środowisko BASCOM. Transmisję należy skonfigurować na:

Liczba bitów na sekundę: 4800 Bity danych: 8 Parzystość: Brak Bity stopu: 1

Rysunek 39 pokazuje efekt działania pro


gramu Po każdym zerowaniu procesor wyśle kolejny napis.

Zgodnie z dokumentacją, funkcja puts dodaje na koniec znak nowej linii. Nie wyprowadza jednak znaku powrotu karetki, co daje widoczny na rysunku 39 efekt. Nie każdy terminal zinterpretuje przesyłane dane w taki właśnie sposób, jednak aby zupełnie pozbyć się problemu, możemy napis zamienić na:

„Hello world!\r"

W ten sposób ręcznie dodamy przed - znakiem nowej linii znak powrotu karetki i wszystkie nowe napisy ułożą się jeden pod drugim.

Jaki to ma sens

Dobrze więc... utworzyliśmy, zajmujący ponad 1KB pamięci, program wypisujący za pomocą portu RS ładne przywitanie. Początek nie wypadł nam zachwycająco. Zmniejszanie zajętości pamięci związane będzie z tematem, który chcę omówić dopiero w kolejnej części Teraz zajmijmy się poznaniem funkcji, która tak naprawdę sprawia, że biblioteka stdio jest potężnym narzędziem Przeczytaj ramkę ABC... C -printf, razem z dołączonymi do niej tabelkami. Nie wygląda to może w tej chwili najprościej, dlatego też proponuję natychmiast przejść do przykładu pokazanego na listingu 57. Jedyne, co musisz zmienić, to zawartość funkcji main. Ze względu na oszczędność miejsca inicjacja portu szeregowego, która nie uległa zmianie, została wykrop-kowana.

Działanie przykładowego programu pokazuje rysunek 40.

Pobaw się tym kodem. Sprawdź,


Hi fndef RS_H_lNCLUUtD

tfdefine rs_h_included

tfdefine RS_MAKE_U3RR(baud) Cf CPU/(baud*161)-U #define RS_SET_RAun(baud) \

{UBRR0H = (uint8_t)(RS_MAKE_UBRR(baud)»8); \ UBRROl - (uint8_t)RS_MAKE_UBRR(bajd); }

int rs_put(char znak); int rs_get(vo1d);

#endif // rs_h_included


Listing 55 - plik harddef.h

łt i fndef harddef_h_inl»uułu #define harddef_h_included

fldefine def.baud 4800

#endif harddef_h_included


Listing 55 - plik harddef.h

#i tndef harddef_h_included #define harddef_h_inciuded

#defi ne DEF_BAUD 4800 #end'f // HARDDEF_H_INCLUDED


Listing 56 - zmiany w pliku main umodimające działanie programu

tfinclude <avr\io.h>

#include <striio.h>

tfinclude „rs.h” tfinclude „harddef.h*


1nt mair(void)

{

/nłujijiiji/iiijmmmiuunjwunu

// Inicjacja porru szeregow/ego rs_set_baud(def_baue>) ;

UCSR0C - «URGEL0 | 1«ICSZ01 | I«UC3Z00; UCSR0B - 1«RXEN0 | 1«TXEN0;

U3SR0A - Oj

/f Koniec inicjacji

////////////////////////////////////////////

// Inicjacja funkcji domyślnych strumieni i o fdevopen(rs_put, rs_get, 0);


puts(„Hello world!“);


Luty2006 Elektronika dla Wszystkich


i


Wyszukiwarka

Podobne podstrony:
Image37 (5) Programowanie ■ Programowanie ■ sób jak do tej pory: COMPORT &=
cz4 Programowanie ABC... C Jak zrobić pętlę tak by się nie zapętlić... W C występują trzy różn
Image211 Programowanie ABC... C ttdefine I wiele innych linii Wspominałem o tym w części 3. Przypomi
na dz z pol058 118 zjawiska masowego, a więc nie wcześniej jak w połowie wieku XI. Jak do tej pory,
110 MICHAŁ TABISZ do odwołania. Było ono zarazem pierwszym i jak do tej pory ostatnim w dziejach bry
Autorami najpełniejszej wersji, jak do tej pory jedynie teoretycznej, koncepcji wartości zindywidual
•    Jeżeli jest kontynuacja, to zasady takie jak do tej pory, jeśli nie ma kontynuac
Jak wynika z monitorowania wdrożeń polityki, większość krajów członkowskich dokonała, jak do tej por
Image222 (3) Programowanie ■ indeksu. Normalnie funkcje te powinny zwracać wartość 0. Jeśli jednak z
ze konkurencja jest niewielka i co za tym idzie, możliwość pozyskania klientów jest większa Jak do t
Jak do tej pory podatki bezpośrednie pozostawiono całkowicie w gestii krajów członkowskich. Jednakże

więcej podobnych podstron