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

ATMEGA32 - komunikacja SPI z MCP3004, układ reaguje na dotknięcie przewodów

kula001 06 Sty 2016 13:25 1236 5
  • #1 15306180
    kula001
    Poziom 19  
    Witam

    Jestem początkujący w programowaniu. Zrobiłem sobie płytkę pod ADC MCP3004, filtracja zasilania 1uF i 100nF filtracja napięcia odniesienia 100nF, napięcie zasilania pobieram ze stabilizatora LM7805 z płytki ZL3AVR, do której przy pomocy kabelków łączę ADC przez SPI.
    Poniżej prezentuję program z podziałem na pliki:

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


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


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


    Do MCP3004 wysyłam bajt definiując wejście single ended (CH3). Nastepnie odbieram jeden z dwóch bajtów (na razie chcę odebrać cokolwiek) jakie MCP wysyła. Do kanału wejściowego ADC podpiąłem potencjometr. Bajt wyświetlam na diodach. Układ nie reaguje na zmianę nastawy potencjometru, nie reaguje nawet na odłączenie potencjometru. Za to przewody od spi działają jak antena. gdy dotykam przewodów diody wariują.

    Mała poprawka wariuje wszystko po dotknięciu linii SCK, na płytce nie ma zwarć VCC dociera do układu a do wejścia dociera zmienny sygnał z potencjometru
  • Pomocny post
    #2 15306267
    BlueDraco
    Specjalista - Mikrokontrolery
    1. Sprawdź połączenia.

    2. Bajt, który odbierasz, nie może nieść żadnej informacji o wyniku konwersji. Przeczytaj dokładnie kartę katalogową układu, którego używasz i przyjrzyj się, jak odbiera się wynik konwersji.

    3. Napisz jedną funkcję, która wysyła i odbiera bajt po SPI - te czynności są nierozdzielne - bez wysłania nic nie odbierzesz i zawsze po wysłaniu musisz odczytać odebrany bajt.
  • #3 15307050
    kula001
    Poziom 19  
    Połączenia są w porządku. Doczytałem, że muszę jednak odebrać dwa bajty zmodyfikowałem swój program:

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


    d1 i d2 zadeklarowałem jako uint16_t
    nadal nie mam żadnego wyniku konwersji
    teraz zauważyłem punkt 3 jaki dopisałeś, postaram się zrobic taką funkcję

    Dodano po 56 [minuty]:

    Chyba zrozumiałem, na pewni działa lepiej niż wcześniej, zrobiłem taką funkcję:

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


    mam już transmisję i reakcję na potencjometr tylko po przekroczeniu wartości ok 1,5V na wejściu otrzymuję same jedynki w odczytanych bajtach, poniżej tej wartości mam same zera
  • #4 15317436
    kula001
    Poziom 19  
    Problem rozwiązany, funkcję z ostatniego listingu musiałem przerzucić do osobnego pliku z definicjami pozostałych funkcji tak żeby nie była w jednym pliku z main.
  • #5 15317449
    BlueDraco
    Specjalista - Mikrokontrolery
    To na pewno NIE było źródłem problemu. Zgaduję, że przyczyna leżała w zmiennej odebrane.
  • #6 15317502
    kula001
    Poziom 19  
    A tak dodatkowo zlikwidowałem tą zmienną, a funkcja jest typu uint8_t i zwraca bezpośrednio wartość rejestru SPDR. Możesz poszerzyć dlaczego tak jest? Bo zrobiłem to z braku pomysłów nie z wiedzy.
REKLAMA