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

[mega8] Jak włączyć diodę LED przez MCP23S09 z AVR mega8 w języku C?

cszawisza 22 Cze 2012 05:55 1927 9
  • #1 11028715
    cszawisza
    Poziom 10  
    Witam.
    Mam problem z obsługą układu MCP23S09 ( nota ) chcę aby mój układ włączył na swoim wyjściu diodę LED, a tymczasem nie potrafię się z tym układem dogadać. :)
    Oto próbka mojego kodu, który udało mi się napisać do tej pory:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz według noty katalogowej expandera wystarczy przesłać
    OPTOCODE:REG ADDRESS:REG VAL
    więc robię to za pomocą:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I teraz wszystko to powinno działać, ale procesor zatrzymuje się w momencie wejścia w funkcję WriteByteSpi() i nie wiem dlaczego się tak dzieje?
  • Pomocny post
    #2 11029857
    Konto nie istnieje
    Poziom 1  
  • #3 11040855
    cszawisza
    Poziom 10  
    Ustawiałem jako wyjście, ale niestety nie pomogło. :( walczę dalej, pomysły mile widziane ;)
  • #4 11041033
    LordBlick
    VIP Zasłużony dla elektroda
    Nie pokazałeś całego kodu, ani jak podłączyłeś to wszystko, gdzie masz zdefiniowane SLAVE_ADDRESS_WRITE i IODIRA ?
  • #5 11041111
    janbernat
    Poziom 38  
    Ja to robię tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ocxzywiście nie dla Twojego układy ale dla MAX522.
    Wybieranie układu przez CS "ręczne".
    No i czasy- nie sprawdzałem dokładnie- sprawdź w DS.
    Te moje są dla 16Mhz i dla MAX522.
    Funkcja zapisu identyczna jak Twoja.
    No i co oznacza slave_addres dla SPI?
    To nie jest I2C.
  • #6 11041166
    cszawisza
    Poziom 10  
    Slave_addres bierze się z 12 strony dokumentacji ;) 1 na LSB oznacza zapis, a 0 odczyt.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    kompletny plik

    jeżeli chodzi o plik main

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a teraz najciekawsze.

    wlaczanie mikroprocka .....
    
    inicjalizacja SPI
    
    SPCR: 1000001
    
    SPSR: 10000000
    
    SPI2X: 0
    
    \0xf0\0xf0wlaczanie mikroprocka .....
    
    inicjalizacja SPI
    
    SPCR: 1010001
    
    SPSR: 0
    
    SPI2X: 0
    
    ODP1: 0
    
    ODP2: 0
    
    ODP3: 0

    powyżej wkleiłem to co "wypluwa" mi terminal po dwukrotnym włączeniu procka na tym samym wsadzie (aczkolwiek wersja z SPCR = 1010001 zdarza się naprawdę rzadko) czy taki zachowanie może być spowodowane przez uszkodzony procek? nawet próbowałem zapisać ten rejestr bezpośrednio w razie jakby kompilator wariował... z tąd linia SPCR = 0x51; w funkcji spiInit, ale nie pomaga to. próbowałem też zmienić CPOL na 1, też nic. Częstotliwość wg. noty katalogowej nie może być większa niż 10MHz, mój procesor jest ustawiony na 8MHz więc niemożliwe jest żeby przekroczyć tą wartość

    *******EDIT***********

    próbowałem też z odwrotną polaryzacją CS z tąd też
    LOW = 1 i HIGH = 0, próbowałem tez na odwrót ale nic to nie dawało
  • #7 11041171
    LordBlick
    VIP Zasłużony dla elektroda
    janbernat napisał:
    No i co oznacza slave_addres dla SPI?
    To nie jest I2C.
    Jest to opisane w w/w nocie katalogowej - jest to pseudo adres, zawierający wybór R/W, jako, że ten sam krzem idzie do wersji SPI i I²C.
    cszawisza napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I w tym momencie powiem a-ku ku... ;)
    Dla Atmega8:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Co do SS, to można w sumie przerzucić gdziekolwiek, ale myślę, ze podłączenie jest domyślne, a µC jednak sprawny...
    To jednak jest tylko moje wróżenie, bo jakoś do tej pory nie byłeś skłonny ustosunkować się do :
    LordBlick napisał:
    Nie pokazałeś całego kodu, ani jak podłączyłeś to wszystko
    Błędy występują nie tylko w software.
  • #8 11041350
    cszawisza
    Poziom 10  
    Cytat:
    I w tym momencie powiem a-ku ku... Wink
    Dla Atmega8:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    niby racja, ale... :)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    poprawiłem PB7 na PB2 ale dalej nie zmieniło to nic w działaniu układu.
    Co do schematu...

    np pinu uC - expander
    16 (SS) - 3 (!CS)
    17 (MOSI) - 5 (SI)
    18 (MISO) - 6 (SO)
    19 (SCK) - 4 (SCK)

    Dodatkowo expander

    1 - +5
    18- GND

    i cały czas zastanawia mnie dlaczego wartość rejestru SPCR czasami jest 1010001 a czasami 1000001....
  • Pomocny post
    #9 11041420
    LordBlick
    VIP Zasłużony dla elektroda
    cszawisza napisał:
    niby racja, ale... :)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    poprawiłem PB7 na PB2 ale dalej nie zmieniło to nic w działaniu układu.
    To wklejaj aktualny kod.
    I tak nadal jest źle - niezgodnie z podłączeniem i zastosowaniem - ATmega8 będzie się przełączać na slave(opisane w nocie katalogowej - poszukaj sobie..), co z resztą wywołuje twoje zdziwienia z rejestrem SPCR. I niepotrzebnie utrudniasz sobie życie - użyj wcześniej zdefiniowanych danych, tak jak ja je napisałem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    W tej wersji linijka komentarza jest zbyteczna i kod bez żadnych zmian pójdzie na innym AVR.
  • #10 11042034
    cszawisza
    Poziom 10  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Znalazłem błąd... :)
    expander działa, wielkie dzięki za pomoc :)
    Pozdrawiam zawisza

    Moderowany przez Dzimi:

    Na prośbę Kol. LordBlick temat odblokowuję w celu dopisania informacji.

REKLAMA