Witam,
Tym razem króciutko, zapraszam na kolejną czyli trzecią już część poradnika do ADC. Zgodnie z zapowiedzią tym razem zajmiemy się już kodami źródłowymi, nie mniej jednak jak to zwykle bywa zanim powiem o ADC poruszymy temat np najprostszej komunikacji (i to tylko wysyłanie) przez RS232. Związane jest to z tym, że chciałem uprościć sobie konstrukcję układu testowego na płytce stykowej i mam nadzieję, że przy tej okazji przekonam ciebie także do tego aby coraz częściej korzystać z terminala przy wszelkich pracach z mikrokontrolerami. Natomiast poprzez to, że zastosuję prostą bibliotekę do terminala jako LCD, którą przedstawiłem na moim blogu, chciałbym zwrócić uwagę - że może być wam jednak ciężko użyć do takiego ćwiczenia innych terminali niż PUTTY, którego ja z lubością używam. Wiem, chociaż nie rozumiem, dlaczego wielu z was zamiast z putty korzysta z innych prostszych terminali, to okaże się właśnie że ta większość innych nie potrafi obsługiwać standardu VT100 :( .... a pokażę wam przy okazji najbliższych poradników że korzystanie z tych właściwości VT100 na prawdę dużo daje i postaram się was tym "zarazić" ;) A przecież zobaczycie że mając taką gotową biblioteczkę to korzystanie z tego staje się banalnie proste ;)
zapraszam na film (rozdzielczość HD 1280x720) w moim kanale: www.youtube.com/mirekk36
Uwaga! przed zażyciem skonsultuj się z lekarzem lub farmaceutą.
Film trwa dwie godziny!
Może wywoływać senność, chrapanie, drganie powiek, wzmożoną ochotę na sok jabłkowy itp
;)
Jak zwykle świetna robota!
OdpowiedzUsuńMożna się czegoś nauczyć i pośmiać przy okazji :D
Narobiłeś mi smaku na sok :)
Czekamy na dalsze części!!
dzięki za dobre słowo
Usuńeeeeh wkręcił mi się ten sok jabłkowy ;) i później musiałem go jakoś tuszować ;)
22:05 - Mireosław Karaś :>
OdpowiedzUsuńNo tak to się ciągnie za mną jak .... wiadomo co ;) często taką literówkę robię
OdpowiedzUsuńSzczerze mówiąc to nawet nie wiedziałem kiedy mi te 2 godziny minęły :) Mam jeszcze pytanie odnośnie filtracji zasilania. Czy nadmiar kondensatorów filtrujących może również przeszkadzać w pomiarach ADC jak ich brak?
OdpowiedzUsuńAle masz na myśli te w filtracji zasilania VCC i GND a nie ew te na linii pomiarowej ADC ?
Usuńbo jeśli chodzi o filtrację zasilania to co masz na myśli mówiąc nadmiar ;) nadmiar kondków 100nF nigdy nie zaszkodzi - wręcz odwrotnie. Tylko z elektrolitem nie ma co przesadzać bo zaszkodzić nie zaszkodzi ale też nie pomoże - po porostu szkoda wkładać za duże niepotrzebnie elektrolity.
Tak miałem na myśli te w filtracji zasilania. To już wiem, że zwykłe kondensatory 100nF można spokojnie wrzucać. Rozumiem, że na liniach pomiarowych też trzeba wrzucić jakieś kondensatory. Tylko jakie i ile ? :)
UsuńNie nie na liniach pomiarowych ADC to spokojnie i uważnie - przecież mówię o tym w poradniku. Jeśli badamy wolno zmienne napięcia - czyli np okresowo napięcie akumulatora czy baterii to tak można dać taki mały filtr jak mówię w poradniku z tych dwóch rezystorów i kondka 1nF / 10nF
Usuńale można nawet i zamiast tego dać po prostu kondensator 100nF .....
ale tu żadne tam jakieś większe ilości ;)
a gdybyś chciał badać jakieś szybko zmieniające się napięcie to chyba rozumiesz że taka pojemność mogłaby wręcz zakłócać pomiar. Wtedy wręcz nie można dawać - żadnego dodatkowego kondensnatora na linii ADC
Na liniach sygnałowych można zastosować przewody ekranowane w celu zmniejszenia zakłóceń.
UsuńTe poradniki są genialne, zwłaszcza dla takich początkujących jak ja. Dużo się z nich uczę - dziękuję.
UsuńJanusz
Ja miałbym jeszcze pytanie odnośnie Vref. Jeżeli mam np. procesor ATmega328P gdzie jego Vref=1,1V, to rozumiem że bez względu na to czy go zasilę z 5V bądź z 3,3V to Vref powinno być zawsze takie samo?
OdpowiedzUsuńNo a jak mogłoby być inaczej ? ;) po to są napięcia odniesienia wbudowane .....
UsuńSzanowny Panie Mirku,
OdpowiedzUsuńPorusza Pan w przygotowanym materiale kwestie RS232. Nie rozumiem dlaczego pan mówi że do przesyłania danych do komputera z mikrokontrolera wystarczy przejściówka RS232-USB. RS232 jest standardem przesyłania. Napięcia panujące na liniach sygnałowych mogą zmieniać się w granicach od -15V do 15V. Do tego celu wykorzystuje się układ scalony max232 firmy maxim który jest w stanie wytworzyć takie napięcie poprzez pompę ładunkową.W mikrokontrolerze mamy wbudowany interface USART/UART. Jak to się teraz do siebie ma? Nie umiem tego zrozumieć. Czy te przejściówki RS232- USB mają w sobie taki układ jak max232?
Kolega myśli o starym - archaicznym już poniekąd porcie COM w komputerach, pracującym właśnie w standardzie RS232 i posługującym się że tak powiem napięciami z zakresu jakie podałeś. Masz także rację, że do tego stareńkiego portu korzysta się ze scalaka MAX232. To JEDNO.
UsuńAle chyba nie wiesz o DRUGIM o wiele wygodniejszym na dzień dzisiejszy rozwiązaniu. Ba! przecież w wielu kompach już nawet nie ma starych portów COM - więc jak myślisz ? to wtedy co ? koniec? amba zjada komunikację RS232? ;)
Nie ... wtedy się właśnie stosuje przejściówki USB/RS232 i to najlepiej takie pracujące przynajmniej w standardzie TTL .... rozumiesz ? wtedy żaden MAX232 nie jest potrzebny - po co ? Ot podłączasz przejściówkę do USB, w kompie tworzy się virtualny port COM, a po jej drugiej stronie masz piny Rx i Tx gotowe wprost do podłączenia do pinów procka bo działają w TTL ....
jak nie możesz sobie tego wyobrazić - to postaraj się rzucić okiem na notęPDF super przyjemnego scalaczka FT232R ... ok ? Wtedy WSZYSTKO ci się rozjaśni
ale jak nie to śmiało pytaj dalej
Rozjaśniła mi sprawę nota PDF. Rozumiem że do FT232R podajemy sygnał prosto z UARTa który pracuje na poziomach napięcia TTL. Poprzez FT232R dane dochodzą do USB. Jednak tu nie mam nigdzie standardu RS232 ponieważ ten standard określa odpowiednie poziomy napięć i konstrukcji urządzeń. Na rysunku 7.1 noty jest schemat pokazujący "RS232 level converter" który napięcia z RS232 dostosowuje do poziomu TTL. Następnie są one podawane do FT232R. Dlatego uważam że używanie nazwy RS232 jest błędne. Zgodzi się Pan zemną?
UsuńAbsolutnie się nie zgodzę ;) i proponuję nie wymyślać nowych teorii - skoro już dawno takie coś istnieje. Wystarczy się na prawdę wokoło rozejrzeć ok ? ;)
UsuńTy mylisz panie kolego i to dosyć mocno standard sprzętowej warstwy komunikacji RS232 (bo tu jest mowa o zakresach napięć o jakich mówisz) z jej implementacją logiczną/programową ;) ... poczytaj sobie tutaj o standardzie komunikacji RS232 .... i z tego powodu nie można się zgodzić z twoją teorią - że nie można używać nazwy RS232 przy takiej przejściówce, bo kompletnie mieszasz pojęcia.
Za pomocą takiej przejściówki nadal komunikujemy się z komputerem za pomocą starego jak świat standardu komunikacji RS232 ;) .... a nie USB przecież.
tłumaczyłem ci wyżej - i tu masz rację, że od procka USART idzie do pinów TTL układu FT232 a dalej ? a dalej panie kochany to już firma ftdichip ;) zadbała o to aby te dane dotarły do kompa na virtualny port szeregowy. Gdzie od strony kompa niczym on się nie różni od strony użytkowania - w porównaniu do starego leciwego portu fizycznego COM
teraz jaśniej ?
Faktycznie, jeżeli spojrzeć od strony komputera dane które przychodzą poprzez USB niczym się nie różnią od tych przychodzących poprzez port COM, są tak samo interpretowane.
UsuńJednak w warstwie sprzętowej ten standard nie jest wykorzystywany. Fizyczne przejście na RS232 zapewnia nam "RS232 level converter".
Strasznie zamotałem bo w dużej części literatury (starszej) jest mowa o tym MAX232 itp. Z tego też powodu nie było dla mnie to zrozumiałe.
Dziękuję za udzielenie wyczerpujących wypowiedzi oraz za wyrozumiałość:)
Po analizie materiału filmowego:
OdpowiedzUsuńZ niepokojem czekam na przejściówkę USB-RS232;
oraz stwierdzam iż sok jabłkowy był „konieczny-niezbędny”:
człowiek sam jeden zamknięty przez 2h produkuje się i tłumaczy „komputerowi” jak działają jego mniejsi bracia.
Dziękuję i Pozdrawiam.
A dlaczego z niepokojem kolega czeka na przejściówkę ? czyżby obawa że będzie z nią coś nie tak ? chyba że coś źle zrozumiałem - ale postaram się, żeby była na prawdę dobrej jakości ;)
UsuńZa to przez kolegę to dopiero teraz rozmasowałem sobie przeponę ze śmiechu ;) z tego:
"tłumaczy komputerowi jak działają jego mniejsi bracia"
hahahaha SUPER ;) ...
Po pierwsze: to o jakość się nie boję – po prostu przydałaby się: będę cierpliwy i poczekam jeszcze (troszeczkę) - taka dodatkowa mała motywacja do działania.
UsuńCo do drugiego: jak przyjrzeć się temu z boku to to tak wygląda.
Jednoosobowe studio filmów pełnometrażowych edukacyjno-naukowych.
Do Hollywood jeszcze trochę brakuje (efektów specjalnych), ale do Bollywood to już całkiem blisko.
Pozdrawiam.
Panie Mirku. Dziękuję za to że pan - taki Mistrz i fajny gość będzie mnie teraz uczył działania mikrokontrolerów.
OdpowiedzUsuńUmiem język Java ale C naucze się z Pana książki.
W domysle mam cheć zaimplementowac algorytm sieci neuronowych, który już zaprogramowałem w javie. Dodam też że z trudem znalazłem pana stronę po niebywałej walce z internetem :P
Prawdopodobnie kupię zestaw dla początkujących - czy może pan jakis polecić do 400 zł i link do niego?
Pozdrawiam M. & godBlessU :)
No niezmiernie mi miło, że mogę pomóc swoimi poradnikami czy książkami ;) Naturalnie w razie pytań jestem do dyspozycji. Jeśli zaś chodzi o zestaw do nauki to myślę, że spokojnie mogę polecić coś z naszego sklepu internetowego, proszę zapoznać się z ofertą na:
Usuńwww.sklep.atnel.pl
a gdyby były jakieś dodatkowe pytania to proszę śmiało pisać do mnie na maila - zawsze chętnie pomogę.
Witam! W tym poradniku porusza Pan kwestię zabezpieczenia wejść mikrokontrolera. Bardzo się z tego cieszę, ponieważ do tej pory nigdzie nie znalazłem konkretnej odpowiedzi na to pytanie. Czy mógłbym uzyskać jeszcze odpowiedź dlaczego akurat takie? Tzn. w jakim celu stosuję się tak połączone diody schottky'ego, rezystory razem z kondensatorem oraz wtórnik napięciowy. Pozdrawiam.
OdpowiedzUsuńWitam, no a jak kolega myśli przed czym mogą być tu jakiekolwiek zabezpieczenia ? No chyba przed niczym innym jak przed "przepięciami", które mogą się pojawiać w zależności oczywiście od tego w jakimś środowisku pracuje taki przetwornik oczywiście.
UsuńKtoś ostatnio na forum naszym zadał pytanie typu:
"czy jeśli będę mierzył napięcia w zakresie 0-2V, to także muszę używać tych zabezpieczeń? skoro nigdy nie pojawią się wyższe?"
no i tu jak w soczewce skupia się niezrozumienie tematu czym są przepięcia. To nie chodzi o to że np gdy będziemy mierzyli napięcia w wyższym zakresie np 0-32V to muszą być - bo przecież - no widać w poradniku, że i tak jest dzielnik napięcia - a zatem na procka i tak trafi 1,1V, albo 2,56V albo 5V max w zależności jakie źródło odniesienia wybierzemy i oczywiście czy dobrze dzielnik podłączymy. To nie są zabezpieczenia przed tym, że ktoś się pomyli z dzielnikiem ...
Taki mocno uproszczony przykład powiem. Jeśli będziesz badał napięcia np w instalacji samochodowej - np 0-12V, to MUSISZ się liczyć z możliwością występowania szpilek ogromnych przepięć z uwagi chociażby na charakter pracy alternatora i w ogóle dużego poboru prądu podczas przełączania różnych urządzeń. Środowiska samochodowe są przykładem gdzie występują bardo trudne warunki pracy procków pod tym względem. Dlatego też przecież są specjalne układy scalone wypuszczane w tzw seriach "automotive" czyli specjalnie podrasowane na zakłócenia ale też niedostępne cenowo dla amatorów.
Za to jeśli będziesz się bawił w domciu z bateryjką czy jakimś zasilaczem i do projektowanego urządzenia nie będzie np zależało czyjeś życie ;) (tu troszkę żartuję) ... to po choinkę ci zabezpieczenia. Przecież widziałeś że w poradniku robiłem wszystko bez nich.
Dlatego wspomniałem o tych zabezpieczeniach ale też dodałem żeby nie popadać w panikę i zaraz nie dowalać ich w każdym wypadku albo wszystkich naraz.
Np wtórnik napięciowy jest bardzo dobrym zabezpieczeniem ale i jego wejście także często zabezpiecza się dodatkowo dwoma diodami shottky.
Reasumując - kiedy i jakie wybrać zależy od (przede wszystkim) zdrowego rozsądku. Mam nadzieję, że teraz troszkę jaśniej?
Podczas transmisji w terminalu putty wyświetlają mi się inne litery niż przesyłam z atmegi8. Np jak wysyłam 'a' to wyświetla się '0' co może być tego przyczyną ...?
OdpowiedzUsuńPrzyczyną może być hmm na pewno jest to że nie dopasowałeś prędkości uart baudrate. Np nie przestawiłeś prawidłowo fusów w procku, albo różne prędkości ustawiłeś w terminalu i procku ... jak widzisz możliwości jest sporo
UsuńCzy ten wzór jest poprawny dla procesora taktowanego prędkością 1MHz? Zrobiłem jak w ćwiczeniu tylko nie zmieniałem fusbitów na 8MHz - i wyświetlało inne znaki. Próbowałem różnych ustawień w Putty i za każdym razem to samo. W końcu postanowiłem przeprogramować fusbity na 8MHz i pięknie działa.
UsuńCo trzeba poprawić we wzorze, żeby działało z każdą prędkością procesora?
Może to ma znaczenie, a może nie, ale mam programator STk-500v2 oraz sprawdzałem na 2 kablach podłączonych do DB9 w komputerze.
1 - prosty zrobiony na MAX232
2 - oryginalny kabel do programowania central alarmowych firmy SATEL z TTL. Na obu tych kablach przy 8MHz działa prawidłowo. Przy 1MHz niestety nie.
Jaki wzór ? co masz na myśli ?
Usuńchodzi mi o ten z Poradnika: "RS232 UBRR - jak prawidłowo obliczać - TRICK"
Usuń#define UART_BAUD 9600
#define __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)
Sprawdzałem dla prędkości 9600, 19200 i przy 1MHz nie odczytuje prawidłowo a przy 8MHz jest wszystko OK. Sprawdzałem kilka razu kod Inicjalizacji UART i jest zgodny z tym poradnikiem. To że działa z prędkością 8MHz tzn że wzór jest dobry dla tej wartości, a dla 1MHz jest coś nie tak. Tylko nie wiem jak to sprawdzić co jest nie tak.
a to dlaczego niby miałoby nie działać dla 1MHz ? ;)
UsuńTylko najpierw to musisz pan zwrócić uwagę jakie prędkości możesz wykorzystywać w RS232 dla ŚLIMACZEGO taktowania 1MHz ;)
ty pewnie strzeliłeś sobie jakiś wysoki baudrate i oczekujesz cudów przy 1MHz
a zajrzyj że do noty PDF procka na ostatnią stronę rozdziału USART - tam są tabelki ... pierwsza pozycja to wartości i procenty błędów akurat dla 1MHz - i zobacz na jakiej prędkości masz błąd mniejszy równy 2,5% ????? no dla jakiej prędkości baudrate ?
Wtedy zrozumiesz o co chodzi i jak się dobiera prędkości do częstotliwości taktowania i dlaczego takie kwarce jak np 11,0592MHz są nazywane przyjaznymi dla RS232 ;) zajrzyj sobie dalej w tych tabelach do tej częstotliwości i spójrz na rubrykę błędów dla dowolnej prędkości
teraz jaśniej ? ;)
Dziękuję za wyjaśnienia i ma Pan jak zwykle rację.
UsuńDla U2X=0 błędy (bezwzględnie) są na poziomie 7,0% i 8,5%
Ale gdyby zastosować Asynchronous Double Speed
Mode (U2X=1) to dla 9600 błędy byłyby na poziomie 0,2%.
Dla prędkości 2400 i 4800 dla obu U2X są na poziomie 0,2%.
Ale raz jeszcze dziękuję = poradnik jest świetny = i idę do kolejnej lekcji.
Co do prędkości wewnętrznego oscylatora to mi jest obojętne czy chodzi na 1MHz czy na 8MHz - więć jak na tej drugiej działa to się cieszę, ale w fazie nauki chciałem wyjaśnić wszystkie wątpliwości.
Ale swoją drogą to dla błędów na poziomie 8,5% powinien przynajmniej 8 wyników na 100 pokazać a nie pokazał ani jednego prawidłowego przez całą godzinę co sprawdzałem.
Przyczyną była wadliwa przejściówka rs232 , kupiłem inna tym razem na układzie ft232 i wszystko pięknie działa :)
OdpowiedzUsuńI o to chodzi ;)
UsuńRewelacja. Po co mi głupie filmy ZUSA. Wolę Mirka i całe te forum.
OdpowiedzUsuńDoskonałe poradniki, rozpływam się. Pozdrowienia Panie Mirku!!!
OdpowiedzUsuńNie mogę oprzeć się aby zadać pytanie dlaczego procesor wykonuje ten program z zablokowanym sei()???
OdpowiedzUsuńU mnie ten przykład ruszył dopiero po ustawieniu sei()
przed wysłaniem czegokolwiek do terminala. Z zablokowanymi przerwaniami program sie wieszał.
To zależy z jakiej biblioteki do wysyłania danych przez UART korzystasz. Jeśli wysyłanie bezpośrednie bez udziału przerwań to chyba jasna sprawa, że sei nie jest potrzebne hmmm ? A jeśli biblioteka z przerwaniami - no to .... potrzebne sei ...
UsuńAle szybka odpowiedź Panie Mirku aż mnie zatkało.
UsuńPrzerabiając ten przykład skorzystałem z MKUART.c.h zamiast tworzonej tu MYUART.c.h Biblotekę uzupełniłem
o obsługę putlong i dodałem nowy wzór na obliczanie __UBRR. Kompilowało się bez błędów ale przerwania musiałem załączyć aby program zadziałał. Dalej nie wiem dlaczego konieczne było uruchomienie przerwań..
Jeśli skorzystałeś z biblioteki z książki no to jeszcze raz powtarzam, ona używa przerwań - więc nie za bardzo mogę zrozumieć, dlaczego ty się dziwisz, że bez sei() się zawiesza ? Wiesz co to sei() ? czy nie wiesz ? ... no przecież to globalne zezwolenie na przerwania właśnie.
UsuńFaktycznie. Nie zauważyłem, że w tej biblotece jest zainkludowany plik przerwań avr/interrupt.h . Teraz jasne. Dzięki za grzeczne wyjaśnienie i dobranoc.
OdpowiedzUsuńmam pytanie jeśli uruchomiłem przetwornik adc i na nóżce wybranej np pc5 nie mam nic podpięte i przyjmijmy że mam wykonaną filtracje zasilania powinno być 0 a nie jest w tym momencie w terminalu pojawia się wartość ok 500 a zmierzona miernikiem na nóżce wartość to 1,02v wartość 0 pojawi sie dopiero po podłączeniu do masy przez rezystor. Czy to jest normalny objaw?
OdpowiedzUsuńPoczytać musisz sobie co to jest stan nieustalony na wejściu (Stan wysokiej impedancji, stan HI-z) wtedy zrozumiesz dlaczego to jest normalny objaw, że napięcie jak to się mówi "pływa" i na drugi raz nie będziesz zostawiał wiszącego wejścia jako wejścia ADC.
Usuńmam problem z biblioteką którą pokazywał pan na odcinku, podczas jej kompilacji wyświetla mi się dłąd: (00:12:01 **** Incremental Build of configuration Release for project adc_nauka ****
OdpowiedzUsuńmake all
'Building file: ../MYUART/myuart.c'
'Invoking: AVR Compiler'
avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=8000000UL -MMD -MP -MF"MYUART/myuart.d" -MT"MYUART/myuart.o" -c -o "MYUART/myuart.o" "../MYUART/myuart.c"
../MYUART/myuart.c: In function 'uart_init':
../MYUART/myuart.c:18:2: error: 'UBRRH' undeclared (first use in this function)
UBRRH = (uint8_t)(_UBRR>>8);
^
../MYUART/myuart.c:18:2: note: each undeclared identifier is reported only once for each function it appears in
../MYUART/myuart.c:19:2: error: 'UBRRL' undeclared (first use in this function)
UBRRL = (uint8_t)_UBRR;
^
../MYUART/myuart.c:20:2: error: 'UCSRB' undeclared (first use in this function)
UCSRB = (1<<TXEN);
^
../MYUART/myuart.c:20:14: error: 'TXEN' undeclared (first use in this function)
UCSRB = (1<<TXEN);
^
make: *** [MYUART/myuart.o] Błąd 1
00:12:01 Build Finished (took 184ms) )
wydaje mi się że całość zrobiłem dobrze i nie wiem co zrobić
zauważyłem co mam źle bo to nie jest biblioteka pod moją atmegę ale dalej kiedy próbuję ją zmodyfikować albo użyć tej z noty katalogowej to dalej mam problemy
Usuń