Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

2-wire / 4-wire atmega32 + driver led 16ch. jak ugryźć.

rogeros 13 Feb 2009 15:14 3773 5
  • #1
    rogeros
    Level 13  
    Witajcie.
    Jeśli post był poruszany to wybaczcie ale przeglądałem forum i odpowiedzi na moje pytania nie znalazłem.
    Otóż jestem początkującym programistą w zakresie AVR ale już klka prostych projektów mam za sobą.

    Zakupiłem driver led 16bit (datasheet) i chciałbym się nim "pobawić"

    Niestety jeśli chodzi o transmisje wire to już się pogubiłem i mi ręce opadły.
    Pytanie 1) Co oznacza 2-wire, 4-wire. Ponieważ w specyfikacji atmega32 atmega wyposażona jest w 2-wire natomiast driver posługuje się 4-wire.

    Pytanie 2) Czy istnieje opis zasady działania tego protokołu. Otóż na chłopski rozum co kiedy i co po czym trzeba wysłać widać na wykresach czasowych. Ale jak to zrozumieć.

    Pytanie 3 w nawiązaniu do 2) Wiem, że mało tu zwolenników bascoma (ale od czegoś trzeba zacząć). Czy programując w bascom muszę martwić się o to co kiedy wysłać czy to wykonane już to zostanie za mnie.

    Pozdrawiam za wszelkie odpowiedzi bardzo dziękuje.
  • Helpful post
    #2
    marenc
    Level 24  
    1.
    2-wire to magistrala firmy philips nazywana I2C, a Atmel wprowadził swoją magistralę zgodną z tamtą o nazwie TWI.

    4-wire to magistrala SPI. Szeregowe przesyłanie danych w obie strony w takt linii zegarowej. Jedna linia aktywacji układu podrzędnego transmisji.

    2. Szukaj w internecie "AVR, SPI, TWI"

    3. Nie piszę w bascom'ie z wiadomych względów... ale zapewne dasz informacje o konfiguracji i jak będziesz chciał coś wysłać to też dasz informację co i się "samo zrobi".
  • #3
    rogeros
    Level 13  
    Dziękuje bardzo za pomoc.
    Rozwiało to moje wątpliwości mam jeszcze kilka pytań.

    Wyczytałem, że bascom obsługuje SPI. i może to być SPI sprzętowe jak i programowe.
    Czy są różnice w prędkości obu sposobów?

    Patrząc na jeden przykład linia SS musi koniecznie być podłączona do INT (przerwania). Gdzie indziej wyczytałem, że urządzeń można podłączyć tak wiele jak wiele mamy wolnych portów w mikroprocesorze.
    A moja atmega32 ma tylko dwa porty INT
    Więc jak to z tym jest?

    Korzystam z zestawu uruchomieniowego zl3avr i w nim wykorzystuje mosi do programowania procesora.
    czy wykorzystując ten port do programowania będę mógł wykorzystać go do SPI. czy ma to jakiś związek z fuse bit.?
  • #4
    marenc
    Level 24  
    Dzięki sprzętowemu SPI możliwe jest wykonywanie innych czynności w czasie transmisji danych, natomiast programowa implementacja tego medium transmisyjnego polega na symulacji przez ustawianie odpowiednich stanów na wyjściach logicznych. Prędkości jako tako nie różnią się zbytnio - programowa implementacja SPI będzie wolniejsza od sprzętowej biorąc pod uwagę maksymalną prędkość.

    Linia SS nie musi być podłączona do linii INT - może to być dowolne wejście/wyjście mikrokontrolera. Podłączenie linii SS do INT jest wymagane, aby budzić go ze stanu uśpienia w celu oszczędzania energii(o ile z takich korzystasz).

    Interface do programowania ISP używa mednium jakim jest SPI. ISP podczas programowania wymaga stanu resetu, więc możesz w swobodny sposób wykorzystywać to złącze, pamiętając, że do używania go musisz odłączyć programator.
  • #5
    rogeros
    Level 13  
    nie chciałem zakładać nowego tematu ponieważ ten też jest mój a tytuł także nawiązuje do mojego problemu.

    Otóż próbowałem odpalić driver led datasheet z moją atmegą32 ale pod długich staraniach poddałem się i stwierdziłem, że poproszę was o pomoc.

    1) Po pierwsze to jak połączyć w/w driver do atmegi.
    Do tej pory podłączałem

    Atmega -> CAT4016HV6
    _________________________
    MOSI -> SIN
    SCK -> CLK
    PORTA.7 -> LATCH

    PORTA.6 -> podłączyłem bezpośrednio do diody LED kontrolnej która miała "migać" przy wykonaniu pętli
    Port SS próbowałem zostawić nie podłączony lub do +5. (bez efektów w obu przypadkach)

    w układzie CAT4016
    REST poprzez rezystor 3K połączyłem z masą (jak każą w datasheet)
    VDD podłączyłem pod zasilanie 5+ te same które zasila Atmegę
    LED 1..16 podłączyłem pod katody diodek
    Anody diodek pod wspólne zasilanie 5+ oraz kondensator (1uF do masy) - jak każą w datasheet

    napisałem programik w bascom (nie wiem też czy poprawny) który miałby wysyłać poprzez spi bajty do drivera. Nie wiedziałem jakie bajty więc w pętli wysyłałem o jeden większy

    
    $regfile = "m32def.dat" 
    $crystal = 16000000
    
    Config Spi = Hard , Data Order = Msb , Master = Yes
    Config Porta = Output
    Dim X As Byte
    
    
    Do
    Incr X
    Toggle Porta.6
    
    Spiout X , 1
    Set Porta.7
    Waitus 20
    Reset Porta.7
    
    Wait 1
    
    Loop
    



    niestety program działa tak, że:
    odpala się dioda kontrolna porta.6 i tak zostaje.
    diody podłączone do drivera nie zapalają się.


    Przeszukałem już całe forum dużo też googlowałem ale niestety nic nie znalazłem co mogło by mi pomóc w odpaleniu tego drivera.

    Nie chciałbym się do tego zniechęcić (dużo napracowałem się aby stworzyć płytkę oraz przylutować ten mikroskopijny układ) dlatego z dozą nieśmiałości prosiłbym o gotowca. Czyli jak podłączyć poprawnie układ oraz krótki programik który by zapalał diody.
    Z resztą bym sobie poradził. Jeszcze nie potrafię czytać wykresów czasowych z datasheet. I nie wiem czy dobrze rozumuje.

    Za pomoc z góry wszystkim dziękuje.
  • Helpful post
    #6
    k_w
    Level 12  
    deklaracja spi i zmiennych
    
    dim x as word
    Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
    Config Pind.6 = Output                                      
    

    wysyłanie danych
    
    do
    incr x
    Gosub Write_spi
       Set Portd.6
          Nop : Nop
       Reset Portd.6
    loop
    end
    
    
    Write_spi:
    
    Bajt = High(x)
     Spdr = Bajt
    Czekaj1:
     sbis spsr,spif
     rjmp Czekaj1
    
    Bajt = Low(x)
     Spdr = Bajt
    Czekaj:
     sbis spsr,spif
     rjmp Czekaj
    
    Return