środa, 30 marca 2011

Nieudokumentowane funkcje niektórych AVRów

1 kwietnia 2014r.

Autor: Dondu

Prowadząc z supportem Atmela korespondencję w zakresie problemów mikrokontrolera ATmega8 związanych z wewnętrznym zwarciem pinów Vcc i AVcc (występujęce w niektórych wersjach i partiach tego mikrokontrolera), dowiedziałem się bardzo ciekawej rzeczy.

Część mikrokontrolerów AVR w przypadku przetwornika ADC zawiera układ pozwalający na pomiary różnicowe oraz wzmacniacz sygnału. Przykładem takiego mikrokontrolera jest ATmega128:





Wybór trybu różnicowego i włączenia wzmacniacza odbywa się poprzez rejestr ADMUX w następujący sposób:


ATmega128


Zauważ, że zaznaczone kolorem zielonym ustawienia rejestru ADMUX rozpoczynają się od 01000 i kończą na 01111. Różnią się one od pozostałych ustawień wartością bitów MUX3 oraz MUX4.

Porównując to do ADMUX ATmega8:


ATmega8


oraz ATmega 88


ATmega88


zauważysz, że prawie w całości obszar ten jest zarezerwowany, ale bit MUX3 oczywiście osiągalny (możliwe jego ustawianie i zerowanie):




Informacje uzyskane z supportu Atmela były dość nieoczekiwane:

Okazuje się, że w prawie każdej wersji mikrokontrolerów, w których w dokumentacji nie ma informacji o trybie różnicowym oraz o wzmacniaczu sygnału, faktycznie ten tryb i wzmacniacz występują.

Dlaczego więc brak o nich informacji?

Support stwierdził, że są to błędy (niedopracowania) projektowe we wstępnych wersjach tych układów, powodujące nieprawidłowe działanie wzmacniacza, a konkretnie znaczne wykraczanie poza parametry. Błędy te pozostały na matrycach produkcyjnych do dziś! Na moje pytanie dlaczego lakonicznie stwierdzili, że było to także związane ze strategią marketingową Atmela.

Idąc tym tropem dokonałem testów posiadanych wersji ATmega8 i ATmega88.


ATmega8-16PI, 0503I, od spodu: 4L1820, 355POI, 4-P0503; obudowa: DIP
To najstarsza ATmega w moich zbiorach.
MUX3:0 Kanał lub różnicowe Wzmocnienie Rezultat
1000 ADC0 10x Poprawnie
1001 ADC1-ADC0 10x Poprawnie
1010 ADC0 200x Brak reakcji na wzmocnienie
1011 ADC1-ADC0 200x j.w.
1100 ADC2 10x Poprawnie
1101 ADC3-ADC2 10x Poprawnie


ATmega8A-PU, 1136, od spodu: H6L732-2, 354VAN, 6-P1136, e3; obudowa: DIP
MUX3:0 Kanał lub różnicowe Wzmocnienie Rezultat
1000 ADC0 10x Poprawnie
1001 ADC1-ADC0 10x Poprawnie
1010 ADC0 200x Pomiary kompletnie z kosmosu
1011 ADC1-ADC0 200x j.w.
1100 ADC2 10x Poprawnie
1101 ADC3-ADC2 10x Poprawnie


ATmega8A-AU, 1116, od spodu: H6L099.06, 354VAN, 3-P, 1116, e3 obudowa: TQFP
MUX3:0 Kanał lub różnicowe Wzmocnienie Rezultat
1000 ADC0 10x Poprawnie
1001 ADC1-ADC0 10x Poprawnie
1010 ADC0 200x Pomiary kompletnie z kosmosu.
1011 ADC1-ADC0 200x j.w.
1100 ADC2 10x Poprawnie
1101 ADC3-ADC2 10x Poprawnie


ATmega88-PU, 1028; od spodu: G5K112, 27HON, 3-S1028, a0; obudowa: DIP
MUX3:0 Kanał lub różnicowe Wzmocnienie Rezultat
1000 ADC0 10x Poprawnie
1001 ADC1-ADC0 10x Poprawnie
1010 ADC0 200x Całkiem nieźle poniżej 0,1V, ale wyżej to tragedia
1011 ADC1-ADC0 200x j.w.
1100 ADC2 10x Poprawnie
1101 ADC3-ADC2 10x Poprawnie


Do pobrania

Poniżej do pobrania pliki HEX dla transmisji szeregowej przez RS-232:
  • F_CPU 1MHz
  • baud 9600
  • bez parzystości
  • jeden bit stopu

Jak ustawić terminal Realterm, by odbierać dane znajdziesz w tym artykule: RS-232: Komunikacja ATmega8 z komputerem (Uwaga! Tam ustawiam baud na 57600, a tutaj wykorzystuję 9600 - reszta jest taka sama).

Pliki hex do pobrania (zajętość flash 3,4kB):



Schemat

Układ testowy podłączony według wersji 1.2.3 z tego artykułu: ADC - Dokładność vs podłączanie

Zasilanie 5V - istotne dla prawidłowych wyników!!!

Na wejściach ADC0-ADC3 podłączone potencjometry tworzące cztery dzielniki napięciowe, by móc badać różne napięcia i ich zależności, czyli podobnie jak to jest w tym artykule: ADC - Wstęp i uruchomienie tylko bez rezystora R5.



Wnioski

Jak zauważysz, w każdym z badanych mikrokontrolerów wzmocnienie 10x jest zawsze osiągalne i w mojej ocenie wystarczająco dokładne, by z powodzeniem je stosować. W przypadku wzmocnienia 200x jest znacznie gorzej i trudno opierać się na wynikach takich pomiarów.

Ponieważ jest to nieudokumentowana funkcjonalność niektórych mikrokontrolerów AVR, stąd też oczywiście nie powinno się jej wykorzystywać w projektach komercyjnych.

Nic nie stoi jednak na przeszkodzie, by w projektach hobbystycznych ją wykorzystać :-)


Masz czas, przetestuj i daj znać o wynikach

Tradycyjnie już jak w poprzednim przypadku dot. pinów Vcc i AVcc, także i tym razem czekam na rezultaty Waszych pomiarów i wniosków, w formie komentarzy do niniejszego artykułu. Pamiętaj, by podać dokładne oznaczenia układu zarówno z górnej, jak i dolnej strony.


Rezultat pracy programów
1 kwietnia 2014r.

6 komentarzy:

  1. Ja kiedyś znalazłem w AT90PWM3 jakieś dziwne rejestry, które w dokumentacji nie zostały opisane. Może też to jakieś cuda-wianki :)
    0x32 (0x52) MSMCR Monitor Stop Mode Control Register reserved
    0x31 (0x51) MONDR Monitor Data Register reserved

    OdpowiedzUsuń
  2. Ciekawe. Ale to chyba nie z okazji 1 kwietnia? :D

    OdpowiedzUsuń
  3. Ale się dałem nabrać! Świetny kawał ;D

    OdpowiedzUsuń
  4. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  5. Czasy 8bitowców mi się przypomniały. Nieudokumentowane funkcje grafiki (o których sami projektanci mogli nie wiedzieć), nieudokumentowane rozkazy asemblerowe...

    OdpowiedzUsuń