AVT5226 - Graficzny, modułowy wyświetlacz LED.pdf

(1315 KB) Pobierz
Elektronika Praktyczna
projekty
Grafi czny, modułowy
AVT
5226
Dodatkowe materiały
na CD i FTP
Doskonały projekt wyświetlacza grafi cznego LED o  konstrukcji
modułowej. Moduły można łączyć w  łańcuchy jak klocki,
dostosowując wyświetlacz do własnych potrzeb. Idealne urządzenie
do reklam świetlnych, publicznych stacji pogodowych, budowy tablic
informacyjnych.
Rekomendacje: Projekt zadowoli profesjonalistów i  amatorów
AVt-5226 w ofercie AVt:
AVT-5226A – płytka drukowana
AVT-5226B – płytka drukowana + elementy
podstawowe informacje:
• konstrukcja modułowa,
• moduły łączone ze sobą „bokami”,
• liczba diod: matryca 8×8 diod (pikseli),
• sterowanie przez interfejs I 2 C,
• zasilanie 5 V/0,64 A (opis w tekście),
• sterownik: mikrokontroler ATmega8
W interfejsach komunikacji z użytkowni-
kiem królują wyświetlacze LCD. Trudno się
temu dziwić, ponieważ mają praktycznie same
zalety: niska cena, mały pobór prądu, wersje
monochromatyczne i kolorowe, i stosunkowo
proste sterowanie. Oprócz bardzo znanych
wyświetlaczy alfanumerycznych ze sterowni-
kiem HD44780 dużą popularność zdobywają
wyświetlacze grafi czne LCD. Mimo niezaprze-
czalnych zalet, są jednak zastosowania, w któ-
rych użycie technologii LCD jest albo zbyt
drogie, albo wręcz niemożliwe. Zwykle, gdy
wyświetlana informacja musi być bardzo do-
brze widoczna z dużej odległości, stosowane
są inne rozwiązania. Na przykład w panelach
tablic synoptycznych lub układów sterowania
procesami technologicznymi do wyświetlania
cyfrowych wartości są używane klasyczne,
7-segmentowe wyświetlacze LED. Mają duży
kontrast, a jasność ich świecenia nie zależy
od zewnętrznych warunków oświetlenia. Aby
zapewnić taki sam komfort odczytu wyświe-
tlanej wartości w technologii LCD, trzeba by
stosować kosztowne, duże panele grafi czne,
z bardzo dobrym podświetleniem.
Oprócz 7-segmentowych wyświetlaczy
LED coraz chętniej stosowane są też matryco-
we wyświetlacze LED o organizacji 8×8 lub
8×6 punktów i różnych wymiarach. Mają one
wszystkie zalety 7-segmentowych wyświetla-
czy LED, a oferują dużo większe możliwości.
Stosując takie elementy z zewnętrznym ste-
rownikiem, można wyświetlać czytelne napisy
i ikony semigrafi czne.
Większość z nas na pewno spotkała się
z LED-owymi panelami informacyjnymi lub
reklamowymi umieszczanymi w witrynach
sklepów czy na przykład na dworcach. Nic
nie stoi na przeszkodzie, by tam, gdzie jest
to konieczne, stosować takie wyświetlacze
we własnych konstrukcjach. Gotowe modu-
ły matrycowe są drogie i raczej nie będą się
nadawały. Zaprezentowany wyświetlacz jest
tak pomyślany, by można było elastycznie,
zależnie od potrzeb, dobierać liczbę segmen-
tów, a  sposób sterowania jest stosunkowo
prosty.
Dodatkowe materiały na CD i Ftp:
ftp://ep.com.pl , user: 13835 , pass: 4j4sfv4t
• wzory płytek PCB
• listingi
• karty katalogowe i noty aplikacyjne
elementów oznaczonych na Wykazie
elementów kolorem czerwonym
niu około 10 mA, ale jeżeli dioda ma bardzo
jasno świecić, to trzeba, by prąd miał war-
tość ok. 20 mA.
Podstawową wadą sterowania statyczne-
go jest konieczność użycia dużej liczby linii
sterujących i duży, sumaryczny prąd pobie-
rany przez układ wyświetlacza. Załóżmy,
że chcemy zbudować sterowany statycznie
moduł 8×8 diod LED. Do sterowania 64 diod
potrzeba będzie 64 linii sterujących, maksy-
malny prąd pobierany 64×10 mA=640 mA,
a dla prądu 20 mA – 64×20 mA=1280 mA.
Trudno sobie wyobrazić, aby taki wyświe-
tlacz był sterowany bezpośrednio z linii por-
tów mikrokontrolera sterownika. Do stero-
wania statycznego produkowane są specjal-
ne układy scalone zawierające wielobitowy,
równoległy rejestr zapisywany szeregowo
i wzmacniacze prądu. Oczywiście, w trak-
cie pracy moduł nie będzie pobierał maksy-
malnego prądu, bo taki prąd będzie płynął,
kiedy wszystkie diody są zapalone. Mimo
to, średnio pobierany prąd nawet dla jed-
nego modułu 8×8 punktów jest dość duży.
Zaletą wyświetlania statycznego jest mały
poziom generowanych zakłóceń, brak efektu
migotania i mimo konieczności zapisywania
układów driverów – dość łatwe sterowanie.
Wstęp
Przed zaprojektowaniem wyświetlacza
LED trzeba się zastanowić nad rodzajem ste-
rowania. Do wyboru jest sterowanie statycz-
ne i sterowanie dynamiczne. Każdy z nich
ma swoje zalety i wady.
Sterowanie statyczne polega na stero-
waniu każdej diody LED oddzielnie. Jeżeli
dioda ma być zapalona, to podaje się na nią
napięcie przez rezystor szeregowy ogranicza-
jący prąd. Zależnie od oczekiwanej jasności,
prąd może być większy lub mniejszy, ale nie
może przekraczać maksymalnego, ciągłego
prądu dopuszczalnego dla diody wybranego
typu. Dla zwykłych diod LED małej mocy ten
prąd ma wartość 30 mA, a prąd pracy 20 mA.
Dzięki rozwojowi technologii współczesne
diody LED świecą już dość jasno przy prą-
dzie ok. 5 mA, jednak z moich doświadczeń
wynika, że wystarczający jest prąd o natęże-
24
ELEKTRONIKA PRAKTYCZNA 3/2010
wyświetlacz LED
741700795.189.png 741700795.200.png 741700795.211.png 741700795.222.png 741700795.001.png 741700795.012.png 741700795.023.png
Grafi czny, modułowy wyświetlacz LED
rys. 1. połączenie 64 diod w układ matrycowy 8×8
Sterowany statycznie moduł wyświetlacza
LED wykonany z  użyciem driverów pro-
dukowanych przez fi rmę STM widziałem
na szkoleniowym spotkaniu STM TechDay
i wyświetlane na nim informacje prezento-
wały się znakomicie.
Wyświetlanie dynamiczne wymaga połą-
czenia diod LED w układ matrycowy – rys.   1 .
Przy takim połączeniu otrzymujemy 8
kolumn i 8 wierszy. Do ich sterowania po-
trzeba tylko dwóch 8-bitowych portów ze
wzmacniaczami prądowymi. Uproszcze-
nie układu jest okupione bardziej skom-
plikowanym sterowaniem. Na początku
sekwencji sterowania na linię pierwszej
kolumny K1 wystawiany jest stan niski.
Każda z diod, której katoda jest połączona
do linii kolumny K1, a anoda ma połączone
napięcie zasilania przez rezystor szerego-
wy, będzie się świecić. Inaczej mówiąc, na
linię kolumny K1 wystawiamy stan niski,
a na 8-bitowy rejestr wiersza stany wysokie
dla tych diod, które mają w kolumnie K1
się zaświecić.
W następnym cyklu sterowania zdejmu-
jemy stan niski z kolumny K1, a wystawia-
my stan niski na kolumnę K2. Jednocześnie
do rejestru wiersza wpisujemy stany wyso-
kie dla tych diod, które mają się zaświecić
w kolumnie K2. Sekwencja jest powtarzana
cyklicznie dla wszystkich linii kolumn od K1
do K8. Jeżeli cykle sterowania będą się powta-
rzać z wystarczająco dużą częstotliwością, to
bezwładność oka spowoduje, że na siatkówce
powstanie obraz, tak jakby wybrane diody dla
każdej kolumny były jednocześnie zaświeco-
ne dla całego modułu 8×8 diod.
Każda z diod kolumny jest zaświecana
przez 1/8 okresu całkowitego cyklu sterowa-
nia wyświetlaczem. Z tego powodu średni
prąd pobierany przez tak pracujący wyświe-
tlacz jest dużo mniejszy niż przy wyświetla-
niu statycznym.
Linie kolumn są podłączone do wyjść
układu TPIC6C596. Jest to 8-bitowy rejestr
równoległy ze wzmacniaczami prądu. Bu-
dowa i działanie tego układu zostanie do-
kładniej opisana przy okazji omawiania pro-
gramowych procedur zapisywania danych
do rejestru. Wzmacniaczami prądowymi
TPIC6C696 są tranzystory DMOS z kanałem
N o maksymalnym ciągłym prądzie wyjścio-
wym 100 mA. Tranzystory pracują w konfi -
guracji otwartego drenu (OD).
Jako wzmacniacze linii wierszy są wy-
korzystane tranzystory MOS z  kanałem P
typu BSP171. Według danych katalogowych
rezystancja kanału w stanie przewodzenia
nie jest większa niż 0,36 V, a maksymal-
ny prąd drenu jest równy 1,7 A. Wszystkie
źródła tranzystorów są połączone do zasila-
nia +5 V. Jeżeli na bramkę zostanie podany
stan niski, to tranzystor wchodzi w stan na-
sycenia, podając napięcie zasilania na linie
wiersza. W każdej z linii wiersza szeregowo
z  drenem tranzystora sterującego jest włą-
czony rezystor ograniczający prąd o wartości
150...220 V. Wartość rezystora jest zależna od
zastosowanych diod LED i żądanej jasności
świecenia. Trzeba pamiętać, że układ dyna-
micznego sterowania może się w sytuacjach
awaryjnych zatrzymać (zawiesić). Wtedy
rezystor ogranicza prąd, tak by jego wartość
nie zniszczyła diody. Napięcie na czerwonej
diodzie LED w czasie przewodzenia wyno-
si ok. 1,8 V. Dla rezystora 150 V prąd diody
w trakcie statycznego wyświetlania wynosi
(5 V–1,8 V)/150 V =21,3 mA. Przy wyświe-
tlaniu dynamicznym wartość tego rezystora
jest wystarczająca. Jeżeli sekwencja wyświe-
tlania zatrzyma się na dłuższy czas, to prąd
jest ustawiony na granicy wartości uznawa-
nej za prąd pracy diody. Dla bezpieczeństwa
można zastosować rezystory o  rezystancji
200 V. Wtedy prąd statyczny będzie miał
bezpieczną wartość 16 mA, ale wyświetlacz
będzie świecił mniej intensywnie. Ja w mo-
Zasada działania
Po zastanowieniu wybrałem wyświe-
tlanie dynamiczne. Statyczne wyświetlanie
wymagałoby zastosowania specjalizowa-
nych driverów, a ja postanowiłem zbudować
układ z w miarę popularnych i dostępnych
elementów. Ten argument oraz zdecydowa-
nie mniejszy pobór prądu przeważyły.
Następnym krokiem po wybraniu ro-
dzaju sterowania było określenie koncepcji
całego wyświetlacza. Założyłem, że wyświe-
tlacz będzie miał wysokość 8 punktów (diod),
a długość będzie wielokrotnością 8 punktów
(diod). Naturalną konsekwencją takiego wy-
boru było podzielenie wyświetlacza na mo-
duły o organizacji 8×8 punktów. Każdy z mo-
dułów ma własny sterownik odpowiedzialny
za dynamiczne wyświetlanie i  odbieranie
wyświetlanej informacji ze sterownika głów-
nego. Do komunikacji sterownika głównego
ze sterownikami modułów zastosowałem
interfejs I 2 C. Sterownik główny jest układem
master, a moduły układami slave. Zastosowa-
nie magistrali I 2 C pozwoliło na ograniczenie
sterowania do 2 linii: SDA i SCL.
Schemat modułu pokazano na rys.   2 .
Jako sterownik zastosowano popularny i tani
mikrokontroler ATmega8 w wersji SMD. Mi-
krokontroler ma wystarczającą liczbę linii
portów i co ważne, sprzętowy interfejs I 2 C
(TWI), który może pracować również w try-
bie slave.
Wykaz elementów
rezystory: (SMD, 1206)
R9...R16: 150...330  V (opis w tekście)
R1...R8: 10 k V
kondensatory
C2, C4, C5: 1  M F/25 V (tantalowy, SMD)
C1, C3, C6, C8: 100 nF (ceramiczny 1206)
półprzewodniki
U1: TPIC6C596 (SMD)
U2: ATmega8 (SMD)
Tranzystory T1...T8: BSP171
D1...D64: diody LED czerwone (SMD 1206)
Na CD: karty katalogowe i noty aplikacyjne elementów
oznaczonych na wykazie elementów kolorem czerwonym
25
ELEKTRONIKA PRAKTYCZNA 3/2010
741700795.034.png 741700795.045.png 741700795.056.png 741700795.067.png 741700795.078.png 741700795.089.png 741700795.100.png 741700795.111.png 741700795.122.png 741700795.133.png 741700795.144.png 741700795.153.png 741700795.154.png 741700795.155.png 741700795.156.png 741700795.157.png 741700795.158.png 741700795.159.png 741700795.160.png 741700795.161.png 741700795.162.png 741700795.163.png 741700795.164.png 741700795.165.png 741700795.166.png 741700795.167.png 741700795.168.png 741700795.169.png 741700795.170.png 741700795.171.png 741700795.172.png 741700795.173.png 741700795.174.png 741700795.175.png 741700795.176.png 741700795.177.png 741700795.178.png 741700795.179.png 741700795.180.png 741700795.181.png 741700795.182.png 741700795.183.png 741700795.184.png 741700795.185.png 741700795.186.png 741700795.187.png 741700795.188.png 741700795.190.png 741700795.191.png 741700795.192.png 741700795.193.png 741700795.194.png 741700795.195.png 741700795.196.png 741700795.197.png 741700795.198.png 741700795.199.png 741700795.201.png 741700795.202.png 741700795.203.png 741700795.204.png 741700795.205.png 741700795.206.png 741700795.207.png 741700795.208.png 741700795.209.png 741700795.210.png 741700795.212.png 741700795.213.png 741700795.214.png 741700795.215.png 741700795.216.png 741700795.217.png 741700795.218.png 741700795.219.png 741700795.220.png
projekty
delowym egzemplarzu
zastosowałem rezystory
o wartości 150 V.
Układ sterownika
jest wyposażony w  złą-
cze J1 do programowa-
nia mikrokontrolera
w systemie i 2 złącza do
podłączenia sygnałów
interfejsu I 2 C i zasilania
modułu.
częstotliwość z jaką są zaświecane/gaszone
diody w kolumnach, wynosi ok. 122,6 Hz.
W  czasie inicjalizacji licznika trzeba
określić stopień podziału preskalera i odblo-
kować przerwania od przepełnienia licznika.
Preskaler programuje się, zapisując 3 naj-
młodsze bity rejestru TCCR0. Dla podziału
przez 8 do TCCR0 wpisywana jest wartość 2.
Przerwanie odblokowuje się, ustawiając bit
TOIE0 w rejestrze TIMSK – list.   1 . W obsłu-
dze przerwania od przepełnienia licznika Ti-
mer0 uaktywnia się linię następnej kolumny
(modulo 8) i wystawia na port PORTD war-
tość wyświetlanego wiersza.
Sterowanie
Dynamiczne wy-
świetlanie najłatwiej
zrealizować, używając
licznika, który generuje
przerwanie przy prze-
pełnieniu. Można wtedy
w prosty sposób kontro-
lować częstotliwość uak-
tywniania kolejnych linii
kolumn. Mikrokontroler
ATmega8 ma wbudowa-
ne 3 liczniki: Timer0,
Timer1 i Timer2. W pro-
gramie sterującym mo-
dułem użyto 8-bitowego
licznika Timer0. Licznik
ten zlicza sygnał o czę-
stotliwości taktowania
mikrokontrolera z  moż-
liwością wstępnego po-
działu tej częstotliwości
przez preskaler. Mikro-
kontroler jest taktowany
wewnętrznym oscylato-
rem RC o częstotliwości
2 MHz. Jeżeli podzielmy
tę częstotliwość przez 8,
to Timer0 będzie zliczał
sygnał o  częstotliwości
250 kHz. Licznik zlicza
w górę i przepełni się po
odliczeniu 255 impul-
sów. Wpisanie do niego
wartości początkowej
równej 0x05 spowodu-
je, że licznik przepełni
się po odliczeniu 250
impulsów. Jeżeli po
każdym przepełnieniu
będziemy wpisywać
wartość początkową 5,
to przepełnienia będą
zgłaszane z częstotliwo-
ścią 250 kHz/250=1 kHz.
Można zrezygnować
z  inicjowania licznika
i  przerwania będą zgła-
szane z  częstotliwością
250 kHz/255=980,4 kHz.
Ponieważ każda z  linii
kolumn jest sterowana
co 8 cykli wyświetlania,
rys. 2. Schemat modułu wyświetlacza
26
ELEKTRONIKA PRAKTYCZNA 3/2010
741700795.221.png 741700795.223.png 741700795.224.png 741700795.225.png 741700795.226.png 741700795.227.png 741700795.228.png 741700795.229.png 741700795.230.png 741700795.231.png 741700795.232.png 741700795.002.png 741700795.003.png 741700795.004.png 741700795.005.png 741700795.006.png 741700795.007.png 741700795.008.png 741700795.009.png 741700795.010.png 741700795.011.png 741700795.013.png 741700795.014.png 741700795.015.png 741700795.016.png 741700795.017.png 741700795.018.png 741700795.019.png 741700795.020.png 741700795.021.png 741700795.022.png 741700795.024.png 741700795.025.png 741700795.026.png 741700795.027.png 741700795.028.png 741700795.029.png 741700795.030.png 741700795.031.png 741700795.032.png 741700795.033.png 741700795.035.png 741700795.036.png 741700795.037.png 741700795.038.png 741700795.039.png 741700795.040.png 741700795.041.png 741700795.042.png 741700795.043.png 741700795.044.png 741700795.046.png 741700795.047.png 741700795.048.png 741700795.049.png 741700795.050.png 741700795.051.png 741700795.052.png 741700795.053.png 741700795.054.png 741700795.055.png 741700795.057.png 741700795.058.png 741700795.059.png 741700795.060.png 741700795.061.png 741700795.062.png 741700795.063.png 741700795.064.png 741700795.065.png 741700795.066.png 741700795.068.png 741700795.069.png 741700795.070.png 741700795.071.png 741700795.072.png 741700795.073.png 741700795.074.png 741700795.075.png 741700795.076.png 741700795.077.png 741700795.079.png 741700795.080.png 741700795.081.png 741700795.082.png 741700795.083.png 741700795.084.png 741700795.085.png 741700795.086.png 741700795.087.png 741700795.088.png 741700795.090.png 741700795.091.png 741700795.092.png 741700795.093.png 741700795.094.png 741700795.095.png 741700795.096.png 741700795.097.png 741700795.098.png 741700795.099.png 741700795.101.png 741700795.102.png 741700795.103.png 741700795.104.png 741700795.105.png 741700795.106.png 741700795.107.png 741700795.108.png 741700795.109.png 741700795.110.png 741700795.112.png
Grafi czny, modułowy wyświetlacz LED
List. 1. konfi guracja licznika timer0
TCCR0=2;//bez preskalera
TIMSK|=(1<<TOIE0);//odblokowanie przerwania od przepełnienia TMR0
List. 2. Zapis danych do rejestru tpIC6C696
/***********************************************************
Defi nicja linii sterujących
***********************************************************/
#defi ne WR 0 //linia zapisu di rej, równoległego - RCK
#defi ne DATA 1//linia danych SER IN
#defi ne CLK 2 //linia zegarowa SRCK
#defi ne GA 3 //linia bramkowania !G
#defi ne WR_0 (PORTC&=~(1<<WR));
#defi ne WR_1 (PORTC|=(1<<WR));
#defi ne DATA_0 (PORTC&=~(1<<DATA));
#defi ne DATA_1 (PORTC|=(1<<DATA));
#defi ne CLK_0 (PORTC&=~(1<<CLK));
#defi ne CLK_1 (PORTC|=(1<<CLK));
#defi ne GA_0 (PORTC&=~(1<<GA));
#defi ne GA_1 (PORTC|=(1<<GA));
/***********************************************************
Procedura zapisania 8-bitowej danej z argumentu data do rejestru
***********************************************************/
void SendTpic(unsigned char data){
char i;
GA_1 //!G=1
WR_0 //RCK=0
CLK_1 //SRCK=1
for(i=0;i<8;i++){
if((data&0x80)==0x80)
{DATA_1}
else
{DATA_0}
data<<=1;
CLK_0
rys. 4. przebiegi czasowe zapisywania
rejestrów układu tpIC6C696
//zapisanie opadającym zboczem
początku procedury ustawić wszystkie linie
kolumn jako nieaktywne przez wpisanie do
TPIC6C696 samych zer. Potem można ustalić
stany na linii wierszy i na koniec uaktywnić
kolejną kolumnę. Po tej modyfi kacji wyświe-
tlanie przebiegało prawidłowo.
Licznik aktywnej kolumny znajduje się
w zmiennej col . Ta zmienna adresuje tablicę
TabCol , w której są wpisane 8-bitowe dane
do rejestru układu TPIC6C696, tak by w jego
rejestrach była wpisana 1 na pozycji odpo-
wiadającej numerowi zapisanemu w zmien-
nej col .
8-elementowa tablica Disp musi zawie-
rać 8 bajtów określających wyświetlaną in-
formację. Każdy bajt odpowiada pionowemu
paskowi o wysokości 8 punktów (diod LED).
Najbardziej znaczący bit (MSB) odpowiada
najwyżej położonemu punktowi w  pasku.
Zależność pomiędzy zawartością tablicy
Disp a wyświetlaną informacją pokazano na
rys.   5 .
Wygodnie jest stworzyć taką tablicę przy
założeniu, że dioda jest zapalona, kiedy bit
jest ustawiony. W rzeczywistości tranzystor
CLK_1
}
WR_1//wpis do rejestru równoległego
WR_0
GA_0
}
//!G=0
Linia kolumny jest uaktywniana (li-
nia jest aktywna, kiedy ma potencjał masy)
przez wpisanie jedynki na odpowiadającej
tej linii pozycji rejestru układu TPIC6C696.
Zapis rejestrów danych układu
TPIC6C696 jest taktowany sygnałem zega-
rowym SRCK. Dane do wpisania są ustala-
ne na wejściu SER IN w czasie wysokiego
stanu na linii zegarowej SRCK, a wpisywa-
ne poczynając od najstarszego bitu (MSB)
do najmłodszego (LSB) w takt opadającego
zbocza SRCK. Po 8 taktach zapisany jest cały
8-bitowy rejestr C1. Teraz dane z rejestru C1
trzeba przepisać do rejestru równoległego
C2 opadającym zboczem na wejściu RCK.
Buforowanie wyjścia zapobiega niekontro-
lowanym zmianom na wyjściach rejestru
w czasie szeregowego wpisywania danych
do C1. W czasie wpisywania danych na wej-
ściu G powinien być stan wysoki. Wtedy na
wyjściach bramek AND sterujących tranzy-
story wyjściowe są stany niskie i tranzystory
są zatkane. Stan niski na wejściu !CLR zeruje
wszystkie wyjścia przerzutników. Przebiegi
czasowe na liniach sterujących wpisem do
rejestru TPIC6C696 pokazano na rys.   4 . Na
list. 2 widzimy procedurę zapisu danych do
rejestru z defi nicją linii sterujących.
Kompletną procedurę obsługi przerwa-
nia od przepełnienia Timer0 zamieszczono
na list. 3 .
W trakcie prac na programem wyświetla-
nia pojawił się problem. W opisywanej już
zasadzie wyświetlania dynamicznego powie-
dzieliśmy, że w każdym cyklu przerwania
trzeba wystawić napięcie zasilania na anody
diod, które mają być zaświecone w aktywnej
kolumnie (sterowanie wierszami) i uaktyw-
nić kolumnę przez podanie na linie poten-
cjału masy. Jednak po uaktywnieniu napięć
w wierszu, jeszcze przez chwilę potrzebną
na uaktywnienie nowej kolumny, jest ak-
tywna poprzednia kolumna. To powodo-
wało powstawanie prześwitów na wyświe-
tlaczu. Żeby temu zapobiec, trzeba było na
rys. 3. Fragment schematu blokowego układu tpIC6C696
List. 3. procedura obsługi przerwania od przepełnienia timer0
const char TabCol[8]={1,2,4,8,0x10,0x20,0x40,0x80};
#pragma vector=TIMER0_OVF_vect
__interrupt void TmrOvl(void){
SendTpic(0); //wyłączenie wszystkich kolumn
PORTD=~(Disp[col]); //wystawienie stanów na liniach wiersza
SendTpic(TabCol[col]); //uaktywnienie kolejnej kolumny
++col;
//przygotowanie numeru kolumny dla następnego
przerwania
col&=7;
if(tmsek==1){
--msek;
if(msek==0)
tmsek=0;}
//fragment używany do odliczania opóźnień
}
ELEKTRONIKA PRAKTYCZNA 3/2010
27
741700795.113.png 741700795.114.png 741700795.115.png 741700795.116.png 741700795.117.png 741700795.118.png 741700795.119.png 741700795.120.png 741700795.121.png 741700795.123.png 741700795.124.png 741700795.125.png 741700795.126.png 741700795.127.png 741700795.128.png 741700795.129.png 741700795.130.png 741700795.131.png 741700795.132.png 741700795.134.png 741700795.135.png 741700795.136.png 741700795.137.png 741700795.138.png 741700795.139.png 741700795.140.png
projekty
List. 4. pętla odczytu danych przesyłanych po I 2 C i ich zapisu do tablicy Disp
while(1){
if ( ! TWI_Transceiver_Busy() ) {
if ( TWI_statusReg.lastTransOK )//czy ostatnia operacja się powiodła
{ __watchdog_reset();
if ( TWI_statusReg.RxDataInBuf )//czy ostatnia operacja była odbiorem
danych
{TWI_Get_Data_From_Transceiver(I2Cbuf, 8); //odbiór 8 bajtów
for(i=0;i<8;i++)
Disp[i]=I2Cbuf[i];
if ( TWI_Transceiver_Busy() )
TWI_Start_Transceiver();}
}
}//end if ( ! TWI_Transceiver_Busy() )
rys. 5. Zależność pomiędzy zawartością
tablicy Disp a wyświetlaną informacją
z kanałem P zaczyna przewodzić, kiedy na
bramce jest stan niski. Dlatego w procedurze
przerwania elementy z tablicy przed wysła-
niem na port PORTD są negowane.
W praktyce, przy tak napisanym progra-
mie, wystarczy zapisać tablicę Disp , a o resz-
tę troszczy się procedura przerwania. Bajty
zapisywane do tablicy Disp są przesyłane do
modułu magistralą I 2 C. Moduł wyświetlacza
jest elementem slave i ma swój unikalny ad-
res pozwalający go jednoznacznie zidentyfi -
kować. Mikrokontroler ATmega8 ma wbudo-
wany interfejs sprzętowy TWI mogący pra-
cować w trybie I 2 C slave. Atmel udostępnia
na swoich stronach internetowych notę apli-
kacyjną „ AVR311. Using TWI module as I 2 C
slave” . Nota zawiera opis i kompletne źródła.
Do własnego projektu trzeba dołączyć pliki
TWI_slave.c i TWI_slave.h. Na list.   4 poka-
zano pętlę nieskończoną, której zadaniem
jest odebranie sekwencji start i adresu slave.
Adres I 2 C modułu jest ustalany po wywoła-
niu funkcji TWI_Slave_Initialise(unsigned
char adr._slave) . Jeżeli adres przesyłany
przez układ master jest adresem modułu, to
mikrokontroler w obsłudze przerwania od-
biera 8 bajtów i wpisuje je do bufora I2Cbuf ,
a następnie zawartość I2CBuf jest przepisy-
wana do tablicy Disp .
Z  punktu widzenia zewnętrznego ste-
rownika, moduł jest widziany jako układ
I 2 C slave, do którego trzeba wpisać 8 kolej-
nych bajtów, które są potem przepisywane
do tablicy Disp . Do jednej magistrali można
podłączyć w prosty sposób wiele modułów,
a sterowanie nimi jest bardzo proste. Ma to
duże znaczenie praktyczne, bo do zbudowa-
nia wyświetlacza należy użyć kilku modu-
łów. Na list. 4 pokazano procedurę użytą do
zapisywania danych z bufora BufPom modu-
łów wyświetlacza przez sterownik zbudowa-
ny w oparciu o mikrokontroler PIC18F2580.
Wyświetlacz złożony z kilku modułów
będzie miał wysokość 8 punktów i szerokość
równą liczbie modułów pomnożoną przez 8.
Taki wyświetlacz jest idealny do wyświetla-
nia tekstu. Pierwotnie założyłem, że każdy
moduł będzie miał swoją pamięć generatora
znaków alfanumerycznych i żeby wyświe-
tlić znak wystarczy wysłać do modułu kod
rys. 6. Idea wyświetlania znaków alfanumerycznych
ASCII. Jednak znaki alfanumeryczne na ma-
trycy 8×8 nie wyglądają dobrze. Zazwyczaj
znak jest defi niowany w matrycy 6×8 punk-
tów. Sam znak ma rozmiar 5×8 punktów,
a szósta kolumna jest dodawana jako prze-
rwa pomiędzy znakami. Początkowo chcia-
łem zrobić moduły 6×8 pikseli, ale po prze-
myśleniu pozostałem przy koncepcji 8×8
i zrezygnowania z generatora znaków w mo-
dule. Można przecież traktować moduł jako
obszar wyświetlacza „grafi cznego”, a funkcje
generatora znaków i zapisywanie tablic Disp
poszczególnych modułów powierzyć ze-
wnętrznemu sterownikowi. Wyświetlacz jest
traktowany przez zewnętrzny sterownik jako
obszar punktów o rozmiarze 8xn*8, gdzie n
to liczba zastosowanych modułów. W mode-
lowym rozwiązaniu zastosowałem 6 modu-
łów i otrzymałem wyświetlacz o rozmiarze
8×48 punktów. Zewnętrzny sterownik ma
za zadanie utworzenie bufora
o rozmiarze 48 bajtów i zapisanie
go wartościami na podstawie ta-
blicy generatora znaków. Potem
sterownik logicznie dzieli bufor
na 6 części, każdej części przy-
dziela adres slave modułu i wy-
syła dane do każdego modułu
magistralą I 2 C. Nie jest to zadanie
zbyt skomplikowane i daje dużą
elastyczność wyświetlania infor-
macji. Można na przykład prosto
zrealizować skrolowanie dłuż-
szych napisów. Na rys. 6 pokaza-
na jest idea takiego rozwiązania.
Napis z 3 znaków 6×8 punktów
jest wyświetlany na 3 modułach.
Na trzecim module można wy-
świetlić jeszcze jeden znak.
Na modelowym wyświetla-
czu składającym się z 6 modułów
można wyświetlić w ten sposób 8 znaków
o rozmiarze 6×8 punktów.
Sterownikiem zewnętrznym może być
dowolny sterownik mikroprocesorowy.
Może to być na przykład sterownik zegara
z kalendarzem, termometru, stacji pogodo-
wej, tablicy reklamowej itp. Do testowania
użyłem modułu ZL5PICz z mikrokontrole-
rem PIC18F458 produkowanego przez fi rmę
KAMAMI.
Żeby wyświetlać napisy, trzeba zdefi nio-
wać tablice z generatorem znaków. Defi nicja
jednego znaku to 6 kolejnych bajtów: 5 baj-
tów dla znaku i jeden zerowy dla przerwy
pomiędzy znakami. Kiedyś zdefi niowałem
tablicę generatora znaków dla wyświetla-
cza od telefonu Nokia 3310. Tablica jest tak
zbudowana, że kod ASCII znaku pomnożo-
ny przez 6 określa początek defi nicji znaku
w tablicy. Generator znaków można wyko-
List. 5. Zapisanie 8 bajtów do modułu wyświetlacza
o adresie zawartym w argumencie adr .
//zapis 8 bajtów do wyświetlacza
void WriteLed(char addr){
char i=0;
i2c_start();
i2c_write(addr);//adres slave R/W=0
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_write(BufPom[i++]);
i2c_stop();
}
List. 6. Zamiana bitów miejscami
//konwersja SWAP
unsigned char ConvData(unsigned char data){
char i,zn;
zn=0;
for(i=0;i<8;i++){
if((data&0x80)==0x80)
zn|=0x80;
data<<=1;
zn>>=1;}
return(zn);
}
28
ELEKTRONIKA PRAKTYCZNA 3/2010
741700795.141.png 741700795.142.png 741700795.143.png 741700795.145.png 741700795.146.png 741700795.147.png 741700795.148.png 741700795.149.png 741700795.150.png 741700795.151.png 741700795.152.png
Zgłoś jeśli naruszono regulamin