7szegmens LED plusz MCP23017
Sziasztok!
Valaki próbált már 3*7 szegmenses led kijelzőt hajtani MCP23017 el?
Van esetleg ilyenre érthető minta? Semmi tapasztalatom nincs hogy kell használni a ledes kijelzőt, azt tudom felváltva írja ki a 3 kijelzőre hol az egyik hol a másik világit és ez olyan gyors mintha folyamatosan világítana.
Egyáltalán ez járható út?
Valaki próbált már 3*7 szegmenses led kijelzőt hajtani MCP23017 el?
Van esetleg ilyenre érthető minta? Semmi tapasztalatom nincs hogy kell használni a ledes kijelzőt, azt tudom felváltva írja ki a 3 kijelzőre hol az egyik hol a másik világit és ez olyan gyors mintha folyamatosan világítana.
Egyáltalán ez járható út?
Én ezt ajánlanám neked!
MAX7219, MAX7221 Serially Interfaced, 8-Digit, LED Display
Gyors SPI vezérlés, Benne van a Multiplex és a kimeneti LED áramszab.
Guugli: MAX7219
http://www.google.hu/search?client=oper ... el=suggest
7 segmenses kijelző
http://avr.tavir.hu/modules.php?name=Fo ... ht=max7219
MAX7221 iletve MAX7219 7szegmenses LED vezérlő (SPI)
http://avr.tavir.hu/modules.php?name=Fo ... ht=max7219
Kipróbáltam jól bevált!

MAX7219, MAX7221 Serially Interfaced, 8-Digit, LED Display
Gyors SPI vezérlés, Benne van a Multiplex és a kimeneti LED áramszab.
Guugli: MAX7219
http://www.google.hu/search?client=oper ... el=suggest
7 segmenses kijelző
http://avr.tavir.hu/modules.php?name=Fo ... ht=max7219
MAX7221 iletve MAX7219 7szegmenses LED vezérlő (SPI)
http://avr.tavir.hu/modules.php?name=Fo ... ht=max7219
Kipróbáltam jól bevált!
Én most raktam össze egy MAX6951 alapra épülő kijelzőpanelt! A Maxim küld mintát. 2db-t ráadásul. A Panelen 4db 1" kijelző van. Kingbright SC10-21SRWA. Isten ez az áramkör. Kb 10 perc alat működöt is! SPI buszos így gyors és egyszerű a kezelése! Amúgy 8 digitig kezel kijelzőt, és 40 mA a max szegmensáram amit ki lehet csikarni belőle!
Amint teljesen elkészül, felteszem ide, nyákostól, szoftverestől, a köz javát szolgálva:)
ÜDV
KN
Amint teljesen elkészül, felteszem ide, nyákostól, szoftverestől, a köz javát szolgálva:)
ÜDV
KN
Na elkészült a mű:)
HW:
Mega168
MAX6951
4db SC10-21SRWA kijelző
A program előtt némi összefoglaló a MAX6951-ről, ami a programozás alatt előjött.
Alapjában nagyon jó kis IC. Gyorsan és praktikusan lehet vele áramkört építeni. Amire nagyon allergiás, azok a LED-ek számai a szegmensekben.
Konkrétan én beleszaladtam abba a hibába, a SC10-21SRWA kijelzővel, hogy a szegmensekben 2db LED van sorban, kivéve a DP.-t. Ez ahhoz vezetett, hogy a 2. vagy 3. digit "G" szegmensének vezérlésekor, világított a az adott szegmens DP.-ja,illetve a 0. digit DP-ja.
1 nap szenvedés után arra jutottam, hogy a 2. és 3. szegmens DP-jával sorba betettem két LED-tet. Lám csodát a hiba megszűnt. Mivel szeretem megérteni a dolgokat, nyomoztam a doksiban, de semmi. Majd a MAXIM oldalán egy másik doksiban rátaláltam a hiba okára. A lényeg, hogy a vezérelt szegmensen nem maradhat 1V-nál nagyobb maradék feszültség, mert akkor "kóborol" az áram más irányba is, a potenciál különbségek miatt. Mivel én 5V-ról hajtottam,így nem nehéz kiszámolni, hogy kb 2,5V maradt. Nem megyek a részletekbe. Itt olvashatjátok, hogy miért volt ez baj.:http://www.maxim-ic.com/app-notes/index.mvp/id/1880
Szóval használat előtt érdemes a feszültségviszonyokat tisztázni, a használni kívánt kijelzővel egyetemben.
További "negatívum", ha lehet így fogalmazni. Az IC kétféle karakterkódolást tud. HEXA, vagy semmi:) Kell vagy nem kell:) A Hexanak van egy hátránya. Nem ismeri azt, hogy minden szegmens OFF. Azaz, ha nem írunk egy digitre, akkor ott a nulla fog világítani. Van mikor ez így jó, van mikor nem! Nem ismeri a negatív előjelet sem. Bumm neki...
Ezért én a szoftverben nem ezt használtam. Hozzáteszem, hogy lehet állítgatni bizonyos korlátok között, hogy melyik digiten milyen dekódolás legyen. (lásd doksi)
Pozitívum. Nem kell azzal foglalkozni, hogy töröljük a kijelzőt. Ugyanis a konfigurációban , van egy bit, amit ha beállítunk akkor amint a CS láb nullára megy , törli a kijelzőt. Ezt azért tartottam fontosnak kiemelni, mert az gyakori gond, hogy "szemét" marad a kijelzőn!
Amúgy a doksi nagyon beszédes, és részletes, ebből a szempontból.
A szoftverről pár szót:
Igyekeztem univerzálisra megírni. Én 4diget-es panelt építettem, de a program, gyorsan bővíthető 8 digitig.
A digit számozás: 3 2 1 0
A kontroller hardveres SPI portját használtam, de a CS lábat én billentem. Ennek az az oka, hogy egyébként, minden byte küldésénél a BASCOM bebillenti a lábat, de az IC-nek ez nem jó, mert 2 byte adatot vár, folyamatosan. CÍM+ADAT. Ebből kitűnik, mit okoz a byteonkénti CS láb billegtetés...
Némi fejtörést okozott, hogy miként kezeljem a kiírandó adatot. Sztringként adjam át a szubrutinnak, vagy számként. A sztringnél maradtam, mert így később könnyebben használható lesz.
A DP pontokat külön kell megadni egy BYTE bitjeinek beállításával. Így könnyebben lehet többet is vezérleni egy időben, villogtatni, egyebek.
Villogtatás digitenként:
Ez egy picit érdekesen működik. Három regiszter terület van minden digitnek. P0,P1 és P01. Ezeknek a címei is mások.(lásd doksi)
A villogást külön engedélyezni kell. Ekkor kap szerepet a P0 és P1 adatregiszter. A villogás egyik fázisában a P0 regiszterből veszi az adatot, a másik fázisban a P1-ről. Ezért azt is meg lehet csinálni, hogy ha P0-ra 1-et írunk a P1-re 2-t akkor az 1 és a 2 fog felváltva megjelenni az adott digiten. Viszont ha P1-re semmit nem írunk, akkor az 1 fog villogni. Most látsz, most nem látsz...
a P01 területre íráskor permanensen látszik az adat. Amúgy ennek van a legnagyobb címe. Tehát hiába írunk a a P0-ra, ha írtunk a P01-re is. Nem fog villogni, mert a P01 regisztert olvassa be utoljára az IC.
A villogás vezérlésére szintén egy BYTE bitjei szolgálnak.
Röviden (
) ennyi. Remélem hasznos, amit írtam. A programot bátran kritizáljátok meg. Ha valakinek van ötlete, frappánsabb megoldás az írja meg nyugodtan.
A progam 8%-ot visz el a mega168 flashéből.
A progi:
Igyekeztem részletesen kommentezni, remélem sikerült.
Kérésre a NYÁK rajzot is bárkinek elküldöm, aki ugyanezt szeretné megépíteni. Békéscsabán utánrendelhető.
Üdv:
KN
HW:
Mega168
MAX6951
4db SC10-21SRWA kijelző
A program előtt némi összefoglaló a MAX6951-ről, ami a programozás alatt előjött.
Alapjában nagyon jó kis IC. Gyorsan és praktikusan lehet vele áramkört építeni. Amire nagyon allergiás, azok a LED-ek számai a szegmensekben.
Konkrétan én beleszaladtam abba a hibába, a SC10-21SRWA kijelzővel, hogy a szegmensekben 2db LED van sorban, kivéve a DP.-t. Ez ahhoz vezetett, hogy a 2. vagy 3. digit "G" szegmensének vezérlésekor, világított a az adott szegmens DP.-ja,illetve a 0. digit DP-ja.
1 nap szenvedés után arra jutottam, hogy a 2. és 3. szegmens DP-jával sorba betettem két LED-tet. Lám csodát a hiba megszűnt. Mivel szeretem megérteni a dolgokat, nyomoztam a doksiban, de semmi. Majd a MAXIM oldalán egy másik doksiban rátaláltam a hiba okára. A lényeg, hogy a vezérelt szegmensen nem maradhat 1V-nál nagyobb maradék feszültség, mert akkor "kóborol" az áram más irányba is, a potenciál különbségek miatt. Mivel én 5V-ról hajtottam,így nem nehéz kiszámolni, hogy kb 2,5V maradt. Nem megyek a részletekbe. Itt olvashatjátok, hogy miért volt ez baj.:http://www.maxim-ic.com/app-notes/index.mvp/id/1880
Szóval használat előtt érdemes a feszültségviszonyokat tisztázni, a használni kívánt kijelzővel egyetemben.
További "negatívum", ha lehet így fogalmazni. Az IC kétféle karakterkódolást tud. HEXA, vagy semmi:) Kell vagy nem kell:) A Hexanak van egy hátránya. Nem ismeri azt, hogy minden szegmens OFF. Azaz, ha nem írunk egy digitre, akkor ott a nulla fog világítani. Van mikor ez így jó, van mikor nem! Nem ismeri a negatív előjelet sem. Bumm neki...
Ezért én a szoftverben nem ezt használtam. Hozzáteszem, hogy lehet állítgatni bizonyos korlátok között, hogy melyik digiten milyen dekódolás legyen. (lásd doksi)
Pozitívum. Nem kell azzal foglalkozni, hogy töröljük a kijelzőt. Ugyanis a konfigurációban , van egy bit, amit ha beállítunk akkor amint a CS láb nullára megy , törli a kijelzőt. Ezt azért tartottam fontosnak kiemelni, mert az gyakori gond, hogy "szemét" marad a kijelzőn!
Amúgy a doksi nagyon beszédes, és részletes, ebből a szempontból.
A szoftverről pár szót:
Igyekeztem univerzálisra megírni. Én 4diget-es panelt építettem, de a program, gyorsan bővíthető 8 digitig.
A digit számozás: 3 2 1 0
A kontroller hardveres SPI portját használtam, de a CS lábat én billentem. Ennek az az oka, hogy egyébként, minden byte küldésénél a BASCOM bebillenti a lábat, de az IC-nek ez nem jó, mert 2 byte adatot vár, folyamatosan. CÍM+ADAT. Ebből kitűnik, mit okoz a byteonkénti CS láb billegtetés...
Némi fejtörést okozott, hogy miként kezeljem a kiírandó adatot. Sztringként adjam át a szubrutinnak, vagy számként. A sztringnél maradtam, mert így később könnyebben használható lesz.
A DP pontokat külön kell megadni egy BYTE bitjeinek beállításával. Így könnyebben lehet többet is vezérleni egy időben, villogtatni, egyebek.
Villogtatás digitenként:
Ez egy picit érdekesen működik. Három regiszter terület van minden digitnek. P0,P1 és P01. Ezeknek a címei is mások.(lásd doksi)
A villogást külön engedélyezni kell. Ekkor kap szerepet a P0 és P1 adatregiszter. A villogás egyik fázisában a P0 regiszterből veszi az adatot, a másik fázisban a P1-ről. Ezért azt is meg lehet csinálni, hogy ha P0-ra 1-et írunk a P1-re 2-t akkor az 1 és a 2 fog felváltva megjelenni az adott digiten. Viszont ha P1-re semmit nem írunk, akkor az 1 fog villogni. Most látsz, most nem látsz...
A villogás vezérlésére szintén egy BYTE bitjei szolgálnak.
Röviden (
A progam 8%-ot visz el a mega168 flashéből.
A progi:
Kód: Egész kijelölése
$regfile = "m168def.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 150
$swstack = 200
$framesize = 100
Const Dig0 = &B01111110 ' kijelzési képek
Const Dig1 = &B00110000
Const Dig2 = &B01101101
Const Dig3 = &B01111001
Const Dig4 = &B00110011
Const Dig5 = &B01011011
Const Dig6 = &B01011111
Const Dig7 = &B01110000
Const Dig8 = &B01111111
Const Dig9 = &B01111011
Const Dig_min = &B00000001
Const Dig_off = &B00000000
Dim Conf_dat(10) As Byte 'konfigurációs adattömb
Dim Disp_d_spi(16) As Byte 'SPI adattömb
Dim Nr_arr(9) As Byte 'kiírandó számtömb,szubrutinban belső változó
Dim Szam As String * 4 'kiírandó szám
Dim Dp_pos As Byte 'tizedes pont(ok) helye
Dim Blnk_pos As Byte 'szegmensek villogása
Dim Test_segmens As Byte 'test üzemmód
Declare Sub Disp_init(test As Byte) 'konfigurációs szubrutin
Declare Sub Disp_data(str_nr As String * 4 , Blink_seg As Byte , Dp_pos As Byte) 'adat kiíró szubrutin
Config Portb.2 = Output 'chip select láb
Cs Alias Portb.2 'alias a chip select lábhoz
Set Cs 'chip select láb 1-re állítás
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
Spiinit 'SPI busz inicializálás
'test----------------------------------------------------
Szam = "1234" 'kiírandó szám; stringben!!!!
'hol világítsanak a tizedes pontok
Dp_pos = &B00000000
Blnk_pos = &B11111111 'a villogó szegmens kijelölése. "1" = nem villog , "0" = villog
Test_segmens = 0 'szegmens test. '1' = minden szegmens bekapcsolva, "0" = normál állapot
Call Disp_init(test_segmens) 'konfigurációs szubrutin hívása. Elsőnek ezt kell meghívni!!!!
'
Call Disp_data(szam , Blnk_pos , Dp_pos) 'adat kiíró szubrutin hívása
'--------------------------------------------------------
Do
nop
Loop
Sub Disp_data(str_nr As String * 4 , Blink_seg As Byte , Dp_pos As Byte)
Local I As Byte 'ciklus változó
Local Dig0_p0_add As Byte : Dig0_p0_add = &H20 'szegmes adatcímek. lásd max6951 dokumentációt!!!
Local Dig1_p0_add As Byte : Dig1_p0_add = &H21 'ezek a címek alapból a villogáshoz használatosak.
Local Dig2_p0_add As Byte : Dig2_p0_add = &H22 'a blnk_pos változó módosítja őket!
Local Dig3_p0_add As Byte : Dig3_p0_add = &H23
Dig0_p0_add.6 = Blink_seg.0 'a nem villogó szegmens kijelölése
Dig1_p0_add.6 = Blink_seg.1
Dig2_p0_add.6 = Blink_seg.2
Dig3_p0_add.6 = Blink_seg.3
Str2digits Str_nr , Nr_arr(1) 'sztring konvertálása számtömbbé;1. cím tartalmazza a karakterek számát
'a karakterszámok növelése a ciklushoz
Nr_arr(1) = Nr_arr(1) + 1
For I = 2 To Nr_arr(1) Step 1
Select Case Nr_arr(i)
Case 0 : Nr_arr(i) = Dig0 'kijelzési számok helyettesítése a szegmens adatokkal. Lásd konstans érték!!!
Case 1 : Nr_arr(i) = Dig1
Case 2 : Nr_arr(i) = Dig2
Case 3 : Nr_arr(i) = Dig3
Case 4 : Nr_arr(i) = Dig4
Case 5 : Nr_arr(i) = Dig5
Case 6 : Nr_arr(i) = Dig6
Case 7 : Nr_arr(i) = Dig7
Case 8 : Nr_arr(i) = Dig8
Case 9 : Nr_arr(i) = Dig9
Case 253 : Nr_arr(i) = Dig_min 'a str->nr konvezió a "-" jelre 253-at ad vissza
Case Else : Nr_arr(i) = Dig_off 'space, vagy egyébb karekter esetén kikapcsolja a digitet
End Select
Next
'a tizedes pontok bekapcslása
Nr_arr(2).7 = Dp_pos.0
Nr_arr(3).7 = Dp_pos.1
Nr_arr(4).7 = Dp_pos.2
Nr_arr(5).7 = Dp_pos.3
Disp_d_spi(1) = Dig0_p0_add 'SPI adattömb összeállítása.
Disp_d_spi(2) = Nr_arr(2) 'páratlan inedx = regiszter cím, páros index = regiszter adat
Disp_d_spi(3) = Dig1_p0_add
Disp_d_spi(4) = Nr_arr(3)
Disp_d_spi(5) = Dig2_p0_add
Disp_d_spi(6) = Nr_arr(4)
Disp_d_spi(7) = Dig3_p0_add
Disp_d_spi(8) = Nr_arr(5)
For I = 1 To 7 Step 2 'adattömb kiírása;2 lépés kell, hogy a reg.címre lépjen a tömbindex mindíg
Reset Cs
Spiout Disp_d_spi(i) , 2
Set Cs
Next
End Sub
Sub Disp_init(test As Byte)
Local I As Byte 'ciklus változó
Conf_dat(1) = &H01 'digit kódolás regiszter cím
Conf_dat(2) = &H00 'digit kódolás regiszter adat
Conf_dat(3) = &H02 'szegmens intezitás regiszter cím
Conf_dat(4) = &H07 'szegmens intezitás regiszter adat
Conf_dat(5) = &H03 'digitszám regiszter cím
Conf_dat(6) = &H03 'digitszám regiszter adat
Conf_dat(7) = &H04 'globális konf. regiszter cím
Conf_dat(8) = &B00101101 'globális konf. regiszter adat. lásd dokumentáció!!!
Conf_dat(9) = &H07 'digit teszt regiszter cím
Conf_dat(10) = Test 'digit teszt regiszter adat
For I = 1 To 9 Step 2 'konfigurációs tömb kiírása;2 lépés kell, hogy reg.címre lépjen a tömbindex mindíg
Reset Cs
Spiout Conf_dat(i) , 2
Set Cs
Next
End Sub
End
Kérésre a NYÁK rajzot is bárkinek elküldöm, aki ugyanezt szeretné megépíteni. Békéscsabán utánrendelhető.
Üdv:
KN