Tak, tu popełniłem mały błąd chyba z rozpędu, przy takiej konfiguracji odczytujesz poprzedni kanał. Zamień: ADMUX = _BV(MUX0) | _BV(MUX1);// kanał ADC3 z ADMUX = _BV(MUX0); // Kanał ADC1 i wszystko powinno być ok. Czyli przy inicjalizacji startujesz adc z kanałem 1, dgy konwersja kończy się masz wynik w ADC jeżeli kanał = 1 to wartość z ADC trafia do...
Oj, AREF do masy? Czytaj: http://mikrokontrolery.blogspot.com/2011... Pierwsze uwagi do programu (tak na szybko): Zastanów się co znajduje się w rejestrze ADMUX po wykonaniu tych dwóch instrukcji w tej kolejności: [syntax=c]ADMUX = (1 << REFS0) | (1 << REFS1) ; // Napięcie odniesienia ADC, Vref 2.56V ADMUX = (1<<MUX0);...
Kanał 1 zdecydowanie nie tak się wybiera: ADMUX = 0b0000111; To ci wybiera kanał 7, w dodatku wyłącza wewn. Vref i musisz podać zewnętrzne na końcówkę Vref. Kolejny błąd: pomiar=(ADCH&512)|ADCL; ADCH & 512 da ci zawsze zero, bo ADCH jest 8-bitowy. Powinno być pomiar=ADC; Kolejne problemy to zmienne d1 i d2. Są 15-bitowe (bo ze znakiem), jak je przemnożysz...
Zwróć uwagę że w Twoim kodzie nigdzie nie podajesz informacji prockowi gdzie ma zmierzyć napięcie. Przed konwersją musisz w rejestr ADMUX wpisać numer kanału ADC. Robi to tą linijką programu: Korzystam z ADC0, domyślnie ustawione są na 0 czyli powinno się zgadzać. że ustawienie w tym wypadku jest domyślne jest błędne, choć kanał autor swoim programem...
W inicjacji adc jest sporo byków.Niepotrzebne przerwania , licznik (z których nie korzystasz ), brak vref(chyba ze wiesz jaka wartość jest domyślna).Do tego programiku powinno wystarczyć. void adc_init(void) { ADCSRA = (1 << ADEN); ADCSRA |= (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2);...
Do Autora wątku: Proszę. Nie taki diabeł straszny. Nie napisałeś jaki to procesor więc napisałem przykład dla Mega8. Funkcja odczytuje ADC(0-5) z włączony ADLAR czyli tylko osiem bitów. Wynik od 0 do 255. Zapewne działa nawet w symulatorze. To taki podstawowy. Można nie czekać a ustawić przerwanie, ale to pewnie jeszcze nie dla Ciebie :D Wpisz w Google...
OK, no to następne podejście z nadmiarowym kodem testowym odliczającym w kółko na ATmega8515 zamiast ADC - wyświetlanie bez zarzutu. Co do tego dziwnie wyświetlanego zera, to może masz zamienione a z g, b z f itp. W tej wersji łatwiej zapanować nad częstotliwością odświeżania segmentów - zbyt duża skutkuje podświetlaniem sąsiednich cyfr, zbyt mała -...
https://obrazki.elektroda.pl/5547853400_... Ten mały i prosty do wykonania projekt opiera się na prostym pomyśle - reprezentowania danych spektralnych sygnału audio na 32-pasmowym analizatorze widma audio. Aby uprościć konstrukcję układu do prezentacji tego widma, zamiast stosowanych zazwyczaj słupków diod LED autor proponuje zastosowanie...
Gdy jeszcze bawiłem się ATmegami , 328 przede wszystkim to żonglowałem kałami ADC w tajmerze. Co ileś tam przerwań, przykładowo 10, był odczyt ADC i zmiana kanału. Po nastepnych 10 przewaniach znowu odczyt ale już ze zmienionego kanału i zmiana na następny kanał. Działało to po prostu pewnie. Lepiej będzie to widać na przykładowym kodzie. Oczywiście...
Witam. Chcę przedstawić szopkę Bożonarodzeniową. http://obrazki.elektroda.pl/9749389200_1... Całość wykonana własnoręcznie z pomocą kochanej żonki. Opiszę co i jak. Szopka ma ruchomy żłobek, dwie pochodnie i ognisko, na filmikach wszystko widać. Opiszę konstrukcję, do sterowania wszystkim użyłem Atmegi8. Trzy sprzętowe kanały PWM posłużyły...
Problem został rozwiązany, wystarczyło na końcu procedury przetwarzania drugiego kanału ponownie włączyć pierwszy kanał ADMUX &=~_BV(1);
Jak już ustawisz rejestry przetwornika ADC to ich nie zeruj wszystkich, ustaw je przed pętlą główną a w funkcji wybieraj kanał ADMUX &= (0xF8 & kanal); i uruchom przetwornik ADCSRA |= (1<<ADSC); i czekaj w while na zakonczenie
Będzie działać, ale: [syntax=c]ADMUX &=0xF8; // <-- wybierasz kanał 0 ADMUX |= kanal; // <-- wybierasz docelowy kanał[/syntax] Powinieneś to zrobić w jednej operacji: [syntax=c]ADMUX = (ADMUX & 0xF8) | kanal;[/syntax]
A czy przy każdym żądaniu wybierasz odniesienie czy tylko zmieniasz kanał?
Tak się kończy uwielbienie dla operatorów |= i &= na rejestrach. Ja bym to zrobił tak: Najpierw definiujemy stałą - wzorzec bitowy tego, co ma być w ADMUX poza wyborem kanału, np. #define ADMUXVAL (1<<REFS0) a potem w programie, żeby wybrać sobie kanał, piszemy: ADMUX = ADMUXVAL | 4; albo ADMUX = ADMUXVAL | 5; W ten sposób: - skracamy program...
Witam, Przy pomiarze tylko jednego kanału jest ok. Nie przekłamuje wartości, wynik poprawnie wyświetlany na LCD. Jeżeli chce zmierzyć z 2 kanałów, zaczynają się cyrki. Jeden kanał przekłamuje wskazania drugiego. Jednego zewrę do masy, maxymalny wynik na drugim to polowa zakresu, zewrę do VREF, na końcówce pomiarowej wynik minimalny to polowa zakresu....
Witam. Pomiar dla pojedynczego kanału, który bym nie wybrał jest zawsze poprawny. Problem pojawia się gdy występuje multipleksowanie (zmiana kanału). Podejrzewam, że może być problem z przesłuchem od kanałów. Poniżej przedstawiam dwa kody: Proszę o pomoc bardziej doświadczonych forumowiczów o rozwiązanie problemu. Pomiar z wykorzystaniem pojedynczego...
Witam! Chcę zbierać pomiary z przetwornika ADC ATMEGA32 z trzech kanałów co określony czas (1,25ms) i wyświetlać je na LCD. Program napisany przeze mnie, niby działa poprawnie, ale pomiary z 3-kanałów są jednakowe, a przecież powinny być różne. Zaplanowałem, żeby zrobić to w następujący sposób: -ustawić ADC na generowanie przerwania w momencie zakończenia...
Próbowałem ustawić PINC jako niski ,wysoki lecz to powodowało jedynie wzrost napięcia. Znalazłem jakieś rozwiazanie które się sprawdza jak na razie. [url=http://www.dioda.com.pl/forum/topic... chodzi mi o fragment kodu dotyczący wybrania kanału dla prztwornika: // Wybór kanału wejścia - PC3 (ADC3) ADMUX |= _BV(MUX1)|_BV(MUX0);...
_marek- tak właściwie to działa. Bo jest jeszcze funkcja: //*****************************a tu funkcja zmieniająca kanały- definicja- to chyba też gaskoina void SetAdcKanal(void) { static uint8_t kanal; ADMUX = ((ADMUX&0xE0)+ kanal);//zmienić kanał napiecie[kanal++]=ADC_sr; // zapisać pomiar w tablicę if(kanal>=LICZBA_KANALOW)...
Witam ! Buduję układ detektora zapadów napięć oparty na analizie kąta fazowego. Metoda ta polega, w skrócie, porównywaniu napięcia sieciowego z wzorcowym. Układ buduję na mikrokontrolerze ATmega32. Chcem porównać dwa wejścia ADC aby uzyskać informację o procentowej zmianie napięcia względem napięcia wzorcowego. Informacja ta ma sterować współczynnikiem...
Mam problem z odczytem z większej ilości wejść w ATMega8. gdy czytam jedno to nie mam problemu, ale jak dwa to już mam problem. Przetwornik ustawiam tak: ADMUX = (1<<REFS1) | (1<<REFS0); // wewnętrzne Vref = 2,56V ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS0); // ADC włączony, przerwanie...
...proszę o sprawdzenie i korektę błędów z komentarzem... //--------------------------------------... // >>>>>>>>>>... V O L T O M I E R Z <<<<<<<<<<... //--------------------------------------... //##################...
Wystarczy w rejestrze ADMUX wybrać sobie kanał z którego chcesz pomiar. Opisane jest to na stronie 213 dokumentacji
Najlepiej wybierając kanał wpisuj wartość nie zastanawiając się jakie bity są ustawione, a jakie nie. Czyli dla REF-a wewnętrznego i wyrównania do prawej wybór kanałów będzie wyglądał tak: dla ADC0: ADMUX = 0; dla ADC1: ADMUX = (1<<MUX0); dla ADC2: ADMUX = (1<<MUX1);
Popełniasz błąd: [syntax=c]ADMUX=(ADMUX &~ (1<<MUX0) &~ (1<<MUX1) &~ (1<<MUX2)); //PORTA0 _delay_us(5); <<== Tutaj musi być kilka us zwłoki!!! ADCSRA|=(1<<ADSC); //aktywowanie konwerjsi while(ADCSRA & ADSC);[/syntax] Nie możesz startować konwersji natychmiast po zmianie kanału w ADMUX.
Oki ale co się dzieje z bitem ADIF (znacznik zakończenia konwersji)?? trzeba go gdzie zerować?? Z nocie jest napisane, że zakończenie operacji przetwarzania powoduje ustawienie znacznika ADIF. Czyli jak ustawimy nową konwersje czyli bit ADSC ustawimy w stan wysoki to automatycznie ustawia(kasuje) nam bit ADIF na 0?? Macie jakiś dobry patent na uśrednianie...
To nie jest wcale takie skomplikowane. Musisz włączyć zezwolenie na przerwanie od zakończonej konwersji. Wtedy kiedy wprowadzisz uC w stan Iddle albo Noise canceler start konwersji nastąpi automatycznie. Wyboru kanału/wejścia dokonuje się rejestrem ADMUX. Niestety jest w nim też wybór źródła napięcia odniesienia a nie pisałeś czego chcesz użyć. Każde...
... a nie czasem 0b01100000?? u Ciebie było 0xb11111000 0xb11111000 wygaszało 3 najniższe bity na już ustawionym ADMUX przez co jako pierwszy pomiar przed main() włączałem kanał nr 0. Ale jeżeli ustawiasz rejestr ADMUX w ten sposób to raz że najpierw podajesz że liczbę podajesz w systemie szesnastkowym, a później binarnym (0x - hex, 0b - bin). I ustawiając...
Jeżeli nie będziesz używał wejść różnicowych do pomiaru to możesz zastosować taką funkcję : void inline SetADCChannel(unsigned char channel){ ADMUX = (ADMUX & 0xE0) + channel; } możesz ewentualnie zabezpieczyć to ifem żeby w kanał nie wpisać wartości np 50
A w którym miejscu ustawiasz PA0 jako wejście? (DDRA&=~(1<<0)) lub w twoim kompilatorze wystarczy (clrb(DDRA, 0)). Według ustawień bitów REF0, REF1 masz wybrane zewnętrzne źródło napięcia odniesienia, podłączyłeś je (pod nóżkę PA3)? Do tego musisz wybrać w rejestrze ADMUX kanał z którego chcesz dokonać konwersji.
Chcałem prosić o poradę. Chcę zastosować ATMega8 i wewnętrzne przetworniki A/C. Pomair ma być dokonywany z dwóch kanałów. Ma to wyglądać tak że kanał jest podawany jako argument w funkcji (program w C). Np. unsigned int adc(unsigned char kanal); W nocie katalogowej czytałem ze pierszy pomiar po uruchomieniu przetwornika (wpisaniu do ADEN) zajmuje najdłużej...
....zaczyna mi to działać na nerwy...klawisze nie chodzą bo napisałem bzdury a nie procedury, już nie mam pojęcia jak to napisać a co dopiero powiązać to z LCD....i jeszcze ten adc który mierzy współczynnik pinokia choć kilka razy przerabiałem kod korzystając z przykładów na forum co jest nie tak ? nie wiem...porty porty 3 i 4 zwarłem na chwilę do masy...
Możesz napisać coś więcej o samej przetwornicy od strony programowej? W jaki sposób jest powiązany pomiar napięcia ze sterowaniem mosfetem? Regulujesz wypełnieniem PWM aby zmienić napięcie wyjściowe. W przetwornicy podwyższającej (boost, step-up) napięcie wyjściowe jest ściśle powiązane z wypełnieniem. Do wykonanie przetwornicy sterowanej prze procesor...
tak taktuje to na razie 1MHz, a czyli rozumiem po prosty za szybko przełączam kanały zanim skończy się przetwarzanie ja już zmieniam kanał i dlatego inne silniki reagują? Dodano po 2 później będę korzystał z innego procesora (atmega128) i ustawie to na 16MHz więc wtedy nie powinno być problemu ale dla pewności, że konwersja została zakończona można...
Strasznie bez sensu to robisz. Dlaczego za kazdym razem jak zmieniasz kanał robisz od nowa caly ADC init?? Zmieniaj tylko kanał. Poza tym dalbym te warunki w if kazdy w osobnym nawiasie. Dodano po 5 ustaw sobie najpierw na poczatku programu to: // Wybranie wewnętrznego żródła napięcia odniesienia - Internal 2.56V Voltage Reference with external capacitor...
Witam! Na początek kod: #define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "HD44780.h" #define Set(reg, bit) ((reg) |= (0x01 << (bit))) // Ustawienie danego bitu w rejestrze #define Clr(reg, bit) ((reg)...
Witam może tak: ADMUX&=0xF0; ADMUX|=kanal; Ty zawsze masz MUX = 0001
Cześć! Jest to moja pierwsza przygoda z Atmegą8, więc proszę o wyrozumiałość. Potrzebny okazał się wskaźnik naładowania baterii 6 kanałowy. Postanowiłem wykorzystać 6 portów ADC z Atmegi8A, kod pomógł pisać kolega. Program działa, lecz wskaźnik działa tylko na jednym "kanale". Jak zrobić ,żeby działał na wszystkich 6-ciu ? Wymagania stawiane programowi...
...ok jak na dziś to mam już dosyć....wybaczcie ale naprawdę już nie myślę... //--------------------------------------... // >>>>>>>>>>... moje alpejskie kombinacje z C <<<<<<<<<<... //--------------------------------------...
Witam, mam problem z obłsugą dwóch kanałów ADC w tym mikrokontrolerze. Sygnały mieszają się ze sobą, brak separacji między kanałami. Niestety nigdzie nie mogę znaleźc jak to poprawnie zrobic. Aktualny kod wygląda tak: Przed założeniem kolejnego tematu , proszę przeczytać http://www.elektroda.pl/rtvforum/topic10... oraz poprawić błędy w treści....
Wkradł się chochlik w funkcji pomiar, źle zmieniasz rejestr ADMUX. Powinno być [syntax=c]ADMUX = (ADMUX & 0xF8) | kanal;[/syntax] Tak to zapewne odczyt był zawsze tylko z kanału 5
Teraz jest tak: [syntax=c] #include <avr\io.h> #include <avr\interrupt.h> #include <util/delay.h> #define LICZBA_KANALOW 8 //maksymalna ilość kanałów volatile unsigned int napiecie[LICZBA_KANALOW]; volatile uint8_t stany_portow[8]={0x1,0x2,0x4,0x8,0x10,0x... jest ten LUT volatile uint16_t gADC_sr; volatile uint8_t flag_period;...
Witam Program dokonuje pomiaru temperatury na jednym wejsciu ATmega8, nastepnie przełącza się na inne wejście, dokonuje pomiaru który jest przeliczany na kąt ustawienia wału w silniku krokowym. Zmiany kąta dokonywane są za pomocą potencjometru. Wyniki pomiarów temperatury oraz kąt obrotu silnika wyświetlane są na wyświetlaczu LCD. Program działa. Pytanie...
Witam Mam ja sobie taki oto kod : #include <avr/interrupt.h> #include <avr/io.h> #define XX 10 int pomiar=0; int ilosc_pomiarow=XX; int temp; int main(void) { //PORTS DDRB = (1<<PB0 )| (1<< PB1 ); //ADC ADMUX=2; ADCSRA= ( 1<<ADPS0)|(1<<ADPS1&... | ( 1<< ADPS2);//ADC...
Witam szanownych forumowiczów. Napisałem taki oto kod, w celu sprawdzenia działania napięcia Vbg (bandgap) podawanego na wejście przetwornika AD w atmedze8: #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> void adcInit() { // źródło odniesienia - AVCC = 5V ADMUX |= _BV(REFS0); // wyrównanie do lewej...
Witajcie, mam problem z odczytem wartości z 2 kanałów ADC. Procesor to atmega32. Używam Timer0 żeby przełączać kanały, a na wyświetlaczu wyświeltane są 2 wartości, ale obydwie pokazują to samo- odczytywany jest tylko jeden kanał Inicjalizacja ADC [syntax=c]void ADC_init() { // ADC ADCSRA = (1<<ADEN) |(1<<ADPS0) | (1<<ADPS2) | (1<<ADSC);...
"A nie działa to zbyt dobrze bo skopałeś nieco obsługę przerwania, dla Ciebie zagadka - dlaczego?" :D A teraz gaskoin działa z Twoją petlą for. I z moim przerwaniem. A teraz dla Ciebie zagadka- co dziwnie działa? :D Dodam dla ułatwienia że w zupełnie nieoczekiwanym miejscu. To miałem na początku uczenia się pisania tego programiku- ale zlekceważyłem....
Dzięki za pomoc panowie. Napisałem od nowa program na innym timerze i ruszyło, wyskalowałem sobie to jak chciałem i git. Potem dodałem drugi potencjometr na inne wejście i zdefiniowałem drugi timer - tym razem chcę pwm o wypełnieniu z zakresu 6-27%. Generalnie mi się to udało mniej więcej obliczyć i zaimplementować. Ale pojawił się problem z pomiarem...
Jak to dokładnie jest z przetwornikiem ADC? Przeglądam forum i datasheeta od atmegi i nie widzę odpowiedzi na moje pytanie. Chodzi mi o tryb free running. Powiedzcie mi czy dobrze rozumiem zasadę działania przetwornika w tym trybie. Zaczynam od rejestru ADMUX, gdzie ustawiam napięcie odniesienia (REFSx) i kanał (MUXx). Później w ADCSRA ustawiam preskaler...
admux getadc admux bascom kanal admux
platforma studio płyta główna grzeje nvidia pamięć różne napiąć
prosty regulator prądu prostownik prosty regulator prądu prostownik
Brak komunikacji w amplitunerze - przyczyny i diagnostyka Schemat instalacji elektrycznej Setra S 415 NF