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...
Prosty przykład (oscylator wew. 8MHz): uint16_t pomiar(uint8_t kanal) { ADMUX = (ADMUX & ~0x07) | (kanal & 0x07);// ustaw kanal ADCSRA |= _BV(ADSC); //rozpocznij konwersje while(ADCSRA & _BV(ADSC)); //czekaj az skonczy return ADCW; //zmierzona wartosc } int main(void) { ADCSRA =...
[syntax=c] pomiar[kanal]=ADC; ADMUX =(ADMUX & 0b11000000) + kanal; ++kanal; if(kanal > 7) { kanal = 0; } [/syntax] Nawiasem mówiąc, inkrementując zmienną 'kanal' PO ustawieniu multipleksera przy następnej konwersji do tablicy 'pomiar' do pozycji n'tej zapisze się wynik z n+1'tego kanału. I ja to bym zrobił raczej jakoś tak: [syntax=c] pomiary[kanal++]...
Cześć, od pewnego czasu uczę się programować AVRy, moim kolejnym celem było opanowanie ADC gdzie posługiwałem się poradnikami pana Mirka Kardasia i napisałem(a właściwie to przepisałem) mój pierwszy program, z założenia miał on mrugać diodą z częstotliwością zależną od odczytu z ADC. Błędy które mi wyskakują:[syntax=text]:../main.c:28: error: conflicting...
Napisałem sobie taki kod: [syntax=c] #include <avr/io.h> #include <avr/delay.h> #include "HD44780.h" // ADMUX- konfiguracja przetwornika ADC uint16_t pomiar(uint8_t kanal); void przelicznik(uint16_t wartosc); uint8_t cz_c=2; uint8_t cz_u; int main(void) { LCD_Initalize(); ADMUX |= (1<<REFS0) ; //Vin napięcie porównawcze zasilanie proc...
[syntax=c] #include <stdio.h> #include <avr/io.h> #include <util/delay.h> #define LED1 PB5 //definicja LED1 (do którego pinu podłączony LED1) #define LED2 PB4 //definicja LED2 (do którego pinu podłączony LED2) int main(void) { DDRB |= (1<<LED1) | (1<<LED2); //LED Pins as Out ADCSRA |= (1<<ADEN)|(1<<ADPS1)|(1<&...
Koledzy, staram się teraz uruchomić przetwornik ADC. Ma on sczytywać napięcie po fotorezystorze. Ale cały czas pokazują mi się 0.00. Proszę o sprawdzenie poniższego kodu: #include <stdio.h> #include <avr/io.h> #include <util/delay.h> #include "hd44780.h" char V11[20]; //formulowanie wyniku double V1; //przechowywanie...
Witam. Piszę program na ATMEGA32. Przedstawiam część kodu i opis. Dane z pomiarów analogowych gromadzę w tablicy pomiar . Tablica pomiar_temp wykorzystywana jest do dalszych operacji. Czy poniższy ATOMIC_BLOCK może wprowadzić duże opóźnienia w dla wykonywania procedury obsługi przerwania. [syntax=c] volatile uint32_t pomiar[8]; volatile uint8_t kanal...
Drodzy Panowie mam problem z wsadem do procka który ma sterować ładowarką akumulatora kwasowego, zasada działania ma być tak że po uruchomieniu urządzenia jest mierzone napięcie i gdy jest ono mniejsze od 14.4 V to ma zacząć się ładowanie prądem o stałej wartości (cc) a gdy napięcie na akumulatorze osiągnie 14.4V ładowarka ma zostać przełączona w tryb...
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...
Witam ponownie. Mówią nie chwal dnia przed zachodem słońca...jak z jednym się uporałem to znów co innego mi mąci. Kłopot z wyborem gdzie zapisać nastawy dwukanałowego timera bo zmiennych jednocyfrowych jest łącznie 4x4 dziesiątki godzin , jednostki godzin , dziesiątki minut , jednostki minut osobno dla włącz osobno wyłącz razy dwa kanały.Ma do wyboru...
Ja w swoim urządzeniu zastosowałem taki algorytm: unsigned char ilpom; // licznik ilości pomiarów. dla każdego kanału wykonuję w pętli ilpom pomiarów. Najpierw zeruję tablicę - np. kanal Dodano po 7 unsigned int pomcal(char kanal, char licznik) // funkcja pomiaru ADC { uint16_t pomiar(uint8_t); // deklaracja typu funkcji dla pomiar...
Aj, ale błąd. Faktycznie, po poprawieniu zaczęło działać bardzo fajnie :) Dzięki bardzo za podpowiedzi Poprawne ADC_read: [syntax=c]unsigned int ADC_read(uint8_t ch) { ch= ch & 0b00000111;//sprawdzenie, czy kanal jest cyfra od 0 do 7 ADMUX = (ADMUX & 0xF8)|ch; // wyzerowanie poprzedniego wyboru i nastepny wybor kanalu ADCSRA|=(1<<ADSC);...
Witam Czytam o przetworniku adc w atmega8535 i mam pare watpliwości/pytań void adc_read(void) { int i adcres1=0, adcres2=0; ADCSRA |= _BV( ADEN ) | _BV( ADPS2 ) | _BV( ADPS1 ); //wlacz przetwornik i ustwa czestotliwosc na 250khz 16E6/64 z racji ze 8 bitow mozna taka czestotliwość ustawic ADMUX = MUX0 | _BV( REFS0...
...przetrawiłem manual z ustawiania bitów w ADSC i myślę że dobrze przekształciłem zapis makr z _BV(MUXx) na hex ustawiające bity ADMUX-a wprowadziłem zalecana formę obliczeń co teraz wygląda tak.. //------------------------------MUX0 kan 1 ADCSRA = (1<<ADSC); ADMUX = 0xE1; while(bit_is_set(ADCSRA,ADSC)... v_temp = ((ADCH<<2*2.56)/1024.0...
witam ponownie...otóż dobra wiadomość jest taki że dzięki wyrozumiałości i wysiłkom kolegów aby wlać mi do głowy trochę oleju nazwanego "C" podumałem pooglądałem i zacząłem pisać program od nowa....efekt tego taki że mam działający program choć z małą usterką .... otóż wyświetla mi po obu zdefiniowanych napisach trzy cyfry pływające w zakresie od 165...
Witajcie. Ostatnio zmagam się z obsługą klawiaturki analogowej składającej się z 3 klawiszy. Poradziłem sobie z uruchomieniem ADC na ATmedze8 i zrobiłem sobie 2 Timery programowe . Teraz próbuje zgodnie z przedstawioną przez Mirka (w filmach z cyklu "Przetwornik ADC - część 06") koncepcją zrobienia repeat klawiszy. https://www.youtube.com/watch?v=BdCCe6XO...
"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....
czyli zawsze te najbardziej znaczące bity ? dla 4 bitów rozdzielczości będzie wyglądało tak jak poniżej ? Wersja 1: [syntax=c]int pomiarADC(uint8_t index) //zakres<0,10> oznacza ile bitow chcemy { ADMUX &= ~(1 << ADLAR); // zeruje ADLAR setMux(index);// ustawia odpowiedni kanal ADCSRA |= (1 << ADSC);// start ADC while (ADCSRA &...
Chciałem zrobić pomiar napięcia i temperatury na atmega8 i mam problem z przetwornikiem. Pod kanal 0 ADC0 podłączony mam potencjometr 100k a pod kanal 1 ADC1 mam podłączony lm35. Problem polega na tym, że jak kręcę potencjometrem to wartość temperatury mi się zmienia. Dlaczego tak się dzieje? Oto kod: #include <avr/io.h> #include <util/delay.h>...
Witam Chce stworzyć prosty analizator widma oparty na ATmedze oraz wyświetlaczu LCD HD44780. Płytkę z filtrami stworzyłem wcześniej i przebadałem oscyloskopem i wszystko działa jak należy. Problemy zaczęły się dopiero przy programowaniu procesora. Poradziłem sobie z obsługą wyświetlacza i, z pomocą forumowiczów, z obsługą ADC. Mam teraz problem z przerwaniem....
Witam może tak: ADMUX&=0xF0; ADMUX|=kanal; Ty zawsze masz MUX = 0001
Witam, Zrealizowałem przerywacz podwyższający napięcie z 5 V do 10 V, który jest sterowany atmegą a program napisałem w języku C, lecz mam problem ze stabilizacją napięcia wyjściowego przy zmianach obciążenia. Napięcie przy dużych zmianach obciążenia potrafi wzrosnąć na chwile nawet o 10 V. Sterowanie wypełnieniem PWM zrealizowałem w przerwaniach poprzez...
Witam, po przesiadce z bascom do winavr piszę przykładowe programy w celu poznania C dla AVR, tym razem chciałbym wysyłać po rs232 odczyt z przetwornika analogowego. Używam a328p i po krótkim zapoznaniu się z dokumentacją układu ustawiłem transmisję i adc [syntax=c] #include <avr/io.h> #include <util/delay.h> int main( void ) { UCSR0B =...
Fakt, nie było pytania. Tylko sugestia- czy można to zrobić inaczej? Bo w zasadzie robię to dotychczas tak jak to opisał mirekk. Z całej dyskusji dotarło do mnie tylko to że można spróbować zastosować bufor- czy pierścieniowy czy FIFO to tak dokładnie nie zrozumiałem. Jakąś implementację bufora w C ściągnę z netu i będę próbował zrozumieć a potem przerobić...
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.
Hej :) Chcę podłączyć 3 czujniki odległości do kanałów ADC (porty PA1, PA2, PA3) i odczytywać z nich pomiary przez cały czas. Ponieważ po przetestowaniu czujników doszłam do wniosku że pewne czynniki wpływają na niestabilność pomiaru, chcę jako ostateczny wynik wziąć średnią arytmetyczną z 8 pomiarów przeprowadzonych w trakcie jednego cyklu pomarowego...
A czy przy każdym żądaniu wybierasz odniesienie czy tylko zmieniasz kanał?
Witam. Do programu zarządzania zasilaniem który już działa usiłuje dopisać obsługę PCF8583 oraz część programu który pozwoliłby wyeliminować mechaniczny dwu kanałowy zegar sterujący który o określonych godzinach włącza lub wyłącza dwa obwody 230V. Mam z tym problem bo nie posiadam dostatecznej wiedzy i jak na razie to dopisana część kodu rozwala na...
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...
[syntax=c] #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include <util/delay.h> #include "include/lcd44780.h" #include "include/i2c_twi.h" //********** funkcje konwersji char dec_na_bcd(char num){return ((num/10 * 16) + (num % 10));}//set = dec_na_bcd(set); char bcd_na_dec(char num){return ((num/16 * 10) + (num...
PCF8583 ma własne zasilanie [akumulatorek] do podtrzymania pamięci , błędny odczyt następuje po zmianie wartości dni np; 19-07-2011 na 20-27-2011 .. 20-47-2011 . Co jest powodem nie wiem choć przeczytałem polskiego datasheta PCF-a. Przepisałem program ale z porównywaniem czasu to jest masakra i do tego jak na złość nie działa , czy można to zrobić prościej...
Witam, Próbuję zrobić układ mierzący napięcie w zakresie 0-5V i wysyłający wynik na COMa. Napięcie odniesienia ustawiłem na wew. AREF i do pinu ADC1 podłączyłem dzielnik napięcia z dwoma rezystorami 330, więc jeśli dobrze myślę to 5V/2=2.5 i (2.5/2.56)*255=249 i taki wynik powinno mi wysyłać na coma a wynik jaki otrzymuję gdy na zasilaczu ustawiam 5V...
Program bez przetwornika ADC. Program działa prawidłowo Dodano po 42 Od kiedy praca dyplomowa jest tajna? Pytam z ciekawości- kiedyś była jawna na całym etapie pisania. Dlaczego w pętli głównej blokujesz przerwania- potem wykonujesz sporo obliczeń- a potem odblokowujesz? A co będzie jak w tym czasie pojawią się dwa przerwania? Jedno pójdzie się kochać....
wow..super :) caly dzien myslenia,a ty mi wszystko powiedziales w pare chwil.. stokrotne dzieki... a takie pytanie bardziej teoretyczne.. wynik z miernika rozni mi sie od przetwornika o jakies 30mV... to normalny margines bledu ? w zaleznosci ktory kanal zastostuje moge miec rozne bledy? w jaki sposob wprowadzic poprawke? widzialem jakies wzory w datashetcie...
Hej, To działa: ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania z kanału 0 !!!!!!!!!!!!!!!!!!!! while(bit_is_set(ADCSRA,ADSC)... Oczekiwanie na zakończenie przetwarzania {}; pomiar1=ADCH; // Zapisanie starszych 8 bitów wyniku konwersji w kanale 0 do zmiennej "pomiar1" ADMUX |= _BV(0); // Wybranie...
Procesor: ATtiny26L Zasilanie: 3V Oscylator: Internal 1MHz Fragment kodu: //--------------------------------------... uint16_t g_odniesienie; ADMUX = 0x87; // b10000111, ustawienie zrodla Vref i polaczonego kanalu (7) ADCSR = 0x83; // b10000011, m.in. wlaczenie A/D i ustawienie prescalera (podzial przez 8), f glowna=1MHz...
Czy ktoś potrafi zrobić z tego kodu użyteczny program ? ? ? .... zaczynam się zastanawiać czy nie zlecić jego napisania ale nie mam pojęcia ile taka usługa może kosztować. Dla zorientowania się o co mi chodzi wklejam cały kod którego część funkcjonuje. [syntax=c] #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include...
Witam, Jest sobie termostat do laminatora oparty o ATMega8 - dzieło ze strony: http://thomaspfeifer.net/laminator_tempe... Ponieważ zrobiłem swoją wersję tego urządzenia wzbogaconą o dodatkowe funkcje, muszę zmodyfikować program, a z programowaniem w C nie miałem dotąd za wiele wspólnego... Na początek postanowiłem sprawdzić działanie...
Witam, mam jakiś błąd w sofcie, który powoduje, że po odłączeniu i włączeniu zasilania program nie działa prawidłowo. Zresetowanie atmegi bez odłączenia zasilania powoduje że wszystko chodzi już dobrze. Próbowałem różne ustawienia fuse'ów, kwarc 12MHz, CKOPT włączony, ustawiony najdłuższy możliwy czas opóźnienia włączenia. Testowałem na wewnętrznym...
Witam. Miał być w założeniu dwukanałowy czyli sterować wybrane w programie obwody np;z pierwszego kanału obwody 3 i 4 a z drugiego obwody 1 i 2 ale nie potrafiłem sobie z tym poradzić więc "przypisałem" każdemu obwodowi własny czas załączenia i wyłączenia z podziałem na dni robocze [od Poniedzialku do Piatku ] i dni wolne [sobota niedziela]. Chciałem...
Wybacz Kolego ale można się załamać - nie znasz podstaw programowania! Weź sobie jakąkolwiek książkę do C i przeczytaj chociaż KILKA PIERWSZYCH ROZDZIAŁÓW... Bardzo uprzejmie proszę. Forum nie jest od nauczania C, nawet na przykładach! Najprostszy program ma postać: #include <stdlib.h> #include <stdio.h> int main(void){ sleep(1);...
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...
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
Trochę chaotycznie napisany program: 1. skoro używasz przesunięć bitowych, to używaj je konsekwentnie. bo sprawdzenie, czy prawidłowo ustawiasz ADMUX zmusza do szukania. co oznacza 0xE9 itp. Przy zmianie kanału zmieniaj tylko bity ADMUX odpowiedzialne za nr kanału: A single conversion is started by writing a logical one to the ADC Start Conversion bit,...
Zmień podejście. Tryb free running praktycznie nie nadaje się w sytuacji w której planujesz zmieniać kanały. Lepiej zastosować single conversion i przerwania. W takiej sytuacji w procedurze obsługi przerwania zapisujesz do tablicy wartość ADC, inkrementujesz indeks tablicy, inkrementujesz ADMUX (kanał) i zaczynasz kolejną konwersję. I tak w kółko. W...
Po resecie cały ADMUX==0 Załóżmy że korzystasz z zewn. napięcia odniesienia i nie ustawiasz bitu ADLAR. No to nic nie ustawiasz i masz pomiar z kanału 0 z zewn nap. odniesienia. Ale jak masz konfigurację w innym pliku do podaj jaką. No i w końcu- jaki procesor? No i co ty wstwiasz w końcu do ADMUX? najpierw- nic. Potem PC0- jaki PinC- przecież to stan...
Problem został rozwiązany, wystarczyło na końcu procedury przetwarzania drugiego kanału ponownie włączyć pierwszy kanał ADMUX &=~_BV(1);
Pomogła zmiana preskalera. Dodatkowo AREF podłączyłem kondensatorem 100nF, AVCC jest filtrowane przez cewkę i kondensator. Pomiary są stałe. Poniżej finalna funkcja i inicjalizacja pomiarów. [syntax=c] void init_adc(void) { ADMUX |= (1<<REFS0); ADCSRA |= (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2); } uint16_t pomiar(uint8_t kanal) {...
Takie coś łatwiej zrobić tak ISR(...) kanal= ADMUX&0x03; if(kanal==0) ........ if(kanal==1) ............. Lepiej i przejrzyściej !
Nie robi różnicy czy odczytujesz ADCL ADCH czy ADCW,chodzi tylko o wyrównanie bitów przez ADLAR. Ale to tak na marginesie,bo to nie jest powodem, że nie czyta ci z kanału 4. Nie stosuj bezpośrednich zapisów pod ADMUX tak jak np ADMUX = 4; bo automatycznie zmieniasz konfiguracje przetwornika. Zobacz jak ja korzystam z pierwszych czterech kanałów: Inicjalizacja:...
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
(at)kdgp1491 Problemem jest konstrukcja ADMUX |= 0b01000011; Po czymś takim, jak zrobisz ADMUX |= 0b01000010; to nic nie zmieniasz - ciągle dwa najmniej znaczące bity mają 0b11, a więc stale masz wybrany ten sam kanał.
[syntax=c]uint16_t pomiar( uint8_t kanal) { ADMUX = (ADMUX & 0b11100000) | kanal; ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)); return ADC; };[/syntax] Zmieniałem funkcje odczytu na taką, czyli oczekiwaniem na stan bitu i wszystko teraz działa poprawnie, wszystko na szczęście jest w dokumentacji, jeszcze raz przejrzałem i znalazłem,...
A nie lepiej zrobić najpierw wszystkie pomiary a później odświeżyć LCD? Czy zastosowanie tego urządzenia wymaga naprzemiennych szybkich pomiarów? Jeśli nie to można zrobić tak: [syntax=c] ADMUX = 0x00; temp = 0; for(pomiar_licznik=0; pomiar_licznik<6; pomiar_licznik++) { ADCSRA |= (1 << ADSC); while(ADCSRA & (1 << ADSC)); temp +=...
To polecenie wybiera pin ADC1 a nie ADC0. Dla ADC0 wszystkie bity MUX3..0 muszą być równe 0. Jeśli pin ADC1 nie jest podłączony do jakiegoś potencjału, to wyniki pomiaru będą raczej trudne do przewidzenia.
.... ADCSRA=0x85; //wpisanie 1 na Enable i ustawienie prescalera ADMUX=0x00; //wybieram kanał 0 ADCSRA=1<<ADSC//uruchamiam konwersję ...i wyłączasz przetwornik oraz zerujesz bity preskalera. ADCSRA |= 1<<ADSC Poza tym po włączeniu przetwornika wypadałoby wykonać pustą (dummy) konwersję.
Uruchomiłeś zasilanie i niespełna mikrosekundę później wystartowałeś pomiar. Trochę mało czasu na ustabilizowanie się napięcia na układzie, który ma rozbudowaną strukturę z wzmacniaczem operacyjnym wewnątrz. Sam ADC też potrzebuje kilku uS na naładowanie kondensatora samplującego po ustawieniu kanału ADMUX.
Jeśli ADMUX służy do wybierania kanału to czy czasem w obu funkcjach nie masz wybieranego tego samego kanału ? ADMUX|=(0<<MUX4)|(0<<MUX3)|(... Do tego jeśli będziesz przełączał kanały uważaj na "OR |" w ADMUX|= Przesuwanie zera (0<<MUX0)...
Nie wymaga. Zmiana ADMUX zawsze dotyczy następnej konwersji, nie wpływa na bieżącą.
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);...
w pętli głównej programu umieszczasz odwołanie: ldi R16, X rcall Pomiar_ADC pomiar_ADC: ; ============ program pomiaru ADC=====================================... ldi R20, 0b11000000 ; ustawiamy PAX jako wejscie przetwornika napięcia i wybieramy add R20, R16 ; parametr określający nr kanału out ADMUX, R20 ; jako napięcie odniesienia Vref wewnętrzne...
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...
Nie wiem co jeszcze napisać. ADC na rym kodzie działa dobrze a chyba jasno określiłem w tytule o co chodzi i zaznaczyłem w kodzie niewłaściwy sposób "wyzerowania" "wyskalowania" pomiaru aby pokazywał faktyczną wartość przepływającego prądu a nie cuda niewidy. Pre-definicja ADC [syntax=csharp] //********** definicje zmiennych dla ADC volatile uint16_t...
Witam, próbowałem sobie napisać prosty programik do wyświetlania wartości napięcia z ADC5 na LCD, jednak nie wiem czemu wyświetla mi błąd: "error: called object '64' is not a function" #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/pgmspace.h> #include <stdio.h> #include "lcd.h"...
A do którego wejścia ADC się kolega podpina? Gdzie w programie instrukcja wyboru kanału przetwornika (ADMUX)?
Musisz przez wpisem do ADMUX nowego kanału wykasować wcześniejszą zawartość tych bitów, czyli ADMUX&=0b11111000; ADMUX|=ch;
[syntax=c] ADMUX |= (ADMUX & 0xF8) | kanal; [/syntax] Przypatrz się i pomyśl.
Panowie Kombinuje z pomiarem napięcia na potencjometrach z wykorzystaniem atmego32. 4 potencjometry podpięte do 4 kanałów ADC. Połączenia nie mogę przedstawić ze względu na problem z wgrywaniem obrazków, lecz jest ono podręcznikowe. kod: [syntax=c] ADMUX |= (1<<REFS0); ADCSRA |= (1<<ADEN) | (1<<ADPS1) |(1<<ADPS0) ; char tekst[30];...
_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)...
Kol. dondu pisał o pisaniu algorytmu(przebieg programu), a można to też wykonywać w pisaniu programu. Przedstawiam Ci takiego gotowca - co Ty na to? [syntax=c] #include <avr/io.h> #include <util/delay.h> #define led1 PB0 //defincja diody podłaczonej do PB0 void init_ADC (void); //deklaracja funkcji uint16_t pomiar(uint8_t kanal) //deklaracja...
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...
Przykład dla dwóch kanałów Przed wpisaniem tego kodu musisz odpowiednio ustawić Bity w rejestrach ADMUX i ADCSRA Jeśli chcesz mieć próbkowanie co określony czas to musisz odpowiednio ustawić rejestry zegara. Pisałem trochę z pamięci mogłem gdzieś zgubić klamrę przecinek lub średnik [syntax=c] //SET_BIT(ADCSRA, ADSC); - moje makro ustawiające bit w rejestrze,...
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);...
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);...
[url=http://www.atmel.com/dyn/resources/... datasheet, strona 101: - bity 7:6 rejestru ADMUX wybierają napięcie referencyjne - bit 5 wybiera, czy wynik wyrównać do lewej - bity 4:0 wybierają kanał+wzmocnienie (tabelka 46 na stronie 102) Zauważ, że wartość 0xEB wpisana do ADMUX spowoduje wybranie wewnętrznego źródła napięcia...
Witam Dopiero uczę się C i natknąłem się na problem w takim kodzie : [syntax=c] #include <avr/io.h> #include <util/delay.h> #include"obsluga_LCD.h" uint16_t pomiar(uint8_t kanal); uint32_t wynik; uint16_t pm; uint8_t cz_d, cz_u; uint8_t a; int main(void) { ADMUX |= (1<<REFS0); //(1<<REFS1); ADCSRA |= (1<<ADEN) | (1<<ADPS1)...
Za pomocą komparatora - nie. Za pomocą ADC w trybie pomiaru różnicowego - tak. Przeglądnij datasheet i sekcję opisującą kanały ADC (rejestr ADMUX)
Chcąc bezproblemowo zmieniać kanały powinieneś zostawić GETADC() i w konfiguracji zmienić na SINGLE . W trybie FREE przetwornik mierzy ciągle (ustawiając flagi przerwania ADI F po każdym pomiarze), a ostatni wynik będzie znajdował się w zmiennej specjalnej ADCD (typu Word ). Jednak zmiana kanału pomiaru jest nieco problematyczna, bo kanały musiałbyś...
W przerwaniu dodałeś funkcję: [syntax=c]uint16_t pomiar (uint8_t kanal) { ADMUX = (ADMUX & 0b11111000) | kanal; ADCSRA |= (1<<ADSC); //start konwersji while ( ADCSRA & (1<<ADSC) ) ; return ADCW; }[/syntax] która zmienia ustawienia ADC, którego multiplekser używany jest do sterowania silnikiem. W którym miejscu kodu zadbałeś o ponowne...
Może ktoś ma teorie dlaczego tak się dzieje, oczywiście poza zakóceniami. Procesor szaleje , bo nie wie co robić - brakuje "ADMUX |=(ADMUX & 0xF8)|kanal;"
Bit kompatybilności wyłączony, tym bardziej że osobno wszystkie kanały działają. Przepisywanie do admux nowego kanału dzieje się w obsłudze przerwania adc conversion complete także już po zakończeniu działania, więc powinno działać. Pominięcie pierwszego wyniku zrobię, ale coś mi sie nie wydaje żeby to ruszyło. Jak nie znajdę rozwiązania to spróbuję...
Witam, uczę się języka C i od kilku dni się głowię nad pozornie prostą instrukcją w C. ten układ to tester do czujników linii w przyszłym linefollowerze model tcrt5000 zależy mi na tym, że gdy ADC4 wykryje coś to żeby zapaliły się dwie diody, gdy ADC3 to niech zapali się tylko LED1, a gdy ADC5 wykryje niech zapali się tylko LED2, próbowałem wiele instrukcji...
Tak jak napisałem w poście jest to mój pierwszy projekt w C i ciężko powiedzieć że opanowałem programowanie w C od początku do końca jednak projekt ukończyłem i jestem zadowolony że działa jak chciałem:) Pomiar napięcia zrobiłem w taki sposób (w tym przypadku wspierałem się jakimś projektem z avrfreaks.net): unsigned int adc_sample(uint8_t Channel)...
Chyba koledzy nie zauważyli że kolega ciągle ustawia ADMUX i korzysta z pierwszego odczytu. U mnie odczyt jest stabilny i ani razu nie schodzi poniżej 1023 a mierzę te 5V co 500ms jak Ty bez cudów filtrowania. TYLKO ja pomijam/odrzucam wynik pierwszej konwersji BEZPOŚREDNIO po ustawianiu rejestru ADMUX Wystartuj konwersję jeszcze raz i napisz jak wygląda...
Ustawiłem bit ADLAR na 1, usunąłem | i &. Serwa przestały drgać, ale dalej sie nie ruszają. Jestem dosyć świeży więc proszę o wyrozumiałość [syntax=c] ADMUX = (1<<REFS1) | (1<<REFS0)| (1<<ADLAR); ...... for(;;)//pętla główna { ADMUX = _BV(0); // Wybranie kanału 0, (0<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3)...
Witam! Mam problem z programem pisanym pod atmege8 w języku C. Założenia są proste - układ steruje diodą LED mocy poprzez wyjście PWM'u podłączonego pod tranzystor mosfet. Na początku wypełnienie zmieniałem dodając bądź odejmując założoną liczbę od rejestru OCR1A. Jednak z racji wytracania dużej ilości energii na rezystorze postanowiłem, że zamiast...
Jeśli piszesz w BASCOM to wystarczy polecenie GETADC z parametrem liczbowym określającym numer kanału.
Próbuję odczytać napięcie z li-pola. Wszystko skonfigurowałem jak poniżej. Kod: DDRD=0xFF; DDRF=0x00; InitADC(); while(1); { PORTD=ReadADC(BATT); TimeDelay(wait); } gdzie poszczególne funkcje i definicje: #define BATT 1 void InitADC() // Inicjalizacja przetwornika A/C { ADMUX = 0x60; // 0 1 1 0...
To jest akurat dobrze, w rejestrze OCR1A mam wartosc porownywaną tak jest w dokumentacji. Uproscilem troszke program, napisalem nowy do pomiaru narazie na jednym kanale, ten sam problem. Wygląda na to jakby przerwanie w ogóle nie było wykonywane. Co ciekawe napisałem sobie z ciekawości program do obsługi identycznie skonfigurowanego przerwania CTC z...
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...
Odrzucanie pierwszego wyniku, czy też serii wyników, to tylko proteza do źle zaprojektowanego algorytmu. Takoż samo algorytm używający jakiegoś opóźnienia (nie piszę o delay). Jak komuś zależy na dokładności, to nie używa wbudowanego, powolnego i mocno ograniczonego ADC A to jest demagogia, w obronie jakiś dziwnych tez. Zresztą opóżnienie Ja piszę...
Witam wszystkich, mam problem z uruchomieniem na przerwaniach przetwornika ADC w atmedze 64. zamieszczam poniżej fragment kodu: // ISR(ADC_vect) { kierunek=ADC; //odczyt wartości ADC write_text_to_LCD("ADC test"); } int main(void) { PORTF = 0x00; DDRF = 0x00; zaprogramowanie przetwornika ADC ADCSRA =...
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...
Witam, Zbudowałem na płytce stykowej taką przetwornicę typu Buck jak na zdjęciu i mam problem z regulacją napięcia. Równolegle z obciążeniem jakim jest rezystor 100om dołożyłem dzielnik napięcia z rezystora 51k i 10k do pomiaru napięcia wyjściowego. Dzielnik jest podpięty do wejścia ADC3 (PC3). Zadaję napięcie wyjściowe przetwornicy za pomocą potencjometru...
Wystarczy w rejestrze ADMUX wybrać sobie kanał z którego chcesz pomiar. Opisane jest to na stronie 213 dokumentacji
Szanowni Forumowicze, Chciałbym zrobić układ, który będzie zapisywał dane czasu do pamięci eeprom po wyłączeniu zasilania. W tym celu na wyjściu stabilizatora liniowego LM7805 umieściłem diodę schotky, za nią kondensator podtrzymujący zasilanie, zasila on sam procesor i reset procka. Przed diodą jest zasilanie reszty układów. Układ wykrywania awarii...
ldi r25,0b00000101 out admux,r25; kanał pomiaru 4 < nieprawda (że 4 kanał) Dodano po 3 Można też tak (jak chcesz 5 kanał i używasz zewnętrznego napięcia odniesienia): ldi r25, 5 out admux,r25
#include... ... ... //kwarc 3,6864MHz ... ... volatile unsigned int koniec=0; volatile unsigned long int adc; ... ... int main(void) { sei(); for(;;) { ADMUX = (1 << REFS1) | (1 << REFS0); //kanał ADC0, wew ref 2,56V ADCSRA = (1 << ADEN) | (1 << ADSC) | (1...
Proszę, oto kod: [syntax=c] #include <avr/io.h> #include <avr/stdlib.h> #include <avr/stdio.h> #include "HD44780.h" #include "sterowanie.h" // ********* INICJALIZACJA *********** void Initalize(){ //----------- ŻARÓWKA------------ TCCR1B |= (1<<CS11) | (1<<CS10); TCCR1A |= (1<<WGM10) | (1<<COM1B1); BULB_PWM_DIR...
admux bascom admux getadc kanał admux
konto allegro prostownik szybkiego ładowania halogeny kable
zasilacz zwrotne napięcie sprzedam multimetr brymen
Instrukcja serwisowa pilota Rotel RSP-976/RR-969 Średnica drutu przy przewijaniu prądnicy – wpływ na rezystancję, napięcie i sprawność