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.

[ATmega8][avr-gcc] Bariera optyczna

madiz08 13 Lut 2014 20:41 4584 37
  • #1 13 Lut 2014 20:41
    madiz08
    Poziom 14  

    Witam
    sporo czasu zajęło mi szukanie informacji na temat bariery podczerwieni z odbiorników typu TSOP (głównie za banalne pytania wywalano moje posty do kosza ), ale po przeczytaniu http://www.elportal.pl/pdf/k07/25_08.pdf udało mi się dzisiaj w końcu to zrobić na attiny2313 w płytce avt3500 z kursu Bascom z EDW. Tak jak pisałem na początku tematu taka płytka kosztuje sporo, a po wyjęciu attiny2313, bez rezonatora i dodatkowej pamięci nic nie zrobię. Dzięki tutaj odpowiedziom wiem już, że Atmega może pracować na rezonatorze wewn. i wiem jakie jest minimalne podłączenie, poczytałem o zasilaniu i wiem już jak do tego mikrokontrolera maja być podłączane wejścia i wyjścia.
    Teraz moje pytanie:
    paluszasty napisał, że kurs EDW wystarczy, ja mam bascom1.11.8.1,
    1. czy tym programem, będę mógł wgrać program do atmegi?
    2. może pytanie banalne, ale STK200 jak patrzałem na avt ma wejście na 20-nóżkowy procesor, a ATmega8 ma 28 nóżek, czyli jest jakiś inny programator, który pozwoli mi przez mój program BascomAVR załadować program do atmegi?

    Dodano po 4 [minuty]:

    jutro poczytam też o ISP Programmer

    Moderowany przez LordBlick:

    Proszę na przyszłość dzielić tematykę zakładanych dyskusji, ma to podstawowy celi - być użyteczne również dla innych użytkowników poszukujących podobnych informacji.

    0 29
  • Arrow Multisolution Day
  • Pomocny post
    #2 14 Lut 2014 01:09
    emarcus
    Poziom 35  

    madiz08 napisał:
    Witam
    .............
    Teraz moje pytanie:
    paluszasty napisał, że kurs EDW wystarczy, ja mam bascom1.11.8.1,
    1. czy tym programem, będę mógł wgrać program do atmegi?
    2. może pytanie banalne, ale STK200 jak patrzałem na avt ma wejście na 20-nóżkowy procesor, a ATmega8 ma 28 nóżek, czyli jest jakiś inny programator, który pozwoli mi przez mój program BascomAVR załadować program do atmegi?

    Dodano po 4 [minuty]:

    jutro poczytam też o ISP Programmer


    Ad 1. Tak, ale nie tylko tym... jest dużo programów obsługujących process wpisywania programu do pamięci flash AVR...
    Ad 2. Tu może potrzeba trochę wyjaśnienia; STK200 nie ma nic wspólnego z AVT
    Oryginalnie (historycznie - koniec ubiegłego stulecia) STK200 to był "STarter Kit - inaczej 'płytka uruchomieniowa, testowa, jakkolwiek ją zwiesz, pozwalająca na programowanie i testowanie wszystkich w tym czase dostępnych processorów Atmel: 8-pin, 10-pin, 20, 28 i 40 pin. Te w poczatkowej fazie z serii AT90Sxxx nie miały wewn. oscylatorów, dlatego absolutnie wymagały stosowania zewnętrznego źródła taktowania, bądż to w postaci kompletnego oscylatora albo tylko rezonatora kwarcowego podłączonego do pozostałej wymaganej części układu oscylatora wbudowanej w układ uControllera. Ta opcja pozostała do dziś w tej samej formie, z tą różnicą że dodatkowo wbudowano tam wewnętrzny oscylator RC przez co nie ma knieczności stosowania zewn. żródeł taktowana. Na ogół to wystarcza, jednak z pewnymi ograniczeniami.
    Wszystkie ATtinyxx i AtMegaxx sa tak zbudowane.

    Ponadto, wszystkie AVR zarówno te najmniejsze 8-pinowe Attiny, jak i te kilkadziesiąt pinowe AtMega, maja ten sam układ (koncept) programowania; ISP- czyli poprzez 4 wymagane linie łączące go z programatorem (MOSI, MISO, SCK oraz RST), naturalnie dodatkowo musi być podłączone zasilanie. Porównaj dowolny datasheet.
    To co gdzieś w internecie znalazłeś na temat programatorów STK200, odnosi się do wielu uproszczonych układów wykorzystujących komputerowe porty LPT lub Serial COM oraz stosujące protokoł kommunikacji oparty na STK200. Podobnie jest z obecnie z często stosowanym STK500. To wszystko powyżej mozesz zaliczyć do antycznej technologii. Obecnie, jest dość trudno spotkać komputer z LPT albo serial COM port; - w zamian masz przeważnie USB. I pod taką konfigurację będziesz potrzebował kompletopwać swój srzęt.
    Na szczęście jest on wyjtkowo tani (!!!) i obsługiwany przez większość programów zarówno Bascom jak i Atmel studio, a już w najlepszym układzie AVRDUDE, na którym opiera sie większość 'cukierkowych'- graficznych nakładek.
    Praktycznie wiec, wystarcza średniej wielkości płytka stykowa i ogólnie dostępny programator. W zależności jak głęboko i poważnie 'wciągniesz się' w ten temat, nabędziesz programator powiedzmy ten najtańszy za 20 zł, lub inny "klasowy"-
    "AVR JTAG ICE and AVRISP/STK500 2in1 programmer V4"
    albo Atmel DRAGON. w średniej cenie powyżej $50.
    Możesz też wykonać ten jeden z prostszych (USBASP) we własnym zakresie, - wiele ludzi ze skromnym budżetem tak robi.

    e marcus

    0
  • #3 26 Lut 2014 13:54
    madiz08
    Poziom 14  

    Dzisiaj dotarł do mnie programator do ATmega8 na programowanie z USB. Ściągnąłem AVRdude, podobno jest możliwość programowania przez ten program z nakładką Bascoma. Czytam trochę o tym ustawieniu FUSBIT, no ale okazuje się, że w mojej mieścinie gdzie dwa elektroniczne na krzyż nie dostanę samego procka także zamówiłem z netu pare sztuk i czekam. W międzyczasie chciałem zapytać o poprawność podłączenia dla płytki na której chce zamontować ATmegę
    [ATmega8][avr-gcc] Bariera optyczna
    Znaczy te trzy elementy tranzystor, diodaIR i r25Ω wiem, że są ok, bo na płytce z AVT3500 świetnie mi to działa jako nadajnik paczek impulsów do odbiornika TFMS5360. Chodzi mi o sprawdzenie minimalnego podłączenia, aby Atmega działała sprawnie. Całość zasilana 4x1,5V ,czytając o zasilaniu z baterii zdecydowałem się na stabilizator 3,3V pod Atmega8L, dodałem jeszcze kondensator 100uF dla stabilizacji i pozostałe dwa elementy jak w opisie.

    Dodano po 6 [minuty]:

    A jeszcze miałem zapytać czy przy zmianie stanu logicznego pinu PC4 co 14us rezonator wewn. jest na tyle dokładny, żeby sygnał zmieniał się z f=38kHz, bo czytałem, że przy dużych częstotliwościach lepiej zstosować kwarc, ale nie wiem czy 38kHz to dużo?

    0
  • Arrow Multisolution Day
  • #4 26 Lut 2014 20:48
    Marek_Skalski
    Moderator Projektowanie

    Ponownie archeologia elektroniczna ;]

    Atmega 8 (zabytek) - działa prawidłowo tylko przy zasilaniu od 4,5 do 5,5V.
    Atmega 8 i zasilanie bateryjne to jakiś oksymoron.
    Atmega 8 i generowanie sygnału zewnętrznego 38kHz - masochizm?
    Ale jak ktoś bardzo chce, to może w to brnąć.

    Ja mam takie uwagi:
    Zamiast atmega 8 użyj uC, który może pracować w szerszym zakresie napięć (np. od 2,7V do 5,5V - choćby atmega 8L) i zasilaj go bezpośrednio z 3 baterii. Stabilizator będzie zbędny i nie będziesz zamieniał połowy energii w ciepło.
    Nie wiem gdzie znalazłeś tranzystor BC337 (pewnie w tym samym muzeum), ale zastąp go jakimkolwiek logicznym MOS-FETem, który kosztuje ok. 0,50 PLN/szt. i pewnie będzie tańszy niż BC337, a znakomicie lepiej sprawdzi się w roli klucza dla diody IR.
    Naprawdę zachęcam do użycia jakiegoś nowszego uC, który będzie pobierał mniej prądu w każdym stanie pracy (aktywny, jałowy, uśpiony), będzie miał sprzętowe wsparcie do transmisji danych przez podczerwień, np. bardziej inteligentne układy transmisji szeregowej z buforem danych, co zapewnia ciągłość transmisji, albo sprytniejsze liczniki, które można łączyć razem, aby generować częstotliwość nośną i sygnał.
    Schemat, który narysowałeś nie obejmuje złącza dla programatora.
    Kondensator 100u będzie zbędny przy zasilaniu bezpośrednio z baterii. Ale 100n zamontuj możliwie blisko wyprowadzeń uC.

    0
  • #5 26 Lut 2014 22:02
    madiz08
    Poziom 14  

    No napisałem właśnie, że użyję Atmega8L, ale nie mogę kupić u siebie (wyprowadzenia pinów me takie same chyba jak zwykła Atmega8), jak czytałem o zasilaniu to napisano, że przy zbyt małym napięciu procesor może działać niepoprawnie, albo nawet się uszkodzić, dlatego warto dac stabilizator, który przy zbyt małym napięciu baterii poprostu odłączy zasilanie, ale racja nawet 5mA na stabilizator to jeszcze raz tyle energii co na samą Atmegę.
    BC337 polecono mi w innym moim poscie https://www.elektroda.pl/rtvforum/viewtopic.php?t=2761783&highlight= gdzie odradzono mi mosfeta. Ogólnie mój układ wykorzystuję jako bariera podczerwieni w łóżeczku rocznej córki, jeden pin nadaje właśnie paczki impulsów IR, odbiornik przy odpowiednich impulsach daje okresowo stan niski. Drugi pin sprawdza czy w danym momencie jest ten niski stan, jeżeli tor zostanie przerwany to drugi pin nie ma stanu niskiego i w tym momencie na trzecim pinie załącza się stan wysoki, który przez tranzystor włącza dzwonek bezprzewodowy nadający do 100m sygnał do odbiornika, informując, że dziecko wstało, gdy jesteśmy w miejscu skąd nie słychać jej. Może wydaje się prostackie, ale to naprawdę dobra rzecz (taki dzwonek bezprzewodowy można dostać za 9zł nawet) za nieduże pieniądze.
    Chciałbym taki nadajnik i odbiornik zrobić jako dwa oddzielne moduły i każdy zasilany swoim napięciem.
    Zabytek mówisz? :). Ja po paru latach przerwy po technikum wybrałem się na Automatykę i Robotykę, teraz cały czas robimy jakieś proste programowanie na 8086, na 4-tym semestrze czyli za rok dla mnie mają być podstawy mikrokontrolerów i podobno wszystko na 8-bitowym 8051 także to chyba dopiero są zabytki, pozatym sposób nauczania i tak mało godzin na te przedmioty to porażka, ale nie miejsce chyba żeby o tym pisać.
    Moja wiedza na temat uC to jedynie kursy z EDW i to mam opanowane podstawy typu reakcja na wejście, wyjście, trochę timery i przerwania. Jak czytam o wsparciu sprzętowym dodatkowo to jest to dla mnie na razie magia. Jak trochę więcej czasu będę miał to chcę zaopatrzyć się w jakąś książkę do tego Atmega muzeum jak piszesz :), które w porównaniu do tego z AVT3500 ma swoją pamięć flash i wewn. rezonator.
    A na razie zrobię jak piszesz, jak przyślą mi 8L to zasilę bezpośrednio z 3x1,5V i 100nF możliwie najbliżej uC

    1
  • #6 27 Lut 2014 02:49
    dondu
    Moderator Mikrokontrolery Projektowanie

    madiz08 napisał:
    ... jak czytałem o zasilaniu to napisano, że przy zbyt małym napięciu procesor może ... się uszkodzić, ...

    Podaj proszę źródło.

    madiz08 napisał:
    Moja wiedza na temat uC to jedynie kursy z EDW i to mam opanowane podstawy typu reakcja na wejście, wyjście, trochę timery i przerwania. Jak czytam o wsparciu sprzętowym dodatkowo to jest to dla mnie na razie magia.

    To zaglądnij tutaj: http://mikrokontrolery.blogspot.com/p/spis-tresci.html

    0
  • #7 27 Lut 2014 07:58
    madiz08
    Poziom 14  

    w paru miejscach czytałem o zasilaniu bateryjnym ale byłem prawie pewien, że o tym uszkodzeniu przy zbyt niskim napięciu czytałem tu https://www.elektroda.pl/rtvforum/topic2369885.html a teraz to przeglądam i nic nie widzę, chyba sam siebie wprowadziłem w błąd.

    0
  • #8 04 Kwi 2014 21:13
    madiz08
    Poziom 14  

    Od niedawna próbuję programowania Atmegi w języku C ,zmontowałem sobie płytę testową, mam programator USB i w wolnych chwilach powoli przyswajam sobie to wszystko.
    Mam pytanie:
    Chcę np. jak poprzednio na płycie AVT3500 na Attiny zrobić barierę podczerwieni, gdzie w mikrokontrolerze wykorzystuję jedynie 3 piny
    [ATmega8][avr-gcc] Bariera optyczna
    [ATmega8][avr-gcc] Bariera optyczna
    gdzie PORTD.2 ma nadawać paczki impulsów do odbiornika, na zmianę zmieniać 18razy swój stan z 0 na 1 po czym przez 100ms ma na nim być 0.
    PORTC.3 jako wejście z odbiornika. Teraz widać, że przy nadawaniu f=36kHz na wyjściu odbiornika jest stan niski. Jeżeli D2 zmienia swój stan co 18razy to w tej pętli za każdym razem jakaś zmienna zwiększa się o 1 do 18-tu i jak jest równa 10 to w tym momencie chcę sprawdzać stan C3, jeżeli jest=1 to na D7 ma być 0, a jak C3=0 to na D7 ma być 1, co oznacza, że bariera jest przerwana lub nie.

    W Bascomie miałem możliwość ustawienia każdego PINU PORTU indywidualnie np:
    PORTB.4 = 1
    natomiast w "C" już taki kod wywala mi błąd:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    jeżeli ustawiam cały port to nie ma problemu PORTD=0x04 na PORTD=0x00, ale przeszkadza to aby na D7 był cały czas stan mówiący o stanie bariery IR,

    także chciałbym zapytać jak mogę indywidualnie nastawiać każdy PIN potru z osobna?

    Dodano po 6 [minuty]:

    aha, i czy te else dotyczy drugiego warunku, czyli PORTC.3=1?

    0
  • Pomocny post
    #9 05 Kwi 2014 11:00
    Tomq
    Poziom 38  

    Cytat:
    także chciałbym zapytać jak mogę indywidualnie nastawiać każdy PIN potru z osobna?

    Np.
    PORTC |=0x08
    PORTB |= (1<<PB6)
    Poczytaj o operatorach bitowych - http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operator-bitowy-or.html


    Else dotyczy poprzedzającego go ifa.
    http://mikrokontrolery.blogspot.com/2011/02/if-warunkowa-instrukcja-sterujaca.html
    http://www.kursc.forbot.pl/


    Cytat:
    if (i=10) if(PORTC.3=0) PORTD.7=1;

    ta składnia jest bardzo niepoprawna. Po pierwsze to nie możesz użyć operatora przypisania ("=", czyli znaku "równa się" tam gdzie powienien być operator przyrównania ("==", czyli dwa znaki "równa się" obok siebie").
    Po drugie if powinien być skonstruowany tak, że piszesz warunek (czyli to co jest w nawiasie), a po tym instrukcje. U Ciebie natomiast jest kilka ifów obok siebie.
    Nie wiem co chciałeś osiągnąć ale powienieneś użyć, albo operatorów logicznych ( http://mikrokontrolery.blogspot.com/2011/02/operatory-logiczne-jezyka-c.html ), albo zagłębionych instrukcji warunowych:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 05 Kwi 2014 13:20
    madiz08
    Poziom 14  

    dzięki, zaraz spróbuję to poprawić

    Dodano po 55 [minuty]:

    Działa

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Można powiedzieć, że za 9zł, bo tyle mnie to wszystko kosztowało mam w pełni działającą barierę podczerwieni
    [ATmega8][avr-gcc] Bariera optyczna
    Jeszcze raz podziękował :)

    0
  • #11 05 Kwi 2014 14:22
    el2010tmp
    Poziom 25  

    madiz08 napisał:
    PORTD =(PORTD & 0x08) ;

    Lepiej by było:
    PORTD&=~(1<<7);

    0
  • #12 05 Kwi 2014 15:27
    Tomq
    Poziom 38  

    Ciesze się, że się udało.
    Teraz możesz postawić przed sobą ambitniejsze zadanie i spróbować wykorzystać timery zamiast funkcji delay. Może w tym projekcie nie zrobi to różnicy, ale będzie okazja do nauki wykorzystania timerów, co będzie jak znalazł, gdy w przyszłości przyjdzie pisać funkcje nieblokujące.

    Funkcja delay zatrzymuje całkowicie na pewien czas działanie programu, nastomiast timery można użyć tak by program tylko sprawdzał czy minął już czas, a jeśli nie to dalej robił swoje.

    Tu są pomocne materiały:
    http://diycenter.acid19.linuxpl.com/readarticle.php?article_id=3

    0
  • #13 06 Kwi 2014 13:04
    madiz08
    Poziom 14  

    Dzięki, właśnie ostatnio szukałem trochę informacji na temat timerów w Atmedze , super strona, wszystko łopatologicznie wytłumaczone także chyba nie powinienem mieć problemów (chociaż w Bascomie właśnie na tym się zatrzymałem), ale najpierw jeszcze chcę sobie przyswoić w języku C te operatory logiczne, funkcje. Znalazłem kurs http://www.kursc.forbot.pl/ , chcę w pare dni to przerobić.
    Tu np. chyba takie timery przydały by się jak chciałbym zrobić zsynchronizowane ze sobą odbiornik i nadajnik bezprzewodowe (zasilane bateryjnie) to przy zastosowaniu _delay_ co chwilę byłby błąd (tak mi się wydaje)

    Ale chciałbym jeszcze zapytać o sprawdzenie kodu bo jednak coś tu niegra. Wczoraj wydawało mi się, że czasami dioda (docelowo jakiś przekaźnik) jakby mrugnęła przez chwilę. Nie mam oscyloskopu, dla oka niezauważalne są szybkie zmiany i napisałem na płytce AVT3500 w Bascomie program, sprawdzający zmiany stanu bitu PD.0, który sprawdza właśnie sprawdza stan D7 z Atmegi, każda zmiana to +1 na wyświetlaczu, przy pięciu na 2sek przerwa i od zera sprawdza. No i właśnie mam cały czas 5 na wyświetlaczu także te moje wyjście D7 na atmedze nie jest cały czas takie samo, a zmienia się co chwilę.

    Dodano po 4 [minuty]:

    a czy takie coś to wyzerowanie bitu?: PORTD |= ~(1<<3);

    Dodano po 10 [minuty]:

    no tak, jak w jednej linijce mam PORTD = 0x00; to nie ma się co dziwić, ale dalej chciałbym zapytać o te zerowanie bitu

    0
  • #14 06 Kwi 2014 13:46
    Tomq
    Poziom 38  

    Cytat:
    a czy takie coś to wyzerowanie bitu?: PORTD |= ~(1<<3);

    Bit zerujesz innym operatorem (mnożenie bitowe):
    Kod: c
    Zaloguj się, aby zobaczyć kod




    Kurs na stronie forbot jest bardzo przystępnie napisany (dawałem do niego link w poprzednim poście). Jakbyś miał problemy z timerami to pisz śmiało. Pochwalam przejście z Bascoma na C, jeszcze trochę i zauważysz jaki C jest wygodny, uporządkowany i elastyczny.

    0
  • #15 06 Kwi 2014 21:52
    madiz08
    Poziom 14  

    Bardzo chętnie jeżeli jest możliwość skorzystam z pomocy jeżeli miałbym problemy z timerami, powiem że temat bardzo mnie wciągnął (szkoda tylko że w tygodniu czasu na to mam niewiele, nawet dzisiaj na pare godz. do pracy)

    Wiem, że założony temat jest ogólnie moimi pytaniami na temat Atmegi, jej podłączeń i programowania, a tu trochę nawijam wokół swojego układu, ale jak moderator nie wywali mi postu bo nie chciałbym zakładać oddzielnego tematu to chciałem jeszcze zapytać co dalej jest nie tak w kodzie:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ogólnie ten odbiornik podczerwieni na wyjściu (wejście C3 w Atmedze) ma logiczne 1 przy podłączonym zasilaniu, przy wysyłaniu z f=36kHz od kilkunastu do kilkudziesięciu impulsów diodą IR, czyli u mnie bitem nr3 portu D, to na wyjściu odbiornika podczerwieni w tym momencie jest logiczne 0.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie można cały czas puszczać impulsów tylko musi być przerwa, która powinna byc przynajmniej kilkakrotnie dłuższa niż paczka impulsów dlatego tutaj dałem
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a tak to wygląda na wykresach jak wcześniej juz pisałem:
    [ATmega8][avr-gcc] Bariera optyczna
    i dlatego jeżeli puszczam 20 takich impulsów to przy 13-tym na wyjściu C3 powinno byc logiczne 0 i dlatego właśnie wtedy sprawdzam stan C3. Przy takim kodzie przy niezasłoniętej "barierze IR" mam cos takiego:
    [ATmega8][avr-gcc] Bariera optyczna
    AVT3500 ma zliczac kolejne zasłonięcia bariery od 0 do 5 po czym 3sek. przerwy i na nowo zlicza. Jak jest przejście IR to cyfry przeskakują co te 100ms do 5, a jak jest zasłonięte to na wyświetlaczu mam ciągle 5
    [ATmega8][avr-gcc] Bariera optyczna
    , także zmiany są znacznie szybsze i nie wiem dlaczego, wykluczam wadliwą diode IR lub odbiornik, bo na tych samych na AVT3500 w Bascomie mi to działało.

    Zastanawia mnie te wyzerowanie bitu PORTD&=~(1<<3); tak jak teraz Tomq mi to wytłumaczył wcześniej napisał mi to też el2010tmp, ale nie wiedziałem, że to o to chodzi. Czy po takim poleceniu ustawia bit na 0 niezależnie czy wcześniej było na nim 1 czy 0?

    Aj, cos takiego jak te operatory logiczne było w technikum na układach cyfrowych, trzeba było się tego uczyć :)

    Dodano po 5 [minuty]:

    na to zerowanie juz sam zobaczyłem
    Kod: c
    Zaloguj się, aby zobaczyć kod

    dioda mignie na te 100ms czyli bit jest zerowany bez względu czy wcześniej było na nim 0 czy 1.

    0
  • #16 07 Kwi 2014 08:00
    madiz08
    Poziom 14  

    (na przyszłość będę już rozdzielać tematy)
    znalazłem jeden błąd, po zamianie PORTD = (1<<3); na PORTD | = (1<<PD3); przy zasłoniętej diodzie IR na wyświetlaczu jest cały czas 0 (lub cyfra przy której w danym momencie nastąpiło zasłonięcie), czyli w takim stanie bit D7 nie ulega zmianie.

    Ale przy braku zasłony dioda led(wyjście D7) dalej lekko pulsuje i cyfry na wyświetlaczu zmieniają się jakby wolniej, chyba co 200ms czyli co drugi cykl pętli

    0
  • #17 07 Kwi 2014 12:50
    LordBlick
    VIP Zasłużony dla elektroda

    Jeśli watchdog w fusebitach jest włączony, to program będzie się zachowywał inaczej niż przewidziano...

    0
  • #19 07 Kwi 2014 23:32
    madiz08
    Poziom 14  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    No właśnie wydaje mi się, że kod jest w porządku, ale na tych samych elementach i programie w Bascomie działa mi to poprawnie, a ta niepoprawność tutaj to:
    Przy zmianie bitu D3 (nadawania diody ir) co 15us na wyjściu odbiornika (wejście C3) powinno być 0
    Czy w taki sposób zmieniam co 15us stan Bitu D3?
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Zmieniam tak 20 razy i przy 13-tej zmianie if(i==13);
    najpierw jeżeli bariera jest zasłonięta, czyli na wejściu C3 powinno być 1, to chcę żeby na D7 było też ustawione 1
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    i tu działa jak należy bo po zasłonięciu na D7 jest cały czas 1, ale też zapytam czy taki warunek jest prawidłowy?

    W przeciwnym wypadku, czyli jak dioda nadaje na odbiornik, to w momencie sprawdzenia na C3 powinno być 0 i w tym samym czasie bit D7 powinien być ustawiony na 0
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Jeżeli dioda nadaje na odbiornik to przy każdym sprawdzeniu na C3 powinno być 0, także na bicie D7 przez cały czas powinno być 0, a jak pisałem dioda led podłączona do D7 co chwila puszcza delikatne mignięcie, czyli nie jest tam na stałe 0, ale stan D7 ulega zmianie, a nie powinien.

    Czy według ciebie te zmiany D3 i sprawdzanie warunków jest napisane prawidłowo?

    Dodano po 33 [minuty]:


    na początku gdy jest zasłona nie ma zmian stanu D7 i na wyświetlaczu jest 0, a dioda led jest na stałe zapalona.
    W 4-tej sekundzie na filmiku odbiornik jest skierowany na IR, teraz dioda powinna zgasnąć, a jak widać nie gaśnie całkowicie. AVT3500 jest zaprogramowane, żeby przy każdym kolejnym zasłonięciu, czyli zmianie na D7 zwiększyć cyfrę na wyświetlaczu, przy 5-tej zmianie program zatrzymuje się na 3sek. i ponownie sprawdza.

    Napisano mi tez że to może ustawienie na fusebitach, na razie niewiele o tym wiem, trudno poprostu na razie odpuszcze sobie to i przerabiam kurs forbota, dzisiaj zrobiłem część drugą i do trzeciej właśnie trawi mi się płytka pod Atmege16, ale w tym temacie jeszcze na pewno chciałbym zapytać na temat timerów w związku z moją barierą jak przerobię forbota.

    0
  • #21 08 Kwi 2014 21:28
    el2010tmp
    Poziom 25  

    Tomq napisał:
    Cytat:
    if(PINC & 0x08)

    Tu jest błąd.

    Zastosowałeś operator bitowy ("&") zamiast logicznego ("&&").


    Warunek sprawdza bit trzeci portu C więc operator musi być bitowy.

    Bardziej czytelny zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    madiz08 napisał:
    Czy w taki sposób zmieniam co 15us stan Bitu D3?
    PORTD |= (1<<3); // tu ustawiam 1
    _delay_us (15);
    PORTD &= ~(1<<3); // tu zeruję
    _delay_us (15);

    Nie. W ten sposób wysyłasz jeden impuls a następnie sprawdzasz warunek [w tym czasie stan portu D się nie zmienia a bit D.03 jest wyzerowany].

    Odbiornik TSOP potrzebuje sygnału z diody nadawczej f=38kHz a ten program takiego sygnału nie generuje. Skorzystaj z przerwania TIMERA i wygeneruj poprawny sygnał.

    0
  • #22 08 Kwi 2014 21:49
    madiz08
    Poziom 14  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    no właśnie chcę aby sprawdzenie tego stanu było przy 13-tym impulsie, dlatego jest najpierw jest warunek if(i==13);

    Dzisiaj przerabiam część trzecią forbota i teraz właśnie zrozumiałem o co chodzi z tymi operatorami bitowymi i logicznymi, bo czytając miałem ze zrozumieniem tego problem. Czyli jak mam i==13 to sprawdzane jest czy 8-bitowa zmienna "i" jest równa 13.
    Teraz tu jest sprawdzany bit if(PINC & 0x08)
    a jak zastosuje && to cały rejestr jest porównywany z cyfrą 8 czy tak?

    0
  • Pomocny post
    #23 08 Kwi 2014 21:59
    el2010tmp
    Poziom 25  

    madiz08 napisał:
    Teraz tu jest sprawdzany bit if(PINC & 0x08)
    a jak zastosuje && to cały rejestr jest porównywany z cyfrą 8 czy tak?

    Jak zastosujesz && to dla PINC różnego od zera będzie:

    "if(TRUE AND TRUE) "

    W przypadku wyrażeń logicznych wartość TRUE ma każde wyrażenie różne od zera.

    A z tym 13-impulsem to jakaś "magia"? :)
    Bez sygnału 38kHz TSOP będzie głupiał.

    0
  • Pomocny post
    #24 08 Kwi 2014 22:34
    dondu
    Moderator Mikrokontrolery Projektowanie

    madiz08 napisał:
    Teraz tu jest sprawdzany bit if(PINC & 0x08)
    a jak zastosuje && to cały rejestr jest porównywany z cyfrą 8 czy tak?

    Sprawdź w CManiaku: http://mikrokontrolery.blogspot.com/p/cmaniak-kompilator-jezyka-c-online.html
    ten program:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i wszystko będzie jasne :)

    0
  • #25 09 Kwi 2014 11:30
    madiz08
    Poziom 14  

    Ale ten kompilator to świetna sprawa. Takie to proste było, a sporo czasu na zrozumieniu straciłem. Wczoraj też zrobiłem sprawdzenie na płytce:
    [ATmega8][avr-gcc] Bariera optyczna [ATmega8][avr-gcc] Bariera optyczna
    sprawdziłem tez na OR i juz wiem dokładnie o co chodzi>
    Tak tylko na szybko z tą magiczną 13-tką odpowiem. Jak pisałem wcześniej warunek jest sprawdzany w momencie gdy na wejściu C3 powinno być 0, taki stan tam powinien byc odimpulsu 2 może 3 do ostatniego, a ja wybrałem poprostu 13-ty. W bascomie napisałem taki program:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    I tu i tam częstotliwość na diodę IR nadaje procesor (chociaż ktoś juz mi tu napisał w żarcie że to masochizm :) ) w bascomie PD.5, PD.0 to wejście z odbiornika, a PD.2 to wyście na przekaźnik. Wszystko działa tam, może ma wpływ na to, że tam jest rezonator 4MHz czyli wykonywanie jest 4x szybsze. Ciekawi mnie jak takie nadawanie paczek impulsów diody IR mozna zrobić na timerach ne555(na razie niewiele o nich wiem), ale o tym już poszukam sobie przy okazji lub napisze nowy temat, żeby nie pisać tu na 100 różnych tematów. Jak przerobię do końca ten kurs C to napewno zapytam o timery

    0
  • #26 09 Kwi 2014 22:41
    el2010tmp
    Poziom 25  

    madiz08 napisał:
    Ciekawi mnie jak takie nadawanie paczek impulsów diody IR mozna zrobić na timerach ne555(na razie niewiele o nich wiem), ale o tym już poszukam sobie przy okazji lub napisze nowy temat


    Masz w ATmega8 kilka timerów a "nadawanie paczek impulsów" w przerwaniu timera można zrobić za pomocą dwóch linijek kodu [licząc po jednej instrukcji w linii :)]

    0
  • #27 22 Kwi 2014 14:04
    madiz08
    Poziom 14  

    Trochę więcej czasu niż myślałem zajęło mi przerobienie kursu FORBOT, sporo tez czasu straciłem na trawieniu płytek i ich lutowaniu, ale nieważne wszystko wyszło ok i sporo wiedzy sobie przyswoiłem, także wczoraj zacząłem czytać temat timerów
    http://diycenter.acid19.linuxpl.com/readarticle.php?article_id=3
    podany mi przez Tomq no i trzeba powiedzieć, że artykuł świetnie napisany, łopatologicznie linijka po linijce co i jak.
    Poszczególne ustawienia były opisane dla Atmega16, a że dalsze części kursu FORBOTa były prowadzone też na tym, także podłączyłem sobie pod PB0 swój stary nadajnik IR, a pod PB3 odbiornik:
    [ATmega8][avr-gcc] Bariera optyczna

    Kod: c
    Zaloguj się, aby zobaczyć kod


    TCCR1B |= (1 << CS10); tutaj timer1 ustawiony bez preskalera
    OCR1A = 15; przerwanie generowane po 15-tu taktach bo 15µs powinien trwać ten sam stan na diodzie IR (procesor taktuje milion razy na sekundę)

    Moje pytanie czy na razie wszystko dobrze jest napisane?
    Najpierw co 15µs zmienia się stan diody nadawczej, dalej po nadaniu 40 takich impulsów, kiedy zmienna "i" jest większa niż 80 to dioda jest wyłączana na 60ms, po czym zmienna jest zerowana i tak cały czas w koło.

    Chodzi mi o to, że jak na telefonie sprawdzam te nadawanie mam wrażenie, że ta przerwa między błyskami (między 40 impulsami) jest dużo dłuższa niż 60ms.

    A moje drugie pytanie co by było jak np. instrukcja przerwania jest długa i zanim się skończy to już przerwanie zostaje generowane na nowo, tak jak u mnie np. było by więcej i zanim doszło by do końca gdzie zmienna zostaje zwiększona o 1?

    0
  • #28 22 Kwi 2014 20:58
    BlueDraco
    Specjalista - Mikrokontrolery

    Jest źle napisane. Nie masz szans wyrobić się z obsługą przerwania w 15 cyklach procesora. Użyj timera w trybie PWM, wtedy przerwania będziesz miał z częstotliwością np. 38 kHz. Zwiększ też częstotliwość procesora do 8 MHz.

    0
  • #30 22 Kwi 2014 21:11
    el2010tmp
    Poziom 25  

    madiz08 napisał:
    unsigned int i;

    Zmienne globalne wykorzystywane w przerwaniach powinny być deklarowane jako volatile.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Można je również deklarować lokalnie wewnątrz przerwania jako zmienne statyczne.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0