7szegmens LED plusz MCP23017

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

Hozzászólás Szerző: tetye »

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?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

2 ilyen IC és ezekre az egyes számjegyeket? (portonként 1 kijelző?)

Az I2C kevés sebességben az általad írt ún. Multiplex meghajtáshoz.
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

Hozzászólás Szerző: tetye »

Értem akkor halott ötlet. köszi
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

É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!
:wink:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

4 szegmensesre van I2C buszos is.
Vagy végső esetben egy önálló AVR chipre megírod a vezérlést :)

A I2C / SPI-s vez.IC ~1-1.5 eFt
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

É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
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

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:

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
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
Válasz küldése