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

[AT90CAN128] ADC z JTAG - Nieprawidłowe wyniki pomiarów na termistorze

mesh67 03 Lis 2017 12:09 894 9
  • #1 16798152
    mesh67
    Poziom 9  
    Witam,

    Napisałem kod, w którym wykorzystuje porty do programowania [JTAG] jako pomiar na termistorze. Oddzieliłem te 2 sygnały switch'ami by podczas programowania niepotrzebnie mieszać oraz programowo zmiana switch'u dezaktywuje JTAG w uC. Problem polega na tym że dokonując pomiaru na 4 portach mam dziwny wynik. Otóż wyświetlacz pokazuje mi wartość 1.0, jeśli odłączę termistory to ukazuje 65535. Każdy reaguje na zmianę, ale nie ma typowego pomiaru pomiaru ADC.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 16798328
    JarekC
    Poziom 32  
    Problemem może stwarzać sekwencja wyłączania JTAGa.
    Bit JTD powinien być ustawiony dwukrotnie w przeciągu 4 cykli zegara, co w przypadku zastosowania sekwencji z OR może nie zadziałać.
    Albo wpisuj bezpośrednią wartość do MCUCR albo najpierw odczytaj do tymczasowej zmiennej ,uzupełnij o bit JTD i wpisz do MCUCR.
    Najlepiej sprawdź co jest w kodzie wynikowym.

    Co to jest ADMUXVAL, bo nigdzie nie widzę definicji?

    JarekC
  • #3 16798350
    mesh67
    Poziom 9  
    Dzięki za odpowiedz,
    musiałem wykasować definicję: #define ADMUXVAL (1<<REFS0),

    Nie wiem właśnie jak inaczej rozwiązać 2 tryby pracy: JTAG albo ADC... i tylko to mi wpadło do głowy, postaram się coś pokombinować.
    Jak sprawdzić kod wynikowy?

    Wpałem na pomysł, tylko nie wiem czy zadziała:
    znalazłem taki kod:
    MCUCR = MD; // Turn on JTAG via code
    MCUCR = MD;

    tylko czy on nie musi być także użyty podczas pierwszych czterech cykli? Nie chce zablokować uC
  • #4 16799237
    JarekC
    Poziom 32  
    Po pierwsze pytanie czy w ogóle wykorzystujesz interfejs JTAG?
    Jeżeli nie to możesz go wyłączyć przy pomocy FuseBits.

    JTAG może był wyłączany i włączany programowo w dowolnym momencie tyle że dwa kolejne zapisy do MCUCR muszą odbyć się w przeciągu 4 cykli zegara.

    Nie napisałeś w jakim środowisku programujesz i jakiego programatora/debuggera używasz więc trudno coś więcej podpowiadać.

    JarekC
  • #5 16799897
    mesh67
    Poziom 9  
    Środowisko Atmel Studio, programator Atmel ICE
    Czyli wpisywanie do MCUCR musze jakoś inaczej rozwiązać albo faktycznie fusebits
  • #7 16800307
    Konto nie istnieje
    Konto nie istnieje  
  • #8 16800990
    mesh67
    Poziom 9  
    JarekC napisał:
    Jeżeli nie wykorzystujesz innych ustawień związanych z MCUCR to po prostu dajesz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    JarekC


    Dając uC taki kod nie będę miał możliwości ponownego zaprogramowania?
  • #9 16801622
    Konto nie istnieje
    Konto nie istnieje  
  • #10 16807201
    mesh67
    Poziom 9  
    Dziękuje wszystkim za odpowiedź, kod który mu wpisuje działa. Problem był z obsługą ADC... ADC ładnie pracują ale bez deklaracji preskalera?
    Kod na którym mi porty działają to:

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



    Już wiem gdzie był problem w kodzie, także dziękuje wszystkim za odpowiedź :)
REKLAMA