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 nic są dokładnie określone przez standard ANSI C. W AVR-GCC muszą one mieć formę jak poniżej:
int put(char znak) int get(void)
Funkcja'pul 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 normalnie zwraca odebraną daną, gdy wystąpi błąd, należy zwrócić wartość ujemną.
Listing 54 — plik rs.lt
#defi ne rs_make_UBRRfbaud} (F_CPU/(baud*161)-l) #define RS_SET_BAUD(baud) \
{UBRR0H = (uint8_t)(RS_MAKE_UBRR(baud)»8): \ UBRR0L = (uint8_t)RS_MAKE_UBRR(baud); }
Sendif // rs_h_included
int ir.ain(void)
//////////////////////////////////////////// // Inicjacja portu szeregowego rs_set_3aud(def_baud);
UCSROG ■ 1«URSEL0 | 1«UCSZ0L | l«UCSZO0; •JCSR0B = 1«HXEN0 | 1«TXEN0;
CCSR3A » 0;
// Koniec inicjacji
fJI/lf/l/lll/l/ll//llll//llfiliil/ll/lllflll
tJ inicjacja funkcji
fdovopen(Es_puC, rs_
puts(„Hello world!");
ABC... C
Jak działają strumienie?
Pamiętasz, jak do tej pory obsługiwaliśmy napisy na wyświetlaczu LCD? Pisaliśmy oddzielne funkcje do wypisania łańcucha znaków, do wypisania liczby w formacie dziesiętnym czy szesnastkowym.
Idea funkcji operujących na zasadzie strumieni zdejmuje z nas obowiązek tworzenia wszystkich prze
Rys. 38 Dodanie pliku rs.c Rys. 39 Efekt działania programu
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, nie 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 programu. Po każdym zerowaniu procesor wyśle kolejny napis.
Zgodnie z dokumentacją, funkcja puts dodaje na koniec znak nowej linii. Nic wprowadza 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:
W ten sposób ręcznie dodamy przed znakiem nowej linii znak powrotu karetki i wszystkie nowe napisy ułożą się jeden pod drugim.
Dobrze więc... utworzyliśmy, zajmujący ponad 1KB pamięci, program wypisujący za pomocą portu RS ładne przywitanie. Początek nic 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. Nic 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ź,
Inicjowanie urządzenia
Zakładając, żc posiadamy już gotowe funkcje put oraz get, musimy jeszcze poinformować funkcje z biblioteki stdio o tym, że chcemy właśnie z nich korzystać. Wykonujemy to za pomocą funkcji fdcvopen. 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, podane 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 przesiania kolejnych znaków W *e’ T i' ‘o' ‘ ‘ ‘w’ ‘o’ V T ‘d’ *!’, kolejno do funkcji pul. Go z kolei w niej będzie się działo z przesłanymi znakami, to już kwestia naszych potrzeb
Listing 55-plik harddef.h
fi ne DEF_BAUD 4800 #endif // harddef_h_included
Ig 55 -plik harddef.h
fdefine DEF_BAUD 4800 #endif // HARODEF_H_INCLUDED
domyślnych strunrier
40 Luty2006 Elektronika dla Wszystkich