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

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

Jablonaack 20 Gru 2016 22:48 1239 13
REKLAMA
  • #1 16140232
    Jablonaack
    Poziom 9  
    Posty: 33
    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 / C++
    Zaloguj się, aby zobaczyć kod


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


    spi.h
    Kod: C / 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
  • REKLAMA
  • Pomocny post
    #2 16140297
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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?
  • REKLAMA
  • #3 16140400
    Jablonaack
    Poziom 9  
    Posty: 33
    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 ?
  • Pomocny post
    #4 16140550
    Sparrowhawk
    Poziom 22  
    Posty: 368
    Pomógł: 57
    Ocena: 19
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 16141704
    Jablonaack
    Poziom 9  
    Posty: 33
    Po analizie figure 6-1 zmieniłem zapis na taki

    Kod: C / 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.
  • REKLAMA
  • #6 16141831
    Sparrowhawk
    Poziom 22  
    Posty: 368
    Pomógł: 57
    Ocena: 19
    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 / 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.
  • #7 16142386
    Jablonaack
    Poziom 9  
    Posty: 33
    Faktycznie @Sparrowhawk miałeś racje co do braku średnika. Teraz definicja funkcji wygląda tak.

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


    Niestety jest jak było i nie działa.
  • #9 16142719
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    @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.
  • #10 16142733
    Sparrowhawk
    Poziom 22  
    Posty: 368
    Pomógł: 57
    Ocena: 19
    @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 / C++
    Zaloguj się, aby zobaczyć kod
    Uważam, że zapis z continue jest najbardziej 'bezpieczny', a z drugiej strony taki zapis:
    Kod: C / 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
  • #11 16142856
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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 / C++
    Zaloguj się, aby zobaczyć kod
    Uważam, że zapis z continue jest najbardziej 'bezpieczny', a z drugiej strony taki zapis:
    Kod: C / 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 / C++
    Zaloguj się, aby zobaczyć kod

    wygenerują dokładnie ten sam kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 16143556
    ASMnauka_
    Poziom 15  
    Posty: 187
    Pomógł: 20
    Ocena: 7
    dondu napisał:


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

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

    wygenerują dokładnie ten sam kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod

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

    I wiem że ma czekać ...
    Natomiast w C są dziwadła z nawiasami itp. :ok:
  • #13 16143673
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Wystarczy:

    while (~SPSR & 1 << SPIF);

    .. i obejdzie się bez nawiasów.
  • #14 16143823
    Jablonaack
    Poziom 9  
    Posty: 33
    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 / C++
    Zaloguj się, aby zobaczyć kod


    spi.h

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


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

Podsumowanie tematu

✨ Użytkownik miał problem z odczytem danych z przetwornika MCP3204 za pomocą interfejsu SPI na mikrokontrolerze Atmega128. Początkowo dane wyświetlane na GLCD były zerowe, mimo że zmienne działały poprawnie. Po kilku iteracjach i sugestiach od innych uczestników, użytkownik poprawił kod, eliminując ostrzeżenia kompilacji oraz poprawiając sposób ustawiania pinu CS. Ostatecznie, po analizie dokumentacji, użytkownik zidentyfikował brakujące elementy w kodzie, takie jak definicja pinu CS oraz błędy w przesyłaniu danych. Po wprowadzeniu poprawek, program zaczął działać poprawnie, a dane z ADC były wyświetlane na GLCD.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA