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

[Atmega32] [Atmega32][C][SPI] - Jak odczytać dane z przetwornika A/C ADS7816?

arusm 18 Sty 2013 23:50 2595 8
  • #1 11808966
    arusm
    Poziom 13  
    Witam
    Staram się odczytać wskazanie przetwornika a/c ads7816 (Atmega32,16MHz).
    schemat :
    [Atmega32] [Atmega32][C][SPI] - Jak odczytać dane z przetwornika A/C ADS7816?

    kod:

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


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

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


    Niestety na terminalu posiadam przeważnie wartość 0x0fff (lub 0x0fdf). Nie jest ona zależna od wartości napięcia.
    Napięcia mierzone są w zakresie od 0V do 2,5V (właściwie -9mV - 2,48V).
    Nogi przetwornika: DCLOCK podłączona do PB7, DOUT do PB6, CS do PB0.
    Już kończą mi się pomysły dlaczego to nie działa.
    Czy ktoś mógłby mi wskazać błąd w kodzie, bo ha jestem już bezradny.
  • #3 11809098
    arusm
    Poziom 13  
    Żadnych warningów nie ma (dziwne).
  • Pomocny post
    #4 11809377
    BlueDraco
    Specjalista - Mikrokontrolery
    Patrz tu:
    while(!(SPDR & (1<<SPIF)));

    Zwykle bit SPIF znajduje się w SPSR...
  • #5 11809817
    arusm
    Poziom 13  
    Dzięki wielkie BlueDraco. Faktycznie nie zauważyłem tyle razy takiego błędu. Już działa :)
  • #6 12384704
    _jta_
    Specjalista elektronik
    A ja zupełnie nie rozumiem, jak to działa - ADS7816 jest przetwornikiem 12-bitowym, który przesyła bity szeregowo - trzeba mu podać kilkanaście impulsów zegarowych, a w kodzie nie widzę, by był podawany choć jeden...

    Akurat sam próbuję uruchomić układ z ADS7816 i coś mi nie działa - niby coś z niego odczytuję, ale wartości nie są poprawne, zwykle dostaję parę wartości różniących się pojedynczymi bitami, podejrzewałem błędy w transmisji.
  • #7 12384742
    kiziu13
    Poziom 17  
    Jak to nie są podawane? SPI samo generuje zegar podczas wymiany danych. W funkcji pomiar(), w zasie kiedy wybrany jest układ poprzez CS, odczytywane są dwie wartości z SPI, które następnie są przeliczane.
  • #8 12384896
    _jta_
    Specjalista elektronik
    Aha, czyli te 3 linijki w spi_data() powodują 8 strobów po SPI? Nigdy nie pisałem programów na uC, więc nie wiedziałem. Teraz już rozumiem. Ale nie podoba mi się, że spi_data() jest typu 'char', a nie 'unsigned char' - co się dzieje, jeśli bit 6 wyniku (drugi bajt odczytanych danych to bity 6..0 wyniku i śmieć na najniższym bicie) jest '1'? Jeśli kompilator nie traktuje 'char' jako 'unsigned char', to bity 11..7 też wyjdą '1'...
  • #9 13739494
    arusm
    Poziom 13  
    temat zamykam
REKLAMA