Programowanie
Programowanie
L.r.J .... I
return;
Listing 50
Modyfikacja pliku harddej.h.
// nterfejs i2l #def1ne i2c_sua^oki b *define 12c_sda 0 fldefine I2C_SCL=>0RT & #define I2C_SCL 1 4define I2C_SPEED 100000
// Wyświetlacz *define LCD.RS 2 *define LCO_RSPORT O #define LCD_C 4 Adcfine LCD.CPORT D #define LCD_RW 3 Jdcfinc LCD_RWPORT D
Listing 51 Modyfikacja pliku harddef.h int raam(void)
{
// Dzielenie 2egara przez 2
CLKPP - 1«CLKPCE!
CLKPR ■ 1«CLKPS0J
// Inicjacja
portb ■ l «I2C_sru | i«T?r_sri.;
p^rtp ■ ~(l«i.rn f. j l«T.nn rw);
nrmn - 1«t.cd f. 7 1«lcd_rs~ I ;«lcd_rw;
DDRB ■ 0x0F«LCD_D4 | 1«I2C_SCLJ
lcd_initO;
// Koniec inicjacji (...)
interesujących bitów a nawet ich rozmieszczenie są identyczne. Znaczenie bitów CS02..CSO0 jest w obu układach takie samo Okazje się, że pozostawiając niewystępujące w poprzednim układzie bity wyzerowane, uzyskamy licznik działający w praktycznie identyczny sposób jak do tej pory. Bardzo nas to cieszy, ponieważ oszczędza nam dalszej pracy. Program powinien dać się teraz skompilować i uruchomić. Pojawi się jednak kilka ostrzeżeń. Nie jest to mc groźnego i zaraz się nimi zajmiemy. Niezależnie od występujących ostrzeżeń program już działa.
Rys. 36 Porównanie rejestrów sterujących licznikiem TO w obu procesorach
- | -1 - 1 002 l C8Q1 | C9C0 | ATOOS2313
oa*>ąć^Tfta>»i] c»ca I oaoi | caoo | ATmega102
I Km tOCSIAl - I - ITIOSII ■ MMI - 1 ATB0S2313 | lam |oa*iAloałi»l ccm [ nogi | ioe2 ATmegal62
Nie będę dokładnie opisywał wszystkich możliwości typów stałych w programach C. Teraz skupimy się tylko na tym. dlaczego nasz zmieniony program zaczął nagle generować ostrzeżenia.
Kompilator domyślnie nadaje wszystkim stałym typ ze znakiem o wielkości najmniejszej, która jest w stanic pomieścić podaną liczbę. Zauważmy, że w płytce AVT3500 bit 7 portu B połączony był z kropką dziesiętną, co sprawiło, że nie był przez nas wykorzystywany. Teraz sytuacja jest inna, co daje nam możliwość zwrócenia uwagi na pominięty poprzednio szczegół. Ile wynosi liczba 1«7? Jest to 128. W zmiennej ośmiobitowej ze znakiem możemy zapisać wartości z przedziału -128.. 127. Tak więc jeśli ustawiamy najstarszy bit (włączamy segment G wyświetlacza), kompilator domyślnie przypisuje danej stałej typ szesnastobkowy. Stała ta ma wyzerowany starszy bajt. Jednak już po chwili wszystkie wyzerowane bity zmieniamy w jedynki za pomocą operatora negacji bitowej. Ostatecznie, kompilator „zauważa”, żc wpisujemy stałą szesnastobitową do ośmiobitowej zmiennej lub tablicy. Operacja taka zostanie prawidłowo wykonana - starsze bajty zostaną obcięte. Jednak kompilator ostrzeże nas lojalnie, że tracimy część informacji.
Niech nie wprowadzi Cię w błąd moje określenie „już po chwili ". Pisząc to, mam na myśli kolejność wykonywania operacji. Procesor nic nie będzie oblicza!. W kodzie pojawi się tylko wynik całego działania, jako że złożone jest ono jedynie ze stałych.
Ponownie, tak jak zrobiliśmy to w- części 5, aby nie pogubić się w gąszczu ostrzeżeń, ozna czymy, że wiemy, co robimy za pomocą rzutowania. Zapis przypominam na listingu 49, jednocześnie wskazując miejsca modyfikacji.
Listing 41) Zabieg usuwający ostrzeżenia /Hijun iujucc się pinie ca s kompilacji
picy uinL8 L y WiutCyftClG] »
// O
(...), // 1
V0id WyswietlDEC(uir.tl 6_t var) uint8 t n;
i f(var > 9999)
for(n*0; n<4; n++)
g DaneWyswietlacza[n]
l~(l«LED g);
}
(...)
Przy przenoszeniu ostatnio napisanego programu na nowa płytkę napotkamy podstawowy problem: Nowy układ nie ma na pokładzie przetwornika, dla którego program został napisany. Jednak posiadacze AV13500 mogą wykorzystać zawarty na niej element. Wystarczy podłączyć nowa płytkę do złącza wyprowadzającego interfejs I2C. Konieczne jest także wyjęcie z podstawki procesora AT90S2313 tak aby jego działanie nie zajmowało interfejsu. Połączenie pokazałem na fotografii 2. Nie zapomnij o odpowiednim ustawieniu zworki LCDK na płytce wykonawczej AYT3505. Po wykonaniu połączenia zgodnie z fotografią spójrzmy na tabclkę 5. Przedstawia ona aktualne porównanie przypisania końcówek.
Skopiuj poprzednią wersję programu. 1 rozpocznijmy jej modyfikację. Pamiętaj o zaznaczeniu zmiany procesora w pliku
Funkcja |
AVT3500 |
AVT3505 |
LCD RS |
PortbB.2 |
Por.D.2 |
icn_Rw |
- |
PortD 3 |
LCD_E |
PoitB 1 |
PonD.4 |
lCD_LED |
- |
Pon.D.5 |
LCD_DU |
- |
PortB.U |
LCD_D1 |
- |
PonB.1 |
LCD_D2 |
. |
PortB.2 |
LCD„D3 |
- |
PonB.3 |
LCD_D4 |
PortB4 |
PoftB.4 |
LCD_D5 |
PoftB 5 |
PonB.5 |
LCD_D6 |
PortB6 |
PonB.6 |
LCD D7 |
PoftB 7 |
P0ftB.7 |
SDA |
PortDfi |
PortBf) |
SCL |
PoitD.5 |
PortB.1 |
3W1 |
PuitD 0 |
■■ |
SW2 |
Portu 1 |
pont.2 |
m a k efi l e.
Następnie otwieramy plik harddef.h i zaznaczamy w nim zmiany, jakie zaszły, zgodnie z tabelą 5.
Zmodyfiko wany fragment pliku pokazuje listing 50. Zauważ, że dodana została definicja LCD KW.
Dalej, tak jak poprzednio, podzielimy częs totliwość zegara przez 2. Dodatkowo jednak, w funkcji main, konieczna jest modyfikacja inicjacji portów. Jest to ważne z dwóch powodów. Po pierwsze, z wyprowadzeniami proce sora mamy teraz połączone wyprowadzenie RW wyświetlacza, na którym musi znaleźć się stan niski, aby wyświetlacz był widziany od strony programowej, tak jak ten zainstalowa ny na poprzedniej płytce. Po drugie, musimy
pamiętać, że porty konfigurowaliśmy, operu jąc bezpośrednio na ich nazwach. Wszystkie zmiany funkcji main pokazuje listing 51.
W tym momencie program jest gotowy do kompilacji oraz powinien działać prawidłowo na nowej płytce. Zmodyfikowane kody źród łowe oraz skompilowane programy, jak zwyk-lc, dostępne są na Elportalu.
W dzisiejszym, nietypowym odcinku, uruchomiliśmy stare programy na nowym układzie, jednocześnie oswajając płytkę. Okazało się, żc z pewnym uproszczeniem, procesor ATme-ga!62 można traktować jako rozwinięcie AT90S2313, co oznacza w praktyce, że może my uzyskać bardzo podobne działanie jego peryferii, po prostu nie ruszając dodatkowych, pojawiających się bitów. Pokazałem ogólnie, jak dokonać modyfikacji programu, by działał prawidłowo przy innej konfiguracji sprzętu. Bardzo wcześnie zaczęliśmy pisać programy tak, aby ich prosta modyfikacja była możliwa, co dzisiaj przyniosło wymierne korzyści.
W najbliższym odcinku zajmiemy się funkcjami, które nic mogły się pomieścić w AT90S2313.
Radosław Koppcl
radoslaw. koppel(ą).elportaLpi
Elektronika dla Wszystkich Styczeń2006 47