Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR] - MCP490X - Współdzielenie ISP i SPI dla ATmega8/32

aj123 27 Kwi 2014 10:17 2280 21
  • #1 27 Kwi 2014 10:17
    aj123
    Poziom 25  

    Mam jedno pytanie - jeśli do ISP uC mam podłączonego DAC'a (MCP4901) na stałe, to czy mogę jakby "równolegle" do niego wpiąć programator (USBasp) i programować wtedy ? Czy muszę w jakiś sposób odłączyć DAC'a od mikroprocesora i dopiero wtedy programować ?

    0 21
  • #2 27 Kwi 2014 11:54
    LordBlick
    VIP Zasłużony dla elektroda

    aj123: O jakim µC jest mowa(nie wszystkie mają sygnały ISP na tych samych liniach, co SPI), jak wygląda schemat ? Należy zadbać o to, aby sygnał aktywujący układu zewnętrznego był cały czas nieaktywny. Mi z powodzeniem udawało się programować ATmega164P z podłączoną pamięcią FRAM na SPI.

    0
  • #3 27 Kwi 2014 12:06
    aj123
    Poziom 25  

    Mowa o układzie ATMega8 i ATMega32. DAC to MCP4901 i MCP4902 (dwie różne konfiguracje - atmega8 i MCP4901 oraz atmega32 i MCP4902).

    Tak wygląda konfiguracja dla ATMega8 i MCP4901:

    [AVR] - MCP490X - Współdzielenie ISP i SPI dla ATmega8/32

    Tak przy okazji - co zrobić z wejściem LDAC przetwornika ? W PDF-ie piszą że to jakieś wejście do synchronizacji (czego?) i można nim jakoś (jak?) sterować albo złączyć do masy (aktywne stanem niskim).

    Tak dla pewności - na wejście ref podajemy napięcie, jakie może maksymalnie pojawić się na wyjściu przetwornika, tak ? (czyli jeśli podam tu +5V to będę mógł regulować na wyjściu DAC'a w zakresie 0-5V, jeśli np 3,3V to w zakresie 0-3,3V)

    Wybaczcie głupie pytania, ale nigdy nie programowałem niczego poza mikrofalówką i dopiero zaczynam swoją przygode ;)

    0
  • #4 27 Kwi 2014 13:00
    LordBlick
    VIP Zasłużony dla elektroda

    aj123 napisał:
    Tak wygląda konfiguracja dla ATMega8 i MCP4901
    Można spróbować podciągnąć do Vcc wyprowadzenie „CS” i sprawdzić, czy zadziała - podczas programowania (stan resetu) z reguły reszta wyprowadzeń AVR-a jest w stanie wysokiej impedancji.
    aj123 napisał:
    Tak przy okazji - co zrobić z wejściem LDAC przetwornika ? W PDF-ie piszą że to jakieś wejście do synchronizacji
    Na pewno jest tam więcej zdań na ten temat, wystarczy tylko chcieć się wczytać i/lub poszukać w Internecie projektów już zrealizowanych na tym DAC … ;)
    aj123 napisał:
    Tak dla pewności - na wejście ref podajemy napięcie, jakie może maksymalnie pojawić się na wyjściu przetwornika, tak ? (czyli jeśli podam tu +5V to będę mógł regulować na wyjściu DAC'a w zakresie 0-5V, jeśli np 3,3V to w zakresie 0-3,3V)
    Z zastrzeżeniem, że nie może przekroczyć wartości wymienionych w nocie katalogowej(To ty masz tego pdf-a przed nosem, nie ja…). ;)

    0
  • #5 27 Kwi 2014 13:31
    aj123
    Poziom 25  

    LordBlick napisał:
    aj123 napisał:
    Tak wygląda konfiguracja dla ATMega8 i MCP4901


    Można spróbować podciągnąć do Vcc wyprowadzenie „CS” i sprawdzić, czy zadziała - podczas programowania (stan resetu) z reguły reszta wyprowadzeń AVR-a jest w stanie wysokiej impedancji.


    Okej, dokopałem się troche głębiej PDF-a. Znalazłem m.in takie zdanie na temat LDAC:

    Cytat:
    This pin can be tied to low (VSS) if the VOUT update is desired at the
    rising edge of the CS pin.


    Czyli tutaj jeśli zewrę ten pin LDAC do masy, to napięcie na wyjściu będzie się aktualizować wraz ze zboczem narastającym na pinie CS (dobre tłumaczenie?). Natomiast :

    Cytat:
    CS is the chip select input, which requires an active-low
    signal to enable serial clock and data functions.


    Z tego wynika że CS musi mieć stan niski żeby układ 'działał'. Więc co w końcu ?

    BTW - Nie znalazłem żadnego projektu z tym przetwornikiem ;)

    0
  • #6 27 Kwi 2014 14:11
    LordBlick
    VIP Zasłużony dla elektroda

    aj123 napisał:
    Z tego wynika że CS musi mieć stan niski żeby układ 'działał'. Więc co w końcu ?
    Wniosek błędny (ja też trochę wyżej poleciałem skrótem myślowym), układ działa ciągle po włączeniu zasilania, natomiast w notce jest mowa o szynie SPI, załączanej tym sygnałem na czas komunikacji. Sprawdź, czy w notce nie ma jeszcze dodatkowych wykresów/przebiegów sygnałów…


    P.S. Temat wydzielam jako oddzielny, gdyż łatwiej będzie go odnaleźć komuś następnemu poszukującemu podobną informację…

    0
  • #7 29 Kwi 2014 06:02
    aj123
    Poziom 25  

    Okej, bo tak czytam i czytam, a dalej nie wiem do czego jest to wejście LDAC :D Projektów na tym przetworniku (ani żadnym podobnym) nie mogę jakoś znaleźć... Nie może mi kolega powiedzieć zwyczajnie za co ono odpowiada i co z nim zrobić ?

    Tak swoją drogą - może kolega skontrolować podłączenie przetwornika do uC ?

    0
  • #9 29 Kwi 2014 07:24
    vania
    Poziom 22  

    aj123 napisał:
    Okej, bo tak czytam i czytam, a dalej nie wiem do czego jest to wejście LDAC :D Projektów na tym przetworniku (ani żadnym podobnym) nie mogę jakoś znaleźć... Nie może mi kolega powiedzieć zwyczajnie za co ono odpowiada i co z nim zrobić ?
    ?


    Jeśli masz jeden przetwornik to nic nie musisz z nim robić, zwierasz do masy. Gdybyś miał kilka przetworników to ich wejścia LDAC łączysz razem i podpinasz do procesora. Wtedy zmiana stanu z H->L powoduje "przesłanie" wpisanych danych na wyjście w postaci analogowej. Masz wtedy synchroniczną zmianę napięcia na kilku przetwornikach.

    0
  • #10 29 Kwi 2014 12:19
    LordBlick
    VIP Zasłużony dla elektroda

    rafikAVR napisał:
    Możesz zastosować układ 74HC4053 do rozdzielenia SPI na układy peryferyjne i na programator ISP , sterowanie za pomocą pinu reset z programatora
    Nie ma takiej potrzeby, ISP jest aktywowane niskim stanem $$\bar{RESET}$$, a podciągnięcie lini CS przetwornika powinno załatwić sprawę, ponieważ pin sterujący z µC będzie wtedy nieaktywny.

    0
  • #11 29 Kwi 2014 18:03
    aj123
    Poziom 25  

    Czyli co.. Zwyczajnie zostawiam tak jak jest, na wejście CS przetwornika daję stan wysoki na stałe (nie podłączam go do uC w ogóle), programator daję wtedy bez problemu równolegle i ma działać ?

    0
  • #12 29 Kwi 2014 18:21
    LordBlick
    VIP Zasłużony dla elektroda

    Nie, łączysz CS z dowolnym pinem, który z twojego programu będzie aktywował przetwornik (SS to jest oznaczenie dla trybu Slave mikrokontrolera), z tym, że należy ta linię dodatkowo podciągnąć przez około 4,7kΩ - 10kΩ do Vcc.
    Reszta oczywiście równolegle.

    0
  • #13 29 Kwi 2014 19:50
    aj123
    Poziom 25  

    Ale jak rozumiem to wejście CS może zostać tam gdzie jest (pin SS uC), lecz muszę dorzucić rezystor podciągający do Vcc, tak ?

    0
  • #14 29 Kwi 2014 22:10
    LordBlick
    VIP Zasłużony dla elektroda

    Generalnie tak, ale mam ciekawostkę: w pewnych warunkach gmeranie przy SS może doprowadzić do przełączenia się µC w tryb slave. Szczegóły w notce katalogowej w rozdziale o SPI.

    0
  • #15 29 Kwi 2014 23:19
    aj123
    Poziom 25  

    LordBlick napisał:
    w pewnych warunkach gmeranie przy SS może doprowadzić do przełączenia się µC w tryb slave.


    Gdybyś jeszcze był tak dobry powiedzieć mi co to za tryb ;) Nie znam się na AVR :D

    Zmuszasz mnie do analizowania rzeczy, o których (na razie ;)) nie mam zielonego pojęcia, co jest dość denerwujące bo mówisz o tym w taki sposób jakby miało to jakieś duże znaczenie, a ja nie mogę odnaleźć potrzebnych informacji :D

    0
  • #16 30 Kwi 2014 10:06
    vania
    Poziom 22  

    aj123 napisał:
    LordBlick napisał:
    w pewnych warunkach gmeranie przy SS może doprowadzić do przełączenia się µC w tryb slave.


    Gdybyś jeszcze był tak dobry powiedzieć mi co to za tryb ;) Nie znam się na AVR :D

    Zmuszasz mnie do analizowania rzeczy, o których (na razie ;)) nie mam zielonego pojęcia, co jest dość denerwujące bo mówisz o tym w taki sposób jakby miało to jakieś duże znaczenie, a ja nie mogę odnaleźć potrzebnych informacji :D


    Tu masz ładnie po polsku opisane SPI w Atmega32

    0
  • #17 10 Maj 2014 13:22
    aj123
    Poziom 25  

    Skleciłem coś takiego do obsługi DAC'a (MCP4901):

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I generalnie nie działa. Na wyjściu DAC'a mam cały czas 0V. Próbowałem już kilku różnych kodów, ten napisał ktoś kiedyś dla mnie (wycinek z większego kodu).

    0
  • #18 11 Maj 2014 15:45
    aj123
    Poziom 25  

    EDIT:
    Mając dużo czasu i będąc zdesperowanym do granic możliwości napisałem "sztuczną" transmisje SPI z DAC'em... Sztuczny zegar (na delay'ach), sztuczne wyjście danych. Polega to na cyklicznym ustawianiu i kasowaniu bitu (jako zegar) i w zależności od potrzeby ustawianie bitu na wyjściu danych. Oto moja proteza:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I na co to komu ? A no na to, żeby sprawdzić czy to z DAC'em jest coś nie tak, czy ze mną. Otóż DAC ma się dobrze i przy załadowaniu powyższego kodu do pamięci uC, DAC daje na wyjściu 100% wartości zasilania. Kiedy ustawię 1 na bicie 5, reszte dam zera (bit 6-16) to dostaję 50% wartości zasilania, czyli DAC działa jak należy. Co zauważyłem - według noty katalogowej bity 13-16 są ignorowane, ale ich pominięcie w kodzie skutkuje tym, że DAC nie działa. I co teraz ? Wiem że używając SPI można upchnąć cały ten kod w kilkunastu linijkach i dodatkowo dorobić regulacje. Mógłby ktoś na to rzucić okiem ?

    0
  • #19 11 Maj 2014 20:50
    Eagle
    Poziom 23  

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod



    Jak znajdziesz błąd w tym zapisie to będzie działać.

    Pierwsza podpowiedź to taka, że masz nieprawidłowy format liczby. Bo jeszcze nie widziałem, aby ktoś ustawiał maskę ósemkowo.

    0
  • #20 11 Maj 2014 22:29
    aj123
    Poziom 25  

    Możesz mi tak mówić, a ja będę zachodził w głowe o co chodzi :D
    Skoro muszę wysłać 16 bitów to mam to podzielić na 4 funkcje po 4 bity czy może zamienić np 0011111111111111 (4 bity kontrolne, 8 bitów danych i 4 bity ignorowane) na hex, czyli tutaj na 3FFF ? Nie mam więcej pomysłów :(

    0
  • Pomocny post
    #21 12 Maj 2014 07:12
    Eagle
    Poziom 23  

    111 -> 111 <==> 111 dziesiętnie-> 111 dziesiętnie
    0111 -> 73 <==> 111 ósemkowo -> 73 dziesiętnie

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    zero przed liczbą oznacza ósemkowy, powyższe nie skompiluje się bo w systemie ósemkowym nie występują cyfry powyżej 7

    0b0111 -> 7 <==> 111 binarnie -> 7 dziesiętnie

    więc w twoim przypadku powinno być :

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod


    Na przyszłość używaj debuggera, ustaw pułapkę na funkcję np: SPI_MasterTransmit i zobacz jakie wartości argumentów przekazywane są do funkcji.

    0
  • #22 12 Maj 2014 14:21
    aj123
    Poziom 25  

    Wielkie Ci dzięki mistrzu :D

    Końcowy kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz to to działa jak należy i mam pełną regulację w zakresie 0-100%. Jeszcze raz dzięki i temat uważam za zamknięty ;)

    0