Skoro Pan Marek Materzok zaczął zamieszczać na tym forum ogłoszenia związane z SW 2017. Postanowiłem zadać też i tutaj pytanie dotyczące drugiej listy z SW. Jak na razie mam wrażenie, że kolega Kacper Kulczak “odwalił” kawał dobrej roboty, ale jednak ciągle mało osób korzysta z tego forum. Mam nadzieje, że wkrótce więcej osób przekona się do tej formy komunikacji z prowadzącymi i innymi studentami, ale żeby to nastąpiło trzeba zacząć tutaj dyskusję na inne tematy niż tylko kwestie techniczne dotyczące forum. Szkoda, żeby czas jaki włożył w to kolega Kacper poszedł na marne.
Przechodząc do pytania:
Czy w zadaniu trzecim można wzorować się na przykładzie podanym w Arduino Playground tj. https://playground.arduino.cc/Code/PCMAudio?
Zalinkowany program jest bardziej złożony niż jest to wymagane w tym zadaniu - np. używa przerwań. Ale jako inspiracja do napisania czegoś prostszego może się nadać.
Rozumiem, że chcąc zadać kolejne pytanie, piszemy pod tym postem?
W każdym razie, mam mały problem z timerem.
Chciałem poświecić na próbę diodą z określoną jasnością, więc najpierw ustawiłem sobie timer2:
//timer2 PORTB3
TCCR2A |= (1 << COM2A1); //non inverting
TCCR2B |= (1 << WGM20) | (1 << WGM21); //fast pwm 8bit
TCCR2B |= (1 << CS20); /* CPU clock / 1 => 31250Hz */
//potem włączam:
OCR2A = 200;
DDRB |= (1 << PORTB3);
no i dioda nie wykazuje znaków życia . Co tutaj zrobiłem źle?
Bity WGM20 i WGM21 są w rejestrze TCCR2A, a nie TCCR2B. Należy uważnie czytać dokumentację, a w razie problemu sprawdzić dokładnie, czy wszystko się zgadza.
Czy nasza dioda ir wymaga jakiegoś szczególnego podłączenia? Po potraktowaniu jej jak zwykłej diody czerwonej nie widać żadnego światła w aparacie telefonu (widzi światło pilota tv).
Kolejne pytanie tym razem do 1 zadania, czy schodkowa zmiana jasności między np:
OCR0A = 1,a OCR0A = 2 (RGB wspólna anoda) bardzo przeszkadza?
Diodę IR podłącza się analogicznie do diod świecących w świetle widzialnym, jej napięcie otwarcia wynosi około 1.2V. Dioda z zestawów to LL-503IRT2E-2AC, jest przejrzysta i lekko niebieska, oto jej nota katalogowa: http://www.luckylight.cn/UploadFiles/pdf_2013110813838951331.pdf
Jeśli chodzi o zmianę jasności – ponieważ z racji użycia trzech wyjść PWM co najmniej jeden kanał musi być 8-bitowy, spodziewam się, że zmiany jasności na najciemniejszych ustawieniach mogą być “schodkowe”.
Po podłączeniu odbiornika IR zgodnie z dokumentacją, na wyjściu odbiornika (gdy nie świecę na niego światłem podczerwonym) jest 0v - czyli chyba tak, jak powinno być. Jednak PIN, do którego podłączyłem wyjście jest prawie cały czas na 1 (dioda, która sygnalizuje, że PINx jest na 1, świeci się delikatnie). Wygląda to trochę, tak jak bym podłączył sam kabelek do pinu i zbliżył do niego rękę - jednak w tym przypadku dioda sygnalizująca święcący pin świeci się cały czas z tym samym natężeniem, bez względu na to, czy zbliżam rękę do kabli.Nie wiem co z tym zrobić. Jak to podłączyć żeby działało?
Należy zwrócić uwagę, że czujnik z zestawu (OSRB38C9BA) posiada wyjście typu otwarty kolektor (pojedynczy tranzystor NPN od strony GND), wobec czego wymaga rezystora pull-up, podobnie jak przycisk. I podobnie jak w przypadku przycisku, wykrycie sygnału będzie sygnalizowane pojawieniem się 0, domyślnym stanem będzie 1.
Mam dwie wątpliwości.
- W zadaniu 5 listy 2 mieliśmy obliczyć “czas (w cyklach) wykonywania różnych operacji matematycznych”
Mój program wyrzuca wyniki w których większość operacji wykonuje się w 0; max 3 cyklach.
Co dziwne - po uruchomieniu tego samego programu przez mojego znajomego na jego arduino (i komputerze; moze to też ma jakiś wpływ choć wątpię?) dostał on wiarygodne wyniki rzędu setek. Czy to normalne? Moje arduino jest aż tak szybkie?
- Ze skosu wziąłem implementację UARTu. BAUD zdefiniowany jest na 9600 (nic nie zmieniałem). Ale mimo tego, jeżeli chcę odczytać wyjście (cmd screen port_arduino 9600) to dostaję jakieś dziwne znaczki, ALE jeżeli uruchomię nasłuchiwanie (tak to można nazwać?) na 19200 to już wszystko widze poprawnie.
I uwaga - u znajomego, który testował mi przypadek 1 jest również inaczej tzn. na 9600 mu wszystko śmiga z moim programem…
Co jest grane?
I na dole u znajomego:
Jakiego rzędu wyniki sąwiarygodne? Mój program “wypluwa” wynikii rzędu:
Wiarygodne to przynajmniej różne od 0.
Te wyniki nie wyglądają zbyt wiarygodnie szczególnie te proste operacje wykonywane 60k cykli
Korzystacie z tych samych kompilatorów i środowisk? U mnie kompilator robił dziwne optymalizację i pomiary czasu wychodzily po 1 mimo pętli, zmiennych danych i wypisywanych na wyjście wyników obliczeń. Okazało się (podziękowania dla @Zjonn za pomoc :>) że musiałem przypisywać dane do zmiennych i co najważniejsze potem te zmienne wykorzystać w jakimś dodawaniu i wynik tego dodawania zwrócić na końcu w funkcji main(). Inaczej kompilator najwyraźniej zmieniał miejsce wykonywania obliczeń lub uznawał je za niepotrzebne i w ogóle je ignorował.
Możesz jeszcze spróbować wyłączyć garbage collection dla danych, w atmelu wygląda to mniej więcej tak (nie testowałem :3).
Dobra dzięki znalazłem błąd teraz wygladaja już raczej wiarygodnie:
Podpowiedź pierwsza: dodawanie liczb 8-bitowych w rejestrach zajmuje 1 cykl. Wraz z dostępami do pamięci o kilka cykli więcej. Można się delikatnie pomylić (np. o te koszty dostępu do pamięci).
Podpowiedź druga: optymalizator może sprawić, że nie będziecie mierzyć tego, co faktycznie zmierzyć chcecie. Optymalizacje można wyłączyć, albo zmodyfikować program tak, aby optymalizator nie ruszał mierzonych operacji. Jedną metodę już ktoś w tym temacie zasugerował, inne możliwości: użycie słowa kluczowego volatile, albo wydzielenie mierzonych operacji do funkcji w osobnym pliku źródłowym.
Jeszcze nie do końca, zauważ że modulo zajmuje Ci jeden cykl, a nie powinno. Prawdopodobnie wykonałeś działanie na tych samych danych, co w dzieleniu i dla programu wystarczyło wykonać dzielenie żeby znać wynik modulo. Czyli najpierw a/b się policzyło, a potem a mod b wynik był już znany. Zamień na przykład na b mod a i juz będzie lepiej
Ale ok juz mam gdzie był błąd teraz jest dużo większa wartość. Dzięki za pomoc
Jak dokładnie ma wyglądać “zbliżenie obiektu” w zadaniu 2? obiekt ma się zbliżyć od góry zarówno diody jak i czujnika? Czy ma się znaleźć między nimi? To ma działać jakoś na zasadzie odbicia światła? No ale dioda wydaje się świecić we wszystkie strony i nawet jak ustawie ją równolegle do odbiornika, to odbiornik dalej wykrywa to światło (co więcej, nawet przedmiot między nimi musi być dosyć dużej powierzchni, żeby odbiornik przestał odbierać światło ). Jak można to jakoś wygodnie rozwiązać?
Mi pomogło podłączenie do diody IR opornika z większa rezystancja(10kohms). Wtedy dioda IR świeci na tyle słabo, że można ją ustawić ‘za’ odbiornikiem, nawet bardzo blisko i nie wykrywa on fal. Odbiornik reaguje dopiero przy zrobieniu ‘daszku’ z dłoni nad tymi dwoma elementami