logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

MAX7219 obsługa kilku driverów

elektron1956 20 Wrz 2009 23:09 4601 15
  • #1 7040210
    elektron1956
    Poziom 14  
    Witam!
    Prosba.Jak w Bascomie zrealizowac kod ktrory obsluzy 2 Maxy7219?Ale bez dodatkowego Pinu mikroprocesora na drugi LOAD.Chodzi mi o NO-OP.
    Probowalem na wszelkie sposoby i nici.Wiem ze trzeba wyslac NO-OP ale w ktorym miejscu i po czym.Prosilbym o jakis krotki przyklad.

    Pozdrowienia
  • #2 8489708
    spektra
    Poziom 18  
    Też szukam jakiegoś źródła. Sam kombinowałem na różne sposoby. Sterowanie pojedyńczym układem mam opanowanie. A chciałem połączyć sekwencyjnie 6 układów sekwencujnie i podpiąć matryce led 7x5.


    W załączniku przykład i opis układu i 8 wyświetlaczy LED siedmiosegmentowych

    Pozdrawiam
  • #3 8489777
    Mat_91
    Poziom 25  
    Ale przecież w DS jest wszystko opisane, nawet jest opisany przykład dla 4 urządzeń kaskadowo:

     For example, if
    four MAX7219s are cascaded, then to write to the
    fourth chip, sent the desired 16-bit word, followed by
    three no-op codes (hex 0xXX0X, see Table 2). When
    LOAD/CS goes high, data is latched in all devices. The
    first three chips receive no-op commands, and the
    fourth receives the intended data.

    Czyli podpinasz MOSI procesora do DIN układu 1, DOUT układu 1 do DIN układu 2, DOUT układu 2 do DIN układu 3, DOUT układu 3 do DIN układu 4, linie CS spinasz razem, i jeżeli chcesz wysłać daną do układu 4 to CS-stan niski, wysyłasz słowo dla układu 4 a później 3 komendy NO-OP i CS w stan wysoki, wtedy twoja dana trafia do układu 4 a do pozostałych trafia NO-OP.

    Chyba jasno to opisałem :)
  • #4 8490020
    spektra
    Poziom 18  
    W swoich próbach SPI ustalam programowo : Config Spi = Soft , Dout = Portc.2 , Clock = Portc.4 , Ss = Portc.3. Dout na Din 1 i Dout 1 na Din2 i tak dalej aż do 6 układu - Clock do kupy na CLK MAX-ów , Ss do kupy na LOAD Maxów.

    Z opisu z pdf-a "do sterowania wejściem LOAD nie mozna sterować modułów połączonych kaskadowo, bo po każdej transmisji SPI linia zmienia stan zatrzaskując dane. Do sterowania pojedyńczym układem używam sekwencji:

    X = Makeint(&H05 , &B00000000) : Spiout X , 2
    Y = &H0000 : Spiout Y , 2

    Lecz nie wiem jak to zrobić przy kaskadzie? Może byś podesłał kawałek kod jak to zrealizować. Konfiguracja linii sterujących i sposób przesłania danych
  • #5 8490071
    Mat_91
    Poziom 25  
    Nie definiuj linii SS podczas konfiguracji spi, musisz to zrobić czysto programowo, czyli:

    konfigurujesz SPI (config spi bla bla bla bez tego SS=...)

    Portc.3=0
    tu wysyłasz dane przez spi tyle razy ile masz układów (dla 6 układów 6 słów do wysłania)
    Portc.3=1

    Chodzi o to ze układy nie zatrzasną danych do póki nie będzie stanu wysokiego na linii LOAD, SPI sprzętowe ustawia ten stan po każdym wysłanym słowie, ty jeżeli masz 6 układów potrzebujesz zatrzasnąć dane "raz na 6 słów" więc sprzętowe sterowanie linią SS odpada.
  • #6 8490134
    spektra
    Poziom 18  
    pod te 6 Max-ów mam podpiete 6 matryc ledowych 5X7. Sprawdz mój to rozumienia

    PORTc.3=0
    X = Makeint(&H05 , &B00100010) : Spiout X , 2
    Y = &H0000 : Spiout Y , 2
    przeslanie 1 rzędu danych i później

    5x X = Makeint(&H00 , &B00000000) : Spiout X , 2
    Y = &H0000 : Spiout Y , 2

    następnie przesłanie 2 , 3 ,4 i 5 rzędu i 5 x no-op
    PORTC.3=1

    i wtedy pownino być wszystko w ostatnim 6 układzie?
  • #7 8490200
    Mat_91
    Poziom 25  
    Ja nie wgłębiałem się w DS i nie znam się na bascomie, ale wnioskuje że to z X to wysłanie liczby 00100010 pod adres 0x05, ale nie wiem po co to Y? Przecież to jest komenda NO-OP, więc w tym wypadku nie potrzebna. jak dla mnie to żeby wpakować 5 rzędów danych do matrycy 6 musisz zrobić:

    Rząd 1:
    Portcc3=0
    X = Makeint(&H05 , &B00100010) : Spiout X , 2
    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    Portc.3=1

    I tak samo z każdym innym rzędem. jak będziesz chciał wysłać do matrycy 5 to najpierw wysyłasz NO-OP, później dane, a na koncu 4 razy NO-OP. Przynajmniej ja to tak rozumie. Problem w tym że to jest baaaardzo nieoptymalne czasowo, lepiej zrobić tak że wysyłasz 6 słów dla 6 układów (rząd pierwszy dla każdej matrycy) i stan wysoki na LOAD, później stan niski na load, znów 6 słów dla 6 układów (rząd 2 dla wszystkich 6 matryc) i znów stan wysoki na LOAD, sprawi to że zamiast zapełnić 1 matryce zapełnisz wszystkie 6 w tym samym czasie.
  • #8 8490337
    spektra
    Poziom 18  
    i toak jest u mnie ten sam znak pojawia sie na każdym wyswietlaczu. muszę przeanalizować twój oststni post
  • #9 8490399
    Mat_91
    Poziom 25  
    Pochwal się efektami jak już zadziała :) I mam nadzieje że sie nie machnąłem nigdzie i nie wprowadziłem Cię gdzieś w błąd. Jutro sie wczytam lepiej w DS to w razie czego może coś pomogę jeszcze.

    W każdym razie nie powinieneś mieć problemów ze sterowaniem tych układów podpiętych szeregowo jeżeli tylko będziesz sterował linią LOAD programowo na początku i końcu transmisji.
  • #10 8490428
    spektra
    Poziom 18  
    Reset Portc.3

    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    Y = &H0000 : Spiout Y , 2
    X = Makeint(&H05 , &B00111000) : Spiout X , 2
    Y = &H0000 : Spiout Y , 2

    Set Portc.3
    ta sekwencja wpisuje ten sam znak na 1 i 2 wyświetlaczy nie wiem czemu
  • #11 8496873
    Mat_91
    Poziom 25  
    Pokaż mi schemat jeżeli możesz, chodzi o część podłączenia tych układów w sekwencji. I jeśli można to cały program :)
  • #12 8497633
    spektra
    Poziom 18  
    Witam.
    Podłączenie jest typowe na pin1 1 układu do Dout interfejsu SPI. 24 pin 1 ukladu na 1pin 2układu i tak dalej do 6. LOAD i CLK razem też do SPI.
    Jedną rzeczą którą wyczytałem to przy konfiguracji SPI, Ss = none, wtedy można wykorzystywać dowolnie linię LOAD.
    Próbowałem na różne sposoby wysyłać dane do MAX-a przez SPIOUT i przez SHIFTOUT. I nic.
    Muszę zacząć od początku z poprawnym zainicjowaniem MAX-a

    Dodano po 2 [minuty]:

    https://www.elektroda.pl/rtvforum/topic1115912.html
  • #13 8497718
    Mat_91
    Poziom 25  
    No i w tamtym temacie z tego co widzę ludzie pisali to samo co ja, a twój kod wygląda na ok (tzn to co przedstawiłeś w tym temacie). Problem jest gdzie indziej, spróbuj przed procedurą "set portc.3" dać małe opóźnienie, np 1ms. I sprawdź czy dane wyświetlą się normalnie na 1 wyświetlaczu czy na 2 tak jak masz teraz.
  • #14 8497836
    spektra
    Poziom 18  
    Właśnie podłączam ten układ pod pracujący procek Atmega32. Zmieniłem port SPI na D. Zobaczymy czy coś się zmieni. Dam znać.
  • #15 8511870
    spektra
    Poziom 18  
    Witam.

    Po kilku godzinach prób i błędów wreszcie udało mi się do sześciu układów MAX7219/7221 połączonych sekwencyjnie, sterujących sześcioma matrycami led 7x5 wpisać sześć cyfr.

    
    $lib "mcsbyte.lbx"
    $regfile = "m32DEF.DAT"
    $crystal = 16000000
    Config Spi = Soft , Dout = Portc.2 , Clock = Portc.4 , Ss = Portc.3
    
    Dim X As Word ,
    Spiinit
    
    'inicjacja MAx-a
    X = &H000F : Spiout X , 2
    X = &H010C : Spiout X , 2
    X = &H070B : Spiout X , 2
    X = &H0009 : Spiout X , 2
    X = Makeint(&H0a , 2) : Spiout X , 2
    
    'wygaszenie 
    X = Makeint(&H08 , 0) : Spiout X , 2
    X = Makeint(&H07 , 0) : Spiout X , 2
    X = Makeint(&H06 , 0) : Spiout X , 2
    X = Makeint(&H05 , 0) : Spiout X , 2
    X = Makeint(&H04 , 0) : Spiout X , 2
    X = Makeint(&H03 , 0) : Spiout X , 2
    X = Makeint(&H02 , 0) : Spiout X , 2
    X = Makeint(&H01 , 0) : Spiout X , 2
    '
    Waitms 900
    Sound Portb.3 , 100 , 550
    
    X = Makeint(&H05 , &B00111110) : Spiout X , 2
    X = Makeint(&H04 , &B01001001) : Spiout X , 2
    X = Makeint(&H03 , &B01001001) : Spiout X , 2
    X = Makeint(&H02 , &B01001001) : Spiout X , 2
    X = Makeint(&H01 , &B00100110) : Spiout X , 2
    
    X = Makeint(&H05 , &B01110010) : Spiout X , 4
    X = Makeint(&H04 , &B01010001) : Spiout X , 4
    X = Makeint(&H03 , &B01010001) : Spiout X , 4
    X = Makeint(&H02 , &B01010001) : Spiout X , 4
    X = Makeint(&H01 , &B01001110) : Spiout X , 4
    
    X = Makeint(&H05 , &B00001100) : Spiout X , 6
    X = Makeint(&H04 , &B00010100) : Spiout X , 6
    X = Makeint(&H03 , &B00100100) : Spiout X , 6
    X = Makeint(&H02 , &B01111111) : Spiout X , 6
    X = Makeint(&H01 , &B00000100) : Spiout X , 6
    
    X = Makeint(&H05 , &B00100010) : Spiout X , 8
    X = Makeint(&H04 , &B01000001) : Spiout X , 8
    X = Makeint(&H03 , &B01001001) : Spiout X , 8
    X = Makeint(&H02 , &B01001001) : Spiout X , 8
    X = Makeint(&H01 , &B00110110) : Spiout X , 8
    
    X = Makeint(&H05 , &B00100001) : Spiout X , 10
    X = Makeint(&H04 , &B01000011) : Spiout X , 10
    X = Makeint(&H03 , &B01000101) : Spiout X , 10
    X = Makeint(&H02 , &B01001001) : Spiout X , 10
    X = Makeint(&H01 , &B00110001) : Spiout X , 10
    
    X = Makeint(&H05 , &B00000000) : Spiout X , 12
    X = Makeint(&H04 , &B00100001) : Spiout X , 12
    X = Makeint(&H03 , &B01111111) : Spiout X , 12
    X = Makeint(&H02 , &B00000001) : Spiout X , 12
    X = Makeint(&H01 , &B00000000) : Spiout X , 12
    
    End                                                    
    


    Nie potrafię tego wytłumaczyć, ale to działa. Może ktoś to potrafi wytłumaczyć.

    SPI konfigurowane standardowo. Linie LOAD połączone są razem i podpięte do SPI. Tak samo CLK. DIN z SPI podłaczony do DIN 1 układu, DOUT 1 układu z DIN 2 układu i tak do 6 układu. DOUT 6 układu wisi w powietrzu. Żeby wygasić któryś z wyświetlaczy należy przesłać zero do pięciu rejestrów H01-H05. Narazie nie kombinowałem w obszarach regulacji jasności w poszczególnych MAX-ach
  • #16 12818729
    elektron1956
    Poziom 14  
    'SPI odpada bo wysyla za kazdym razem LOAD. Tylko Shiftout.
    'To przyklad na dwa maxy polaczone w szereg. Wlasnie te _noop to cala filozofia !!
    'Reszte wiecie jak zrobic.

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA