Ads_700x200

tme

wtorek, 16 lipca 2013

Przetwornik ADC w AVR - część 05

Witam,

No to zapinamy pasy bezpieczeństwa i jedziemy dalej Panie i Panowie z przetwornikami ADC. Dzisiaj szef kuchni poleca dwa dania dnia: "Free Running Mode - Soute", oraz lekko grilowany zewnętrzny przetwornik 18-bitowy (czyli potwór rozmiarów pikusia) MCP3421 ;) ale za to bardzo smaczny ;) Będzie się działo. Niestety poradnik to godzina i 40 minut ... więc tylko dla widzów o mocnych nerwach. Ale myślę, że śmiało mogę polecić. To będzie już przedostatnia część. I mam nadzieję, że sporo nowych rzeczy się wyjaśni. Nie obędzie się bez drobniejszych gaf z mojej strony - boć to wszystko na żywca leci, a nawet jednej dużej gafy - no ale jakoś udało mi się z niej wybrnąć na koniec i mam nadzieję bez uszczerbku dla widza. Nie przedłużam już, jak zwykle zapraszam na materiał HD, na moim kanale www.youtube.com/mirekk36 






Oczywiście poniżej kod źródłowy do całego ćwiczenia, który można pobrać:


;)

31 komentarzy:

  1. Nie jestem malkontentem tylko mowie że, pod koniec 23 minuty połączone są scieżki z dwóch kamer i mowa szanownego Mirka jest "niewygodna" ale to tylko to chcialem powiedzieć i bardzo podziękować z ten poradnik jak zwykle sie przyda :) dziekujemy Panie Mirku

    OdpowiedzUsuń
    Odpowiedzi
    1. O żesz kurka wodna :( sorki ... przepraszam .... że też tego nie zauważyłem. Babol przy montażu. Ale chyba w miarę słychać w tym fragmencie (ujęciu) głos wyraźnie prawda ? czy od nowa renderować całość ?

      Bardzo dziękuję za tą uwagę ... tylko strasznie ciężko teraz to poprawić ot tak sobie.

      Usuń
    2. Panie Mirku, nie ma sie co przejmować dobrze jest :) trzeba tylko nie co sluchawki wyciszyć zeby tylko jeden głos było słychac :) BezNerwów :)

      Usuń
    3. Nie , no zdenerwowany to jestem na siebie, że to mi umknęło ... eeeeeeś ;)kurka wodna

      Usuń
    4. Babole się zdarzają każdemu, kto nie pracuje ten nie popełnia błędów :) najgorzej teraz to naprawić pewnie pliki ważą niemało. DLA MNIE I TAK SUPER :*

      Usuń
  2. Panie Mirku ogladam film i pisze do pana na gorąco :) niech Pan sie nie przejmuje ale od minuty okolo 00:23:45 nie włączyła nam Pan widoku z monitora, i mowiąc nie wiem co sobie Pan tam na nim skrobie :)

    OdpowiedzUsuń
    Odpowiedzi
    1. No no - całe ujęcie jedno jest skopane - pisałem wyżej - sorki. :(

      Usuń
  3. A ja mam takie pytanie. Czy zmiana preskalera przetwornika ADC ma wpływ na częstotliwość występowania przerwania od ADC w trybie Free Running Mode?

    OdpowiedzUsuń
    Odpowiedzi
    1. No to chyba oczywiste, im wyższa częstotliwość i im krótszy czas konwersji tym szybciej będą się dokonywać pomiary ....

      Ale dlatego tym bardziej warto się zastanowić 10x zanim się podejmie decyzje o korzystaniu w ogóle z trybu FreeRuning bo można sobie "przedobrzyć"

      Usuń
    2. Nie zauważyłem na filmiku wpisu "ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // preskaler" i stąd miałem wątpliwość. Teraz o Free Running Mode wiem już chyba wszystko co trzeba.

      Dziękuję i pozdrawiam

      Usuń
    3. A jeszcze zapytam gdzie i za ile można nabyć MCP3421 ?

      Usuń
  4. Panie Mirku,
    Mam ogromną prośbę do Pana na poradniku nie widać jak korzystać z I2C. Może w nastepnym odcinku przypomniałby Pan jeszcze raz jak Pan z tego korzysta, jak podłączać sie do tej szyny i "adresować" itd. itp.

    OdpowiedzUsuń
    Odpowiedzi
    1. Ale jak mówiłem i zawsze powtarzam, to są poradniki do książek. I akurat WSZYSTKO na ten temat można znaleźć właśnie w książce:

      "Mikrokontrolery AVR Język C Podstawy programowania"

      http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

      tutaj za dużo miejsca zajęłoby mi od nowa omawianie wszystkiego na temat I2C :( przykro mi

      Usuń
    2. a ja chyba w tme.pl kupiłem ;)

      Usuń
  5. Witam,
    "Ustawimy sobie to razem na wizji" 00:27:30 a zaczyna się wcześniej z 2 minuty i aż do 33 minuty nie ma obrazu a w zasadzie to właściwego obrazu tylko zdjęcie z tła to między innymi ten fragment z podwójnym dźwiękiem, tłumaczysz a nie widać co.
    Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. O KURKA wodna - już wcześniej ktoś mi mówił że tam coś nie tak z dźwiękiem ale jest jeszcze gorzej :( Okazało się, że włączył się widok na cały ekran nie z tej kamery co trzeba bo ja w międzyczasie sporo pokazuję na ekranie i tak jak piszesz nie widać tego :(

      Całego filmu już nie poprawię ale na szczęście dopadłem CAŁY ten uszkodzony fragment i go zrenderowałem ponownie. Można już go obejrzeć na youtube.

      http://www.youtube.com/watch?v=L2Cp_7QohkI

      A w miejscu uszkodzonego jest INFORMACJA i link do POPRAWKI.

      BARDZO DZIĘKUJĘ za to zgłoszenie. No i przepraszam za kłopt.

      Usuń
  6. Chciałbym zapytać czy jedną z końcówek kondensatorów filtrujących części dotyczącej samego przetwornika ADC w atmega (np. od AREF, AVCC, filtrowania napięcia VCC z dławikiem), lepiej podłączyć do masy cyfrowej GND czy do masy analogowej AGND? Masę analogową prowadzę osobno od nóżki procesora do punktu GND stabilizatora napięcia, gdzie spotyka się dopiero z masą cyfrową.

    OdpowiedzUsuń
    Odpowiedzi
    1. ZDECYDOWANIE jeśli już jest prowadzona masa analogowa to wiadomo że kondki filtrujące też do tej masy analogowej a nie cyfrowej

      Usuń
  7. Czy można wykonywać pomiar wartości ADC z kilku kanałów ale w trybie pracy przetwornika "na żądanie"? W poradniku omówił Pan taką możliwość ale w trybie "Free runing mode" z użyciem przerwania od ADC. W procedurze obsługi tego przerwania realizowana jest zmiana kanału. A tak bez przerwań w trybie na żądanie da się?

    OdpowiedzUsuń
    Odpowiedzi
    1. A jak myśli kolega po co jest funkcja pomiar( kanał ) ???

      no już tego wydawało mi się, że nie trzeba wyjaśniać ;) ... no jakby nie można było na żądanie mierzyć z dowolnej ilości kanałów. Poza tym pokazuję to przecież dokładnie w kodzie

      Usuń
  8. Nie no wiem, że jest funkcja pomiar (kanal). Z tym, że zastanawiam się jak jej użyć do tego celu. To znaczy trzeba ją po prostu wywołać jedna po drugiej zmieniając tylko nr kanalu w funkcji? Np. coś takiego po uprzedniej inicjalizacji ADC (używam atmegi16):

    uint16_t wynik1 = pomiar(PA0);
    uint16_t wynik2 = pomiar(PA1);
    .......

    i wyświetlenie samej wartości ADC bez szczególnego formatowania:

    uart_putint(wynik1,10);
    uart_putint(wynik2,10);

    Czy w ogólnym zarysie to wystarczy? Czy musi być jakiś _delay między kolejnymi wywołaniami funkcji pomiar?

    OdpowiedzUsuń
    Odpowiedzi
    1. No jeszcze raz powiem ;) a jakże miałoby być inaczej niż tak jak napisałeś wyżej i niż tak jak ja to pokazuję w poradniku, zresztą nie tylko ja - wszędzie w internecie masz podobnie to pokazane.

      Delaye pomiędzy pomiarami ? a po co ? coś kolega nie zrozumiał do końca jak działa ta funkcja w środku ... no przecież tam jest pętla oczekująca na dokonanie pomiaru więc po co jakieś delaye ? one mogą być ale to już z innych powodów - zależnych od potrzeb projektu ale nie z powodu ADC

      Usuń
  9. Proszę mi dać wiarę, że wiem jak działa funkcja pomiar. jest tam warunek na zakończenie pomiaru. Z tym, że jeżeli nie stosuję _delay między kolejnymi wywołaniami funkcji z poszczególnymi kanałami (np. dwoma PA0 i PA1) to na terminalu widzę dwie jednakowe wartości ADC. PA0 mam podłączone do GND a PA1 do VCC. Wtedy widzę w terminalu

    1023 1023

    a czasami wpada wartość dla GND:

    0 0

    Jeżeli oddzielę te funkcje delayem np 200us to wtedy w terminalu widzę wartości prawidłowe ale w nie zrozumiałej dla mnie kolejności. Tam gdzie powinno być GND dla PA0 widzę wartość 1023 dla Vcc a w drugiej kolumnie dla PA1 widzę wartość 0 co odpowiadać powinno GND.Zapewniam, że do procka poszczególne kanały są odpowiednio podłączone jeżeli chodzi o podanie napięcia VCC czy GND. Poniżej kod w głównej pętli while do powyższego opisu.

    while(1){

    wynik1 = ADC_Pomiar(PA0);

    //_delay_us(200); //delay o którym mowa

    wynik2 = ADC_Pomiar(PA1);

    tr_cls(1);
    tr_locate(2,2);
    tr_attr( BOLD, YELLOW, BLACK );
    uart_putint(wynik1,10);

    tr_locate(2,20);
    tr_attr( BOLD, CYAN, BLACK );
    uart_putint(wynik2,10);

    _delay_ms(200);

    }

    Funkcja pomiar(kanal) wygląda taK:

    uint16_t ADC_Pomiar(uint8_t kanal){

    ADMUX = (ADMUX & 0xF8) | kanal;

    ADCSRA |= (1<<ADSC);

    //oczekiwanie na koniec pomiaru i wynik w postaci 16 bitowej
    while( !(ADCSRA & (1<<ADSC)) );

    return ADCW;

    OdpowiedzUsuń
  10. Wszystko już gra. Doszedłem. Błąd był właśnie w warunku oczekiwania na zakończenie pomiaru w funkcji pomiar(kanal).

    Zamiast

    while( !(ADCSRA & (1<<ADSC)) );

    powinno być

    while( ADCSRA & (1<<ADSC) );

    Dziękuję i pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. No tak powinno być:

      while( ADCSRA & (1<<ADSC) );

      ;) dokładnie tak jest w kodzie z poradnika

      Usuń
    2. Zgadza się Panie Mirku:) Tak jest w kodzie. Powiem Panu, że obserwuję forum i jego użytkowników. Widzę ich stopień zaawansowania w programowaniu AVR w C i jestem pod wrażeniem tej wiedzy. Zdaję sobie sprawę, że moje pytania mogą wydawać się śmieszne bo to sama esencja programowania. Jestem początkującym pasjonatem mikrokontrolerów i zdaję sobie sprawę jak wiele muszę się jeszcze nauczyć. Zaczynam również dostrzegać plusy używania języka C. Wcześniej próbowałem programować w Bascomie jednakże przestałem ponieważ faktycznie choćby organizacja kodu jest nieporównywalnie lepsza w C nie mówiąc o uniwersalności podejścia do problemu. Pomimo, że to co teraz próbuję robić to podstawy i elementarz, to jednak czuje się taką satysfakcję jeżeli samemu rozwiąże się nawet taki błachy problem:)). Jeszcze raz słowa uznania dla Pańskiego wkładu w przekazywanie wiedzy z tego zakresu, zarówno na forum, blogu czy w poradnikach. To niespotykane.

      Pozdrawiam,

      Usuń
    3. while brutalnie blokuje nam program dopoki nie skonczy pomiaru, ja zamiast tego uzywam ifa, w elsie mam pomiarowanie, if pusty.

      Usuń
  11. A można wiedzieć kiedy ukaże się ostatnia część ?? Bo na blogu nie mogę znaleźć ..:(

    OdpowiedzUsuń
  12. Witam,

    Czy pojawi się jeszcze przetwornik MCP3421 w sklepie ATNEL? Bo wiem, że wcześniej był a od jakiegoś czasu już go nie widzę w ofercie.

    Pozdrawiam

    OdpowiedzUsuń
  13. Witam, zauważyłem drobny błąd w filmiku 1:23:08 W niebieskiej tabelce pisze Pan, że do tego makra:

    ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
    tmp_wynik = wynik;
    }
    Potrzebne jest załączenie takiej biblioteki jednak nie mogłem jej znaleźć
    #include \avr/atomic.h/

    Poszperałem w googlach i znalazłem że plik nagłówkowy atomic.h znajduje się w innym folderze.
    #include \util/atomic.h/

    Nic wielkiego ale pomyślałem że może komuś się to przyda. A tak przy okazji to świetne poradniki wiele można się z nich nauczyć a i też czasem pośmiać i przez to że nie jest tak sztywno to i chce się je oglądać :)

    Pozdrawiam

    PS Zamiast nawiasów kwadratowych musiałem użyć \ / bo nie chciało pokazywać zawartości nawiasów :)

    OdpowiedzUsuń