Systemy wbudowane 2017 - pytania

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 :sweat:. 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.

1 polubienie

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”.

1 polubienie

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.

  1. 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? :grin: :grin:

  1. 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:
23315999_1567217546649913_527537025_n

Jakiego rzędu wyniki sąwiarygodne? Mój program “wypluwa” wynikii rzędu:forum

Wiarygodne to przynajmniej różne od 0.

1 polubienie

Te wyniki nie wyglądają zbyt wiarygodnie szczególnie te proste operacje wykonywane 60k cykli

1 polubienie

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:forum

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 :confused:). 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

2 polubienia