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.

Atmega128 - Odbiór danych z MCP3204-CI/P i wyświetlenie na GLCD

Jablonaack 20 Gru 2016 22:48 831 13
  • #1 20 Gru 2016 22:48
    Jablonaack
    Poziom 7  

    Mam problem z odczytem danych z ADC po SPI. Nie jestem pewien czy napisany program jest poprawny dlatego prosiłbym o ewentualne wyszukanie błędu i jakieś naprowadzenie jak go poprawić. Na CH1 układu MCP3204 podaje napięcie z potencjometru. Dane chce wyświetlić w postaci liczby oddawanej przez ADC. GLCD działa i zmienne, które miały być wyświetlone działają, tylko w miejscu danych z ADC widać "0".


    main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    spi.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    spi.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeszcze dodam, że kompilator wywala mi takie warningi.
    Atmega128 - Odbiór danych z MCP3204-CI/P i wyświetlenie na GLCD

    0 13
  • Pomocny post
    #2 20 Gru 2016 23:20
    BlueDraco
    Specjalista - Mikrokontrolery

    A jak Twój program ma się do obrazka 6-1 z dokumentacji układu (sterowanie linii CS)?

    Dlaczego nie poprawiłeś programu tak, żeby nie generował ostrzeżeń przy kompilacji?

    0
  • #3 21 Gru 2016 00:51
    Jablonaack
    Poziom 7  

    Jest progres :) Pozbyłem się warningów i ustawiania pinu CS w funkcji WysIOdb tak jak sugerowałeś @BlueDraco. Także CS jest ustawiony na 0 podczas odbioru 3 bajtów ciągiem. W odpowiednim miejscu na GLCD pojawiły się w końcu liczby. Tylko, że nie ma reakcji na zmianę napięcia. Co jeszcze może być nie tak ?

    0
  • Pomocny post
    #4 21 Gru 2016 08:49
    Sparrowhawk
    Poziom 21  

    Spójrz na rysunki: FIGURE 6-1, FIGURE 6-2 w dokumentacji do tego układu.

    W twoim kodzie zmieniasz stan pinu CS co bajt, a wg noty powinien on być w stanie niskim dla całej transmisji. Po za tym, wydaje mi się, że w złej kolejności wysyłasz bity konfiguracyjne, które mają zawierać się w pierwszych dwóch bajtach.

    Wynik zawiera się w dwóch ostatnich bajtach, więc nie wiem, dlaczego składasz go z trzech bajtów, bo raczej powinno być:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 21 Gru 2016 19:45
    Jablonaack
    Poziom 7  

    Po analizie figure 6-1 zmieniłem zapis na taki

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Rozpisałem swój tok myślenia, który może być nie do końca poprawny jako, że jestem zielony. Niestety ta zmiana nie pomogła. Po starcie programu na wyświetlaczu na chwilę pojawia się liczba "65535" po czym zmienia się na "0" i już tak zotaje. Dalej żadnej reakcji na zmianę napięcia. Czy problem może leżeć w typie zmiennych?

    Dodam jeszcze, że F_CPU = 8000000UL i preskaler ustawiony SPR1 = 1, SPR0 = 1 co daje /128.

    0
  • #6 21 Gru 2016 20:26
    Sparrowhawk
    Poziom 21  

    Pokaż definicję funkcji: WysIOdb(), bo w tej dotychczasowej brakuje Ci średnika po pętli while(...).

    W pętlach oczekujących na spełnienie warunku polecam stosować zapis:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Typy zmiennych generalnie są ok, chociaż w przypadku mikrokontrolerów (Zwłaszcza tych 8 bit), preferuje się używanie typów: uint8_t, int8_t, uint16_t, int16_t, itd., w których masz pewność co do wielkości. Ponieważ typ int, short int, itd. na różnych platformach może mieć różny rozmiar.

    0
  • #7 22 Gru 2016 00:23
    Jablonaack
    Poziom 7  

    Faktycznie @Sparrowhawk miałeś racje co do braku średnika. Teraz definicja funkcji wygląda tak.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety jest jak było i nie działa.

    0
  • #9 22 Gru 2016 10:40
    grko
    Poziom 33  

    @dondu Po to aby zasugerować, że ktoś naprawdę miał intencję napisania pustej pętli (tzn samo sprawdzanie warunku). Jest to nadmiarowe ale w niczym nie przeszkadza.

    0
  • #10 22 Gru 2016 10:52
    Sparrowhawk
    Poziom 21  

    @dondu: Aby uniknąć tego typu błędów, jaki przytrafił się koledze. Po za tym, w ten sposób wyraźnie zaznaczasz swoje intencje. Oczywiście można też zastosować:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Uważam, że zapis z continue jest najbardziej 'bezpieczny', a z drugiej strony taki zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    choć poprawny, potrafi sprawić kłopoty ;-).

    @Jablonaack: Nie mam teraz dostępu do noty układu 3204, ale możesz zwrócić uwagę, na odpowiednie ustawienia Data order, Clock Polarity, oraz Clock Phase.

    Możesz też zewrzeć MISO z MOSI, spróbować wysłać 3 bajty, i wyświetlić to co odebrałeś. Być może pomocny byłby tu oscyloskop (Ale pewnie nie masz do niego dostępu), albo analizator stanów logicznych, możesz pokazać też schemat urządzenia, oraz jak obecnie wygląda pętla główna twojego programu.

    Tutaj masz też notę aplikacyjną korzystania z interfejsu SPI w mikrokontrolerach AVR: SPI Application note AVR151

    0
  • #11 22 Gru 2016 12:41
    dondu
    Moderator Mikrokontrolery Projektowanie

    Sparrowhawk napisał:
    @dondu: Aby uniknąć tego typu błędów, jaki przytrafił się koledze. Po za tym, w ten sposób wyraźnie zaznaczasz swoje intencje. Oczywiście można też zastosować:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    Uważam, że zapis z continue jest najbardziej 'bezpieczny', a z drugiej strony taki zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    choć poprawny, potrafi sprawić kłopoty ;-).

    Zadałem to pytanie po to byś to wytłumaczył, bo suche wskazanie rozwiązania dla osób które czytają to teraz i tych którzy będą czytali w przyszłości może być niezrozumiałe, bo przecież w dokumentacji mikrokontrolera jest inaczej.

    Podsumowując więc dla tych co czytają ten wątek, wszystkie wskazane wyżej rozwiązania:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    wygenerują dokładnie ten sam kod:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #12 22 Gru 2016 19:10
    ASMnauka_
    Poziom 14  

    dondu napisał:


    Podsumowując więc dla tych co czytają ten wątek, wszystkie wskazane wyżej rozwiązania:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    wygenerują dokładnie ten sam kod:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    I to mi się podoba .
    Pisząc w ASM napiszę tylko raz
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    I wiem że ma czekać ...
    Natomiast w C są dziwadła z nawiasami itp. :ok:

    0
  • #13 22 Gru 2016 19:45
    BlueDraco
    Specjalista - Mikrokontrolery

    Wystarczy:

    while (~SPSR & 1 << SPIF);

    .. i obejdzie się bez nawiasów.

    0
  • #14 22 Gru 2016 20:38
    Jablonaack
    Poziom 7  

    Jeszcze raz przejrzałem program i okazało się, że zdefiniowany pin CS był w komentarzu i do tego brakowało zakończenia nawiasu i średnika przy ustawianiu bitów dla SPI (nie wiem czemu tego kompilator nie pokazał) . Mój błąd ale bez waszych podpowiedzi bym nie dał rady, więc bardzo dziękuje wszystkim udzielającym się. Wrzucam działający program, może komuś się przyda.

    spi.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    spi.h

    Kod: c
    Zaloguj się, aby zobaczyć kod


    main.c
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0