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

[Atmega8] [Atmega8][C] - ADC nie działa z wewnętrznym Vref przy 3,428V na kanale 3

Dragas 15 Wrz 2012 14:21 1962 16
REKLAMA
  • #1 11313378
    Dragas
    Poziom 26  
    Witam

    Z zapasów wyciągnąłem kod do odczytu ADC i przerobiłem go pod aktualny układ.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz odczyt wartości
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Chciałem sprawdzić, czy wszystko działa dobrze, dając if'a ADC > 10, jednakże to nie działa :(
    Na wejściu ADC 3 jest 3,428V, a referencyjne ustawiłem jako wew, czyli około 5V. Skala ustawiona jest na 10 bitów (albo tak przynajmniej mi się wydaje).

    AVcc jest przez kondensator 100n do masy, Aref również. Taktowanie 1MHz, wew.

    Proszę bardzo o pomoc.

    Pozdrawiam
    Dragas
  • REKLAMA
  • REKLAMA
  • #3 11313455
    Dragas
    Poziom 26  
    Wstawiłem filtr 10uH, podłączony z jednej strony do Vcc, a z drugiej do Avcc. W konfiguracji ADC ustawiłem
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Niestety zmian nie ma :( Dalej nie działa.
  • REKLAMA
  • #4 11313510
    piotrva
    VIP Zasłużony dla elektroda
    tronics napisał:
    Cytat:
    referencyjne ustawiłem jako wew, czyli około 5V

    ~2.56V IIRC. AVcc do +5V przez filtr, albo jak komuś na extra dokładności nie zależy od razu 5V (Vcc), z drugiej strony ósemki i tak mają wewnętrznie to chyba połączone więc mało ważne.

    Nie wszystkie serie M8 mają to połączone. Bada to kol. Dondu. U mnie podczas pomiarów kilka m8 nie miało połączenia === warto podłączyć ja należy i nie mówić "m8 mają to zwarte na krzemie więc podłącz byle które vcc" itp.
  • #5 11313514
    tronics
    Poziom 38  
    Zobacz taki kod (łączy kilka funkcji, które napisałeś)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Bo imho to masz zły warunek wyjścia z ADCMeasure. Poza tym pisząc "2.56V" miałem na myśli wewnętrzne źródło napięcia referencyjnego , które o ile właśnie dobrze pamiętam wynosi 2.56V, jest jeszcze opcja z zewn. Vref, albo z podpięcie AVcc (co w tym modelu jest niemal równoznaczne z Vcc).

    @piootrva - przecież nie napisałem "to i tak jest w ósemkach wszystko jedno", a jak jest w moim wpisie każdy może przeczytać i zastanowić się "co autor miał na myśli", zresztą jest tam nawet "chyba" co oznacza, że 100% pewności brak.
  • REKLAMA
  • #6 11313691
    piotrva
    VIP Zasłużony dla elektroda
    @tronics, wolałem napisać, bo czasem początkujący i "szybcy..." przeczytają i potem się głowią parę dni dlaczego to nie działa.
  • #7 11314214
    dondu
    Moderator na urlopie...
    tronics napisał:
    Bo imho to masz zły warunek wyjścia z ADCMeasure.

    Warunek jest prawidłowy ponieważ autor korzysta z metody pooling'u flagi ADSC:

    Cytat:
    ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero. Writing zero to this bit has no effect.

    Ty wykorzystujesz natomiast flage przerwania sprawdzając ją także mteodą pulling'u. Nie do tego ta flaga służy, ale tak też można.

    @Dragas
    Korzystasz z zapisów sumujących bity |= , a jednocześnie nie pokazujesz całości programu. Dlatego nie jest możliwe sprawdzenie, czy czasem nie popełniasz błędu zapominania co w rejestrze już zmieniłeś pkt nr 3: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html

    Poza tym pokaż schemat.
  • #8 11314473
    tronics
    Poziom 38  
    Cytat:
    przeczytają i potem się głowią parę dni dlaczego to nie działa

    Rozumiem, sam przez to przechodziłem i wiem jak frustrujące to bywa.
    Cytat:
    Warunek jest prawidłowy ponieważ autor korzysta z metody pooling'u flagi ADSC

    Zgadza się, tak to bywa jak się nie ma noty pod nosem i korzysta wyłącznie z własnych, bardzo skromnych osiągnięć w tej dziedzinie. A jeszcze parę lat temu niemal na pamięć znałem większość rejestrów h8/300h ;)
    Prawdą jest, że skoro funkcje obsługi ADC są poprawne, to może gdzieś przy ich wywoływaniu coś niedobrego się dzieje. Szersze spojrzenie na pełny kod lub przynajmniej istotne fragmenty mogłoby pomóc.
  • #9 11314638
    zumek
    Poziom 39  
    tronics napisał:
    Zobacz taki kod (łączy kilka funkcji, które napisałeś)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Patrze na "taki kod" oraz równie bezsensowny jak np. "taki kod" ...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ... i zastanawiam się, jak WY chcecie okiełznać mikrokontroler, nie znając podstaw języka, w którym chcecie z nim ... rozmawiać.
    :cry:
  • #10 11314727
    tronics
    Poziom 38  
    @zumek - nie bardzo rozumiem o co chodzi - kod który podałem nie jest mojego autorstwa, natomiast ztcp u mnie działał, a że można to zwinąć do jednej linijki C to mało ważne, bo w większości przypadków optymalizacja i tak zrobi swoje. Guru nie jestem, ale różne konstrukcje oglądałem w wersji skompilowanej i jakiś szczególny ascetyzm/pedantyzm przyjęty z SDCC akurat w AVR niekoniecznie sprawdza się równie efektownie.
  • #11 11314848
    dondu
    Moderator na urlopie...
    Jak słusznie zauważył kol. Zumek

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

    W ten sposób nie wyzerujesz bitów ponieważ (patrz pkt 1.5): http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html

    Choć w tym przypadku to może nie mieć znaczenia, bo te bity i tak są zerami na starcie. Ale to zależy jak wykorzystujesz zdefiniowane funkcje - czekamy na więcej kodu.
  • #12 11315304
    Konto nie istnieje
    Konto nie istnieje  
  • #13 11315328
    dondu
    Moderator na urlopie...
    kaamil1984 napisał:
    Co do połączenia między Avcc i Vcc wewnątrz atmega8 - nie ma tu czego badać. Niektóre serie mają między tymi pinami rezystancję 6ohm, a niektóre mają rzędu megaohmów, możecie sprawdzić omomierzem na odłączonym mikrokontrolerze.

    Dokładnie tak jak piszesz - zebrałem sporo pomiarów od wielu życzliwych forumowiczów, ale brak czasu na ich opracowanie. Na oko 95% ma rezystancję rzędu od kilku- do kilkudziesięciu Ω, pozostałe 5% to prawidłowe kilka MΩ. Niestety nie zależy to od daty produkcji. Być może od nr zakładu, ale o te dane nie prosiłem.

    A żeby było śmieszniej, to gdy zapytałem support Atmela, co oni na to, to zrobili coś takiego: 8-O
  • #15 11315993
    zumek
    Poziom 39  
    tronics napisał:
    @zumek - nie bardzo rozumiem o co chodzi...

    A szkoda, bo ten fragment kodu który przytoczyłem, jest błędny.
    Poniżej wersja "naprawiona" :D
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przyczyną mojej "interwencji" jest:
    Regulamin p 3.1.11.
  • #16 11316287
    drzasiek
    Specjalista CNC
    zumek napisał:

    A szkoda, bo ten fragment kodu który przytoczyłem, jest błędny.
    Poniżej wersja "naprawiona" :D
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ale taki kod to straszliwe marnowanie czasu.
    Skoro i tak trzymamy w jakiejś 8 bitowej zmiennej numer kanału, to czemu nie wykorzystać całej zmiennej zapisując w niej rejestr ADMUX?
    Wtedy w funkcji ReadADC() zamiast 3 linijek
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    mogłaby być jedna:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jako argument funkcji podaje się zmienną 8 bitową, więc w niej po prostu na starcie programu wpisać na sztywno bity 7:5, a zmieniając kanał zmieniać tylko bity najmłodsze.
  • #17 11316531
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA