Znam standardowa obsluge ADC w bascomie czyli getadc.. Problem z nia jest taki ze procesor zatrzymuje swoje dzialanie na dosc dlugi czas konwersji. W moim programie nie moge sobie na to pozwolic. Dlatego potrzebuje procedure inicjalizacji ADC na rejestrach i odczytanie wyniku konwersji po czasie po jakim na pewno zostala zakonczona (u mnie 1ms) ew po zgloszeniu przerwania z ADC. Moze ktos z was juz sie tematem zajmowal?
Normalnie (czytaj: nie znam bascom) można to rozwiązać na kilka sposobów.
Możesz na przykład wystartować pomiar ADC, a stan bitu ADSC sprawdzać gdzieś w pętli głównej (realizując inne zadania) i zareagować dopiero, gdy bit ten wskaże na zakończenie pomiaru.
Możesz także ustawić przerwania ADC i wtedy po zakończeniu pomiaru przerwanie się wykona. Mogę wskazać przykład dla C jeśli Ciebie to zainteresuje.
Super monotonnej konfiguracji nie trzeba, biorąc pod uwagę, że cała różnica polega głównie na ustawieniu adc w free running mode (config adc=free), dodaniu obsługi przerwania i odpowiedniego ENABLE Wszystko w instrukcji bascoma.
Dzieki panowie za zainteresowanie. To o czym mowiecie to wiem. Startuje ADC i czekam okreslony czas (program caly czas sie wykonuje) albo czekam na przerwanie z zakonczenia konwersji. To jest jasne. Chodzi mi co i jak po kolei wpisywac do rejestrow aby uruchomic ADC.
Bascom to taki prostacki jezyk w ktorym wpisujac zmienna=getadc(0) powoduje ze ta komenda za mnie ustawia multiplexer wejsciowy na wejscie 0, uruchamia konwersje i czeka az sie skonczy. Na koniec mam wynik w zmiennej ADC ktora musi byc typu word bo przetwornik jest 10bitowy.
Caly problem w tym ze na czas konwersji (ok 200us) program mi sie zatrzymuje a obieg petli mam ok 40us i to przy zegarze tylko 2Mhz. Dlatego potrzebuje opis co po kolei wpisywac do ktorego rejestru aby ustawic multiplexer wejsciowy, wystartowac konwersje, potem sobie poczekam i zebym wiedzial z ktorych rejestrow odczytac wynik. Potrzebuje konfiguracje dla single bo bede odczytywal dwa wejscia wiec chyba free running nie wchodzi w gre.
Niestety nie znam jezyka C a bascom coraz bardziej mnie wkurza. Jednak umozliwia tez prace na konkretnych rejestrach procesora wiec na pewno da sie cos wywalczyc.
Masakra w bascomie to wysylanie ciagu znakow po RS232. Piszesz print "dzien dobry" a on zatrzymuje program i wysyla po kolei wszystkie znaki. Przy wolnej transmisji zatrzymuje procesor na kilakdziesiat milisekund! Masakra! Na szczescie juz doszedlem jak sobie z tym poradzic. A masakra masakr jest odczyt RC5 ktory zatrzymuje prace programu na 125ms czyli na caly czas trwania ramki transmisji. W nowszysch wersjach kompilatora nieco to poprawili
Bascom to taki prostacki jezyk w ktorym wpisujac zmienna=getadc(0) powoduje ze ta komenda za mnie ustawia multiplexer wejsciowy na wejscie 0, uruchamia konwersje i czeka az sie skonczy
Co w tym prostackiego?
Patrz co robi:
Code: c
Log in, to see the code
Widzisz? To jest język C, a ta funkcja robi praktycznie to samo co BASCOMowa! Tzn efekt ten sam, a funkcja troszkę inna.
Quote:
Dlatego potrzebuje opis co po kolei wpisywac do ktorego rejestru aby ustawic multiplexer wejsciowy, wystartowac konwersje, potem sobie poczekam i zebym wiedzial z ktorych rejestrow odczytac wynik.
No to przecież pisałem jak zacząć, reszta to niestety nota katalogowa w rękę i kolego pracujesz! Dodam, że BASCOM akceptuje rejestry ADMUX i ADCSRA, a w nich musisz szukać odpowiedzi co i jak ustawić. A skąd odczytać? No jak skąd? Z ADC! Tak, właśnie taka jest nazwa tego rejestru (a właściwie ADCH i ADCL, ale iirc Bascom jak i AVR-libc zawierają poskładany rejestr 16bit ADC).
Jest naprawdę, zawsze tyle rzeczy o których możesz jeszcze nie wiedzieć, że nie ma co wydawać osadów. Bascom mierzy dwa razy. Jesli chcesz to możesz to wyłączyć.
Code: vbnet
Log in, to see the code
...program jest tak dobry jak programista. Nie mowię że jest lepszy czy gorszy tylko patrzę na to jak na narzędzie którym się posługuję. Jeśli będe budował coś prostego i na szybko to użyję Bascom bo wszystko zajmie mi "minutkę" Jeśli czegoś się w Bascom zrobić nie da wtedy myślę o C.
Zacznij zaglądać do bibliotek Bascoma. Bascom ma wbudowany kompilator dla bibliotek więc albo sie go naucz obsługiwać albo przestań narzekac W C musisz wiedziec co robisz. Dobrze by było gdyby użytkownicy Bascoma tez wiedzieli co sie dzieje "pod spodem"
Widzisz? To jest język C, a ta funkcja robi praktycznie to samo co BASCOMowa! Tzn efekt ten sam, a funkcja troszkę inna.
Ta funkcja jest napisana jako ogólna wykorzystująca tryb ADC Noise Reduction. W dodatku jest napisana dla konkretnego przypadku, kodu który zamiast odczytywać ADC w funkcji przerwania ADC, odczytuje go w ciele funkcji. W takim przypadku należy dodać opóźnienie (które jest pod koniec tej funkcji) bo inne przerwanie mogło wybudzić mikrokontroler, podczas trwania konwersji ADC.
Dlatego też ta funkcja może być wzorcem, ale lepiej jest odczytywać ADC w przerwaniu, a nie czekać 100ms w funkcji. Chyba, że nie ma to dla nas znaczenia, to oczywiście ta funkcja jest OK.
Ale skoro już podajesz koledze kod w C, na którym ma się wzorować, to może niech już przy C zostanie
niveasoft wrote:
Jeśli będe budował coś prostego i na szybko to użyję Bascom bo wszystko zajmie mi "minutkę" Jeśli czegoś się w Bascom zrobić nie da wtedy myślę o C.
Lepiej znać jeden język dobrze niż dwa po łebkach.
Ta funkcja jest napisana jako ogólna wykorzystująca tryb ADC Noise Reduction. W dodatku jest napisana dla konkretnego przypadku, kodu który zamiast odczytywać ADC w funkcji przerwania ADC, odczytuje go w ciele funkcji
Owszem, nie ukrywam, że akurat w tym przypadku o taki efekt mi chodziło. ADC chodzi cały czas generując przerwania, za to podczas każdego wywołania getadc mogę zmieniać kanały i delay jest w zasadzie po to by mieć zawsze wynik z ustawionego kanału (a nie jakiś z poprzednich konwersji). Oczywiście można na dziesiątki sposobów inaczej, tutaj podałem to jako przykład dlaczego NIE uważam by funkcja getadc(ch) z bascom była prostacka. W języku C przecież też ludzie używają dokładnie tej samej funkcjonalności tylko najpierw muszą sobie taką funkcję napisać (lub ściągnąć biblioteki). A jeśli chodzi o odczyt w przerwaniach to i tak w jakiś sposób trzeba pominąć wyniki na czas konwersji przy zmianie kanałów multipleksera co w przypadku 10bit jednak daje ekwiwalent takiego delaya (ale oczywiście można to zrealizować nieblokująco). Postępowanie w BASCOM nie różni się zasadniczo od postępowania w C, przy czym część inicjalizacji ADC i tak mamy już załatwione istniejącymi komendami (jeszcze raz napiszę - tryb free running ustawiamy w config adc, uruchamianie/wyłączanie z kolei start/stop adc. Odczyt wartości jest z ADC lub ADCH/ADCL, do wyboru, do koloru. Zostaje jedynie ustawienie ADMUX i ewentualnie obsługa pewnej flagi w ADCSRA (tudzież wykorzystanie przerwań). I choć mógłbym podać przykładowe rozwiązanie to jednak nie taka jest idea pomocy. Nie dam ryby, dam wędkę.
Instrukcja ogólna:
http://medesign.seas.upenn.edu/index.php/Guides/MaEvArM-adc
Niestety nie znam jezyka C a bascom coraz bardziej mnie wkurza. Jednak umozliwia tez prace na konkretnych rejestrach procesora wiec na pewno da sie cos wywalczyc.
Masakra w bascomie to wysylanie ciagu znakow po RS232. Piszesz print "dzien dobry" a on zatrzymuje program i wysyla po kolei wszystkie znaki. Przy wolnej transmisji zatrzymuje procesor na kilakdziesiat milisekund! Masakra! Na szczescie juz doszedlem jak sobie z tym poradzic. A masakra masakr jest odczyt RC5 ktory zatrzymuje prace programu na 125ms czyli na caly czas trwania ramki transmisji. W nowszysch wersjach kompilatora nieco to poprawili
Nie znam Bascoma, ale zapewne to co piszesz nie wynika z samego języka, tylko ze sposobu w jaki wykorzystywane funkcje zostały napisane. Zapewne da się to zrobić inaczej. Niemniej pocieszę cię (albo zasmucę) - w C można to tak samo zepsuć, co więcej 95% osób wykorzystujących mikrokontrolery zrobi to dokładnie tak jak Bascom - znaczy w sposób blokujący. Idę o zakład, że podobnie będzie to działać w ostatnio modnym Arduino.
Da się tak jak w C przy czym w Bascomie wystarcza tylko poprawne wykorzystanie przerwań i obsługa "manualna" kilku rejestrów co akurat dla większości bascomowców jest problematyczne, bo język sam z siebie przyzwyczaja do rozwiązań podanych na tacy. A skoro już trzeba robić coś ręcznie, żonglować bitami w rejestrach, ustawiać przerwania etc. to równie dobrze można to zrobić w C przy czym ma się dużo większą kontrolę nad tym co rzeczywiście pod kolejnymi własnoręcznie napisanymi funkcjami się dzieje. Z drugiej strony teraz napisanie programu dla Xmega który będzie wykorzystywał jakieś zaawansowane funkcje procków (event, dma) to kilka "config" i już działa. Napisanie tego samego w C zajmie więcej czasu. I tutaj jest pies pogrzebany. Arduino jest takim Bascomem a'la C. Bardzo, bardzo wiele rzeczy jest nieoptymalnie zrobionych, z drugiej strony podpinasz, konfigurujesz, korzystasz z gotowych funkcji i działa. Może wolno, może zasobożernie, ale działa. I dla naprawdę wielu osób liczy się tylko to by działało!
Zerknijcie do tego mojego postu sprzed godziny.
Otwórz bibliotekę mcs.lib i zakomentuj cztery linijki po czym skompiluj biblioteke.
Jeśli to Ci nie wystarczy to już po samych opisach w niej zajarzysz co czym się tam je.
Tak, wiemy o co koledze chodzi, tylko to zadziała jedynie pod warunkiem kiedy mamy pomiar single (na żądanie) albo zawsze z tego samego kanału mux bierzemy pomiary (bo nie wskoczy nigdy pomiar z poprzedniego kanału czy też zakłócony przez muxa - jak dobrze kojarzę przy zmianie kanału atmel zaleca olanie pierwszego wyniku), ale jednocześnie nie wyeliminuje czasu oczekiwania na zakończenie konwersji, prawda? A Irkowi chodzi o to by nie zatrzymywać pętli oczekiwaniami na konwersje, pobieraniem kolejnych bajtów i wysyłaniem przez UART aż do końca stringa etc. etc. I tutaj nie pomoże wycinanie kodu z bibliotek, a jedynie rozsądne wykorzystanie przerwań.
Im dłużej zwlekasz tym więcej tracisz - Nowy Rok przed nami więc może postanowienie noworoczne?
Wiem, ze to bylby dobry krok, bo ostatnio kupilem na alledrogo atmege328 patrze a moj bascom jej nie obsluguje Niestety za stary jestem na poczatki jezyka C, ja jestem specjalista od analogowki
Dodano po 2 [minuty]:
tronics wrote:
No to przecież pisałem jak zacząć, reszta to niestety nota katalogowa w rękę i kolego pracujesz! Dodam, że BASCOM akceptuje rejestry ADMUX i ADCSRA, a w nich musisz szukać odpowiedzi co i jak ustawić. A skąd odczytać? No jak skąd? Z ADC! Tak, właśnie taka jest nazwa tego rejestru (a właściwie ADCH i ADCL, ale iirc Bascom jak i AVR-libc zawierają poskładany rejestr 16bit ADC).
Oooo widze ze juz blisko Wiec ponegocjujmy Bo ja w note patrzylem i ocenilem meczarnie na dwa dni wiec wszedlem na forum pierwszy raz od 10 lat zeby zaoszczedzic te dwa dni. Wiec jakbys mi jeszcze podal rejest bascoma od multipleksera
Wiem, ze to bylby dobry krok, bo ostatnio kupilem na alledrogo atmege328 patrze a moj bascom jej nie obsluguje Niestety za stary jestem na poczatki jezyka C, ja jestem specjalista od analogowki
Z naszą pomocą dasz radę - także wiekowi nieco jesteśmy, co widać po moim awatarze
Macie panowie racje. Generalnie to dawno temu zaczlem przygode z bascomem wtedy na 89C4051 ale poleglem i dalem sobie spokoj na wiele lat. Teraz wrocilem do tematu. Zaczalem od prostackich programow gdzie np delay 1sekunda sluzyl mi do mrugania ledami itd. Wstawialem takich delai wiele i mi diodki mrugaly jak cos tam mialem zglosic. Ale zaczalem sie zastanawiac ze skoro procek przez tyle sekund nic nie robi to jak ja uzyje watchdoga? No i zaczalem myslec jak pisac programy zeby bylo dobrzea nie tak zupelnie po amatorsku. Ostatnio udalo mi sie zredukowac w programie wygodne w bascomie liczby zmienno przecinkowe i okazalo sie ze parwie 20% flesha mi sie zwolnilo. Do tego wiecej skokow do podprogramow a nie powtarzanie w kolko pamieciozernych instrukcji. Wiec po woli dojrzewam do bycia prawdziwym programista Wiele klopotu programista sprawiaja timery zawsze chca ich miec jak najwiecej, zeby odmierzac byle co. Ostatnio zaczalem pisac inaczej.
Ostatni moj program sklecilem tak:
jeden timer odmierza 1ms zglaszajac przerwanie ustawia flage. Na poczatku programu odczytyje ta flage i zwiekszam liczniki kolejnych flag dla 10ms i 100ms itd. Potem w programie dziele instrukcje na te wykonywane co 1ms, co 10ms i co 100ms. Co 1ms odczytyje klawisze, wielokrotny odczyt zastepuje mi debounce klawisze. Bascom typowo zceka kilkanascie milisekund i odczytuje klawisze ponownie co jest bez sensu. Co 10ms zmieniam wyjscia przelaczajace przekazniki bo przeciez i tak szybciej nie bede dzialac. A co 100ms wysylam cos na RS232.
Nie wiem czy to dobre podejscie, ocene sami. Na pewno zaczynam pisac z glowa i juz nie uzywam opoznien tylko licze te moje milisekundy
I wlasnie dlatego potrzebuje obsluzyc ADC w tle bez zatrzymywania proca. Moze te 200us nic by nie wnioslo ale ja chce sie nauczyc.
Wiec wlasnie sie dowiedzialem od was ze po ustawieniu muxa pierwszy pomiar nalezy wyrzucic do kosza. Nie wiem dlazcego. Moze potrzebna jest pewna sekwencja ustawic mux odczekac, wlaczyc ADC, odczekac, odczytac dane. Nie wiem czy jest dostep do rejestu sterujacego sample $ hold. Moze trzeba do otworzyc na jakis czas a potem zamknac a nastepnie uruchomic adc?
start adc i stop adc z tego co wiem to wlacza i wylacza zasilanie. Wiec nadal nie wiem jak rozpoczac konwersje i jak sie dobrac do mux-a. Dobzre ze sie dowiedzialem o rejestrach ADCH i ADCL Idziemy w dobrym kierunku
Dodano po 3 [minuty]:
tronics wrote:
Nie dam ryby, dam wędkę.
Ryby mi zalujesz I to w swieta Dawaj rybe!
Dodano po 9 [minuty]:
tronics wrote:
a jedynie rozsądne wykorzystanie przerwań.
No wlasnie rozsadne. Atmega8 nie ma pritytetow przewan. Ostatnio pisalem program mierzacy impulse zewnetrzny w zakresie 500-2000us. Podalem sygnal na zewnetrzne przerwanie w ktorym uruchamialem timer. Niestety tylko 8bitowy, wiec jego przerwanie inkrementowalo programowy licznik. No i pojawil sie problem bo czasem zliczenia byly o dokladnie 256 us nizsze. Okazalo sie ze w trakcie wchodzenia w przerwanie zewn pojawialo sie przerwanie wewn i gubilem jeden cykl (256 impulsow) Dopiero w przerwaniu zewnetrznym zaczalem sprawdzac flage przerwania wewnetrznego i sam inkrementowalem licznik. Jednak potem okazalo sie ze kolejny wynik pomiaru mam o 256 za duzy. Musialem w przerwaniu zewn dodatkowo zresetowac flage przerwania wewn. znalezienie tych flag to byla kilku dniowa mordenga. Dlatego teraz prosze znawcow
Skoro już dochodzisz do rejestrów, ponownie doradzę: Zmień język na C.
Jeśli nie jest to dla Ciebie "gardłowy, terminowy projekt", to zrób ten pierwszy krok od razu .. teraz ... natychmiast
Terminowy projekt to to nie jest. To taki spontan hobbystyczny. Projektow mam wiele a ciagne aktualnie ten ktorego temat mi sie w rejestrze mozgowym spodobal
Z angielskim u mnie kulawo bo 100lat wbijali mi ruski dokumentacje technicza jakos czytam ale glownie napiecia i pradu bo ja analogowcem jestem Petle mas, zaklocenia, brumy szumy, znieksztalcenia to moj zywiol
Ale dzieki dondu, widze ze tak jak ja w analogowce Ty ostro walczysz w cyfrowce Obiecuje ze tematem oscyloskopu a dokladnie generatora i FFT bede cie meczyl Kupilem AVT2999 ale nie jestem zadowolony jednak pewne mozliwosc wykorzystania tego cacka mi sie pojawily
Niestety znajomość angielskiego bardzo ułatwia pozyskanie wiedzy w tej dziedzinie. Ale pocieszę Ciebie, że ja także musiałem nadrabiać czasy stracone na rosyjski w podstawówce i liceum. A pierwszą książkę do ZX Spectrum tłumaczyłem słówko po słówku ze słownikiem w ręku
No nic, jeśli podejmiesz wyzwanie, to na mnie możesz liczyć. Jeśli nie, to koledzy Bascom'owcy dadzą wędkę, a na święta może i upragnioną rybę
Kolego irek2 - dlatego podałem link do takiego prostego przewodnika po uruchamianiu ADC, w połączeniu z notą katalogową będziesz wiedział jakie wartości do jakich rejestrów wpisać. W tym przypadku jest pokazane jakie bity jakich rejestrów po kolei ustawiać. Wierz mi, że to jest wystarczająca ilość informacji.
A pierwszą książkę do ZX Spectrum tłumaczyłem słówko po słówku ze słownikiem w ręku
A ja zaczynalem w basic-u na atari 65XE i moze dlatego mam do niego sentyment
Ale zeby nie bylo probowalem czytac asembler. Ale jak mi sie zaczely snic akumulatory (A,B) to dalem sobie spokoj. Jednak skladnie i pewne komendy pamietam
Dodano po 2 [minuty]:
tronics wrote:
Wierz mi, że to jest wystarczająca ilość informacji.
Wiem, wiem, mialem nadzieje, ze jakis bascomowiec ma gotowca, bo juz przez to przechodzil. Ale tak jak juz zostalo powiedziane malo kto sie tak przejmuje tym co robi procesor wiec jak sobie poczeka 200us na wynik z ADC to nic sie nie stanie.
No coz musze zaczac grzebac w rejestrach. Choc po ostatnich kilku godzinach spedzonych na szukaniu drobnego bledu czuje ze obecnie nie jestem w formie. Ech ta pogoda..
Teoretycznie tak jak myslalem i tak jak pisaliscie ale w bascomie diabel tkwi w szczegolach. Caly dzien szukalem odpowiedniej skladni. Po prostu bascom nie zawsze widzi nazwy rejestrow/bitow tak jak sie one nazywaja. Np mux0=0 czy reset mux0 nie dziala, kompilator zglasza blad, choc piszac set mux0 nie zglasza bledu. Nalezy napisac ADMUX.0=0 itd. Co ciekawe komplilator nie zglasza bledu jak sie napisze ADMUX.9=0? Kolejny problem to ze nie udalo mi sie odczytac 16 bitowego rejestru ADC, kompilator go nie widzi. Trzeba odczytac najpierw ADCL a potem ADCH i to koniecznie w tej kolejnosci. Dopiero po odczycie ADCH przetwornik wpisze nowa wartosc (dla pracy single). Bascom nie widzi bitu ADSC, nalezy napisac Adcsr.6=1 zeby wystartowac konwersje. Po zakonczeniu mkonwersji ADC zeruje ten bit mozna sprawdzic przed odczytem. U mnie i tak czekam 1ms wiec wiem ze konwersja sie zakonczyla. Zamieszczam taka prosta obsluge ADC moze sie komus przyda:
u mnie wejscie w ten podprogram co 1ms
Code: vbnet
Log in, to see the code
Moderated By dondu:
Wklejając kod używaj proszę znacznika SYNTAX dla Basic - poprawiłem za Ciebie.
No i gratulacje.
Tak podpowiem jak ktoś wykorzystuje tylko połowę UART`u, na przykład tylko nadaje temperaturę do jakiegoś modułu to pin RX jest bezużyteczny (nie działa na nim 1Wire ani dosłownie nic) Można go śmiało uruchomić wyłączając odbiornik (na przykład) w UCSR0B.4 = 0 który normalnie ma wyższy priorytet niż DDRB Przydaje sie taki myk też jeśli mamy LCD na tym samym porcie co UART a używamy Bootloadera.
Wersja demo ma ograniczenia "Included demo license enables up to 4096 bytes of FREE output code." co na wymagania hobbysty powinno wystarczyć
I to jest właśnie bezsensowne samoograniczanie się. Gdy program już rozrasta się ponad tak niewielką objętość jak 4kB nagle okazuje się, że należy szukać $ albo innego języka. Gdy nie ma się tych 200$ to wtedy nagle przypomina sobie co doradzali inni i wścieka się na siebie, że nie posłuchał od razu, bo teraz całą pracę, którą włożył będzie musiał pisać od nowa.
Bierze więc się wreszcie za kurs C z kompilatorem online i nagle ze zdziwieniem stwierdza, że "strach miał wielkie oczy" o takie: i że ten strach wynikał z własnych lęków wzmacnianych na forum przez samoograniczających się takich jak on sam forumowiczów.
A po miesiącu cieszy się już tylko z wydajności programu, braku ograniczeń oraz zaoszczędzonych $ w kieszeni i wspomina stracony czas:
Electix wrote:
Co do BASCOM to za wiele Ci nie pomogę, bo moja przygoda z tym językiem się bardzo szybko skończyła. Po paru godzinach zabawy jak przekonałem się jak duże ograniczenia ma ten język i jak potwornie jest "nieekonomiczny" rzuciłem go na rzecz ASM i C.
pawel-jwe wrote:
Odnośnie języków programowania AVR'ów to zauważyłem pewną zależność, każdy kto uważa że BASCOM jest lepszy i bardziej mu pasuje, uważa tak tylko do momentu kiedy zacznie programować w C/C++.
... zima przed nami ... długie wieczory można zamiast na film, poświęcić na C