Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega][C] ADC LED = oświetlenie do modelu RC.

modrzej1988 13 Maj 2011 00:04 11955 161
  • #1 13 Maj 2011 00:04
    modrzej1988
    Poziom 13  

    A więc tak. Planuję zrobić układ oświetlenia do modelu RC (tak wiem, że można to kupić ale ceny są kosmiczne).
    W założeniu nie jest to trudne - kilka linijek kodu i diody błyskają jak chcę. Lecz nie w tym rzecz. Chcę całość zrobić tak, żeby parametry "migania" diód (przypuśćmy 4 kanały) można było zmieniać przy użyciu aplikacji na PC (podpiąć USB lub RS232 i przeprogramować). Gdybym tylko ja korzystał z tego układu nie było by problemu, ale robię go dla wuja który nie ma zielonego pojęcia o obsłudze mikrokontrolerów. Problem w tym, że nie mam bladego pojęcia jak się za to zabrać.
    Liznąłem trochę Borlanda więc chcę w nim zrobić aplikację okienkową. Co do programowania AVR-ów, jedyny akceptowalny przeze mnie język to BASCOM. Trudno mi sobie wyobrazić zatem, jak przy użyciu borlanda skompilować program w języku Bascom i władować go do pamięci procka. Myślałem o zapisie parametrów zmiennych do pamięci EEPROM skąd program główny pobierał by wartości. Wygenerowanie pliku .hex w borlandzie nie było by chyba problemem, tylko czy tak wygenerowany plik był by odczytany później przez mój program główny ?
    Zapewne kombinuję jak koń pod górę dlatego będę wdzięczny za wszelkie sugestie i wskazówki w tej kwestii.

    0 29
  • Arrow Multisolution Day
  • #2 13 Maj 2011 00:13
    dondu
    Moderator Mikrokontrolery Projektowanie

    modrzej1988 napisał:
    Liznąłem trochę Borlanda więc chcę w nim zrobić aplikację okienkową.

    Masz na myśli Borland C++?
    Jeżeli tak, to po co do tego mieszać BASCOM?

    modrzej1988 napisał:
    Co do programowania AVR-ów, jedyny akceptowalny przeze mnie język to BASCOM.

    Po stronie AVR wystarczy GCC czyli C: Pełne środowisko za FREE

    0
  • Arrow Multisolution Day
  • #3 13 Maj 2011 00:27
    modrzej1988
    Poziom 13  

    dondu napisał:

    Masz na myśli Borland C++?
    Jeżeli tak, to po co do tego mieszać BASCOM?


    Tak Borland C++ Builder

    dondu napisał:

    Po stronie AVR wystarczy GCC czyli C: Pełne środowisko za FREE


    No tak wiem, że takie coś istniej tylko, że ja ni w ząb nie czaję C

    0
  • #5 13 Maj 2011 00:40
    modrzej1988
    Poziom 13  

    W c++.
    A procki umiem tylko w Bascomie no i właśnie tutaj tworzy się wąskie gardło.

    0
  • #6 13 Maj 2011 00:41
    dondu
    Moderator Mikrokontrolery Projektowanie

    modrzej1988 napisał:
    W c++.
    A procki umiem tylko w Bascomie no i właśnie tutaj tworzy się wąskie gardło.

    Z całym szacunkiem, ale skoro C++ na PC, to tym bardziej C na AVR - nie ma się czego bać. Ale zrobisz jak zechcesz.

    0
  • #7 13 Maj 2011 00:50
    modrzej1988
    Poziom 13  

    Nie wiem spróbuję jakoś powalczyć z tym GCC może uda się urodzić coś co będzie działało. Tylko najpierw musi mi przyjść zestaw uruchomieniowy bo na sucho to nie ma co.

    0
  • #9 13 Maj 2011 09:54
    xamrex
    Poziom 28  

    Kiedyś zrobiłem coś podobnego
    Napisałem program w c do uC (chociaż równie dobrze może być bascom)
    Ogólny zarys jest taki:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Nie pamiętam już składni bo dawno przesiadłem się z bascoma na C, ale to ma być coś w ten deseń.
    Jak już to napiszesz, to to potem sprawdzasz czy działa.
    Odpalasz bascomowy terminal i wysyłasz 1 powinna ci się zaświecić dioda w porcie d1.
    Jak klikniesz 2 to dioda w porcie d2
    itd.

    Teraz ja napisałem kod w Delphi. Na forum znalazłem przykładowy kod w delphi do obsługi Rsa, potem przerobiłem go tak, że po uruchomieniu wysyłał przez Rsa kod 1

    Zrobiłem sobie 3 take programy, i każdy wysyłał coś innego pierwszy wysyłał kod 1, drugi kod 2, a trzeci kod 3.
    I w taki sposób powstały mi 3 programy i w zależności który uruchomie zaświecała mi się dioda ;)

    Życzę powodzenia :)

    0
  • #10 24 Maj 2011 02:01
    modrzej1988
    Poziom 13  

    A więc po małej przerwie młody padawan - czyli ja - potrzebuje wskazówek i pomocy.
    Ostrzegam, że nigdy nie miałem do czynienia z programowaniem AVR-ów w C++ więc mój sposób pisania itd. jest raczej wyciągnięty z normalnego programowania.
    No dobra to do rzeczy.
    Skrobnąłem kilka linijek kodu do sterowania 2-ma kanałami. W zamyśle ten pierwszy jest do sterowania strobami na skrzydłach modelu, a drugi natomiast do oświetlenia pozycyjnego na ogonie. Niby wszystko jest fajnie, ładnie ale jednak to jeszcze nie to co chciał bym uzyskać.
    Mianowicie, zależy mi na tym, żeby oba kanały działały od siebie niezależnie (no ustawienia błysków itd. mam już w osobnych parametrach), ale chodzi mi jeszcze o zależność, na którą nie będzie miało wpływu kolejne wykonywanie się kodu.
    Obecnie działa to tak, że wykonuje najpierw jedną funkcję a później drugą (to każdy widzi). Ale co, jeżeli np. będę chciał dorzucić kanał sterujący oświetlenie ciągłe? Tzn. świecące cały czas w tym samym czasie kiedy pozostałe mrygają?
    Coś mi dzwoni (ale nie wiem w którym kościele), że prawdopodobnie potrzebuję tutaj użyć przerwań? Czy dobrym tropem idę? Że mimo kolejnego wykonywania się kodu, to światełko co ma ciągle świecić będzie świeciło bez przerwań? Utknąłem na tym etapie, a bardzo by się to przydało nawet przy tym oświetleniu które mryga (da mi to większą niezależność).
    Obecnie kod wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    A tu film http://www.youtube.com/watch?v=AMp-J2MMgUc

    Naprawdę wszelkie wskazówki będą bardzo pomocne :)

    0
  • #11 24 Maj 2011 14:41
    dondu
    Moderator Mikrokontrolery Projektowanie

    Gratuluję odwagi i porzucenia języka eskimosów :)

    Zacznijmy od tego, że:
    - nie podałeś typu mikrokontrolera
    - przydałby się schemat by łatwiej Ci pomóc.
    - będziesz używał timerów i przerwań (tak jak się domyślasz) więc nieco poczytaj o nich, bo jak znam życie to jeszcze wpadniesz na dodatkowe pomysły i zapewne mikrokontroler wykorzystasz jeszcze do innych celów, w końcu przy takich zadaniach on się będzie nudził przez 99,99% czasu.
    - czy ten model jest zasilany akumulatorem? (to ważne bo inaczej będziesz musiał pisać program)

    0
  • #12 24 Maj 2011 14:47
    modrzej1988
    Poziom 13  

    kontroler to ATmega644p a co do schematu to są to po prostu diody podciągnięte pod wyprowadzenia portu PA (diody zapalane zerem).

    Czyli jednak opóźnienia tutaj nie są najlepszym rozwiązaniem i trzeba przerobić to na timer?
    Tak model jest zasilany z akumulatora, ale to nie jest problem, żeby dorobić do tego modułu dodatkowe zasilanie +5V.
    W ogólnym założeniu chcę jeszcze całość zrobić włączaną z odbiornika modelu sygnałem sterującym serwa.

    0
  • #13 24 Maj 2011 14:55
    dondu
    Moderator Mikrokontrolery Projektowanie

    Jeżeli nie chcesz oszczędzać akumulatora to nie trzeba, ale radziłbym jednak by uczyć się nowych rzeczy.

    Pytanie dodatkowe kiedy ma być załączone te "dodatkowe światełko" które ma się świecić ciągle?
    Innymi słowy rozpisz dokładnie w punktach jak ten układ ma sterować LEDami.
    Namawiam Cię abyś jednak schemat zrobił - wiele problemów często z tego wynika, a nam i Tobie oszczędzi czas na ewentualne szukanie błędów.

    0
  • #14 24 Maj 2011 15:14
    modrzej1988
    Poziom 13  

    A więc tak.

    Na razie tym dodatkowym ciągłym światłem nie trzeba się przejmować. Na razie zakładam, że go w ogóle nie ma. Ale jeżeli nawet w późniejszym czasie miało by ono być włączane zdalnie (zresztą tak jak cały moduł oświetlenia).

    Na chwilę obecną chcę to zorganizować tak, żeby te 2 kanały (strobujący i pozycyjny) nie wykonywały się jeden po drugim tak jak leci kod programu, tylko działały niezależnie od siebie tak jak by wielowątkowo (nie wiem czy to się da zrealizować na kontrolerze).

    Ogólny schemat połączenia diód (z ewentualnym późniejszym rozbudowaniem o dodatkowe tranzystory) wygląda tak jak w załączniku (nie rozrysowywałem już zasilania procka bo to raczej oczywiste).

    0
  • Pomocny post
    #15 24 Maj 2011 15:21
    dondu
    Moderator Mikrokontrolery Projektowanie

    modrzej1988 napisał:
    Na chwilę obecną chcę to zorganizować tak, żeby te 2 kanały (strobujący i pozycyjny) nie wykonywały się jeden po drugim tak jak leci kod programu, tylko działały niezależnie od siebie tak jak by wielowątkowo (nie wiem czy to się da zrealizować na kontrolerze).

    Po to one są by się dało :)

    Wariant A: Skoro mają być niezależne a poza nimi mikrokontroler ma nie robić nic innego to:
    - pozycyjne zrobimy na deley()
    - a strobowe na timerze z przerwaniem
    Może być?

    Czy oba mają swoje określone okresy, czy wykonują się w losowych okresach?

    Wariant B: Albo oba zrobimy na timerach, a mikrokontroler uśpimy, by zużywał jak najmniej energii.

    Który wariant wybierasz?

    modrzej1988 napisał:
    Ogólny schemat połączenia diód (z ewentualnym późniejszym rozbudowaniem o dodatkowe tranzystory) wygląda tak jak w załączniku (nie rozrysowywałem już zasilania procka bo to raczej oczywiste).

    - dla porządku rezystory dawaj pomiędzy zasilanie a diodę.
    - pokaż jeszcze jak masz rozwiązane zasilanie lub zaglądnij tutaj: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html

    0
  • #16 24 Maj 2011 15:37
    modrzej1988
    Poziom 13  

    Rezystory rozrysowałem tak, jak są wlutowane w moją płytkę uruchomieniową.

    http://and-tech.pl/EvB4.3/schemat_v4.png

    Ale zakładając poprawioną wersję wyglądało by to ogólnie tak jak w załączniku.
    Poza tym widzę, że chyba czeka mnie jeszcze inwestycja w książkę bo bez niej to daleko nie zajadę.

    Ale najpierw rozkminię sterowanie diodami przez timera, bo wpadł mi jeszcze jakiś durny pomysł z wykorzystaniem PWM-a, tylko jeszcze sobie nie mogę wyobrazić jak miał bym to niby zrealizować, więc to był głupi pomysł :P

    Co do okresowości, to pozycyjne miało by być jak najbardziej okresowe, a stroby najlepiej jak by były losowe (jakąś funkcję losującą by się urodziło) wówczas całe oświetlenie było by bardziej realistyczne.

    0
  • #17 24 Maj 2011 15:43
    dondu
    Moderator Mikrokontrolery Projektowanie

    modrzej1988 napisał:
    Co do okresowości, to pozycyjne miało by być jak najbardziej okresowe, a stroby najlepiej jak by były losowe (jakąś funkcję losującą by się urodziło) wówczas całe oświetlenie było by bardziej realistyczne.

    Chwilowo robię obiad dla mojej niewiasty, ale do losowości wykorzystamy przetwornik ADC - ale o tym później.

    Co do reszty to za 20 minut.

    0
  • #18 24 Maj 2011 15:45
    modrzej1988
    Poziom 13  

    Będę czekał :) i tak jestem bardzo wdzięczny za wszelką pomoc :)

    0
  • Pomocny post
    #19 24 Maj 2011 16:25
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ok, jestem - nie miałem w ręku tego procesora więc musimy poczytać datasheet.
    Znajdź go i wklej tutaj link.

    Uwagi do schematu:
    1. masy masz podłączone bo na schemacie nie :)
    2. nie widzą filtrowania zasilania patrz tutaj: http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html
    3. błędy filtrowania ADC akurat się przydadzą do liczb losowych, więc tego tematu nie poruszam.
    4. rozumie, że układ nowy i działa na fabrycznie ustawionym wewnętrznym zegarze?
    5. reset przez rezystor do Vcc : patrz link podany przeze mnie 4 posty wyżej

    I odpowiadaj punktami będzie szybciej i porządek.


    EDIT: 17:00
    ponieważ Cię nie ma to wklejam link: http://www.atmel.com/dyn/resources/prod_documents/doc8011.pdf
    Poczytaj na razie o Timer0.

    0
  • #20 24 Maj 2011 17:26
    modrzej1988
    Poziom 13  

    1. Co do schematu to machnąłem go tylko poglądowo bo i tak wszystko narazie jest robione na zestawie uruchomieniowym więc kwestiami konstrukcyjnymi na razie się nie przejmuję.
    2. Z timerem już się kiedyś zapoznawałem ale nie od tej strony :P Później postudiuję trochę tego pdf-a

    0
  • #22 24 Maj 2011 21:48
    modrzej1988
    Poziom 13  

    No zestaw, zestaw :P
    Przeczytałem o tym ADC (sterowania nic nie ogarniam) no i przede wszystkim trudno mi jakoś sobie wyobrazić jak zmusić przetwornik A/C do samoczynnego generowania przebiegu prostokątnego na porcie kontrolera...
    Istna czarna magia..

    0
  • #24 24 Maj 2011 21:51
    modrzej1988
    Poziom 13  

    Pewnie, że mam :) Więc jeżeli to nie problem chętnie przystąpię do dzieła...

    0
  • Pomocny post
    #25 24 Maj 2011 21:54
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ja to widzę tak:

    - ustawisz ADC w tryb Free Running, czyli będzie na okrągło wykonywał pomiary na jakimś wejściu a ponieważ wejście zostawimy niepodłączone, to jest szansa na losowe bity.

    - po skończeniu pomiaru ADC wywoła przerwanie które będziemy wykorzystywać do wszystkich Twoich potrzeb nie tylko do generowania losowej liczby. Innymi słowy ADC zastąpi nam generator liczb losowych i timer jednocześnie.

    I to zadanie na początek.

    EDIT
    ponieważ jak wnioskuję nie jesteś kompatybilny z przerwaniami :)
    to dla ułatwienia przerwanie będzie wyglądać tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #26 24 Maj 2011 22:25
    modrzej1988
    Poziom 13  

    Ja wnioskując, że nie jestem w ogóle kompatybilny z czym kolwiek :P pytam, czy właśnie tak przebiega włączenie ADC ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie jestem też pewien co do ustawień prescalera...
    Ogólnie, bez jakiej kolwiek książki to będzie droga przez mękę :/

    0
  • Pomocny post
    #27 24 Maj 2011 22:39
    dondu
    Moderator Mikrokontrolery Projektowanie

    Oczywiście książka, by się przydała bo czas zaoszczędzi ci nieludzko:
    http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html

    Ale widzę że początek jest niezły, zaraz opiszę co i jak :)

    Dodano po 11 [minuty]:

    ADMUX = 0
    1. czyli wybrałeś ARef - pytanie czy Twój zestaw ma tam kondensator i czy mozna go wyłączyć jakąś zworką?
    2. pin ADC0 masz wolny i nie podłączony do niczego?

    3. uwagi do składni

    Kod: c
    Zaloguj się, aby zobaczyć kod

    choć jeszcze nie sprawdziłem czy właściwe dla nas ustawienia - za moment sprawdzę.
    Czy wiesz co oznacza (1<<x) ?

    0
  • #28 24 Maj 2011 22:48
    modrzej1988
    Poziom 13  

    przypisanie wartości z lewej na prawo.
    A co z takim zapisem: _BV(ADEN) ? czy jest to równoważne z (1<<ADEN)?
    Na AREF nie ma żadnego kondensatora, jest tylko wyprowadzony pin do podłączenia.
    Z tym ADMUX sugerowałem się innym kodem z jakiegoś "wprowadzenia do gcc".
    Wszystkie piny ADC0..7 są wolne gotowe do podłączenia czegokolwiek.

    0
  • #29 24 Maj 2011 22:54
    dondu
    Moderator Mikrokontrolery Projektowanie

    (1<<4) oznacza przesunięcie 0b00000001 o 4 bity w lewo czyli w wyniku otrzymujesz 0b00010000
    Czyli jeżeli ADEN jest 7 bitem rejestru ADCSRA to wykonując (1<<ADEN) wykonujesz tak naprawdę (1<<7) czyli w wyniku otrzymujesz 0b10000000
    Teraz już jasne?

    _BV() nie używaj bo najnowsze trendy ułatwiające rozumienie kodu wszystkim oraz przenoszenie między procesorami sugerują używanie (1<<x)

    Tutaj nieco teorii: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html

    Konfiguracja ADCSRA jest prawie doskonała z wyjątkiem niepotrzebnego ustawiania flagi przerwania ADIF

    A co z ADCSRB i dlaczego?

    Jeśli chodzi o preskaler to najpierw pytanie na jakim zegarze pracujesz?

    0
  • #30 24 Maj 2011 23:11
    modrzej1988
    Poziom 13  

    ADSCRB ma na wszystkich trzech dopuszczonych do konfiguracji bitach przy trybie free run ustawione 0, więc IMO pozostają bez zmian (nie trzeba ich ustawiać ponieważ domyślnie są na 0).
    Nie wiem, mogę się mylić, ale to wnioskuję z PDF-a

    Zegar będzie 16MHz i raczej wewnętrzny (wg. mnie nie jest tu potrzebna jakaś szaleńcza dokładność zegara kwarcowego).

    0