Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 mar 2026, o 05:28


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 3 sty 2015, o 16:52 
Offline
Nowy

Dołączył(a): 03 sty 2015
Posty: 2
Pomógł: 0

Witam, próbuję nauczyć się zliczać impulsy z zewnętrznego źródła - w tym przypadku czujnika koloru. Dokumentacja: botland.com.pl/attachment.php?id_attachment=185

Wykorzystany procesor: ATMEGA8
Napisałem następujący program (dioda ma się zapalać gdy zostanie zliczony chociaż jeden impuls z czujnika):

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Układ nie działa. Mógłby ktoś spróbować mi pomóc i jakby była możliwość, wytłumaczyć jakie błędy zrobiłem? Układ został podłączony następująco:
- zasilanie +5V na VCC, AVCC oraz RESET przez rezystor 10k
- masa na wszystkich pinach GND
- kondensator 100nF pomiędzy VCC i GND
- zewnętrzny rezonator kwarcowy 8MHz (podłączony z kondensatorami 22pF, Fuse-Bity przestawione)
- PB0 (ICP1) - wyjście OUT czujnika
- PC5 - dioda z rezystorem 1k podłączona katodą do masy
- PC4 - wejście czujnika aktywujące OUT stanem niskim
- PC3, PC2 - wyprowadzenia czujnika S0 i S1 (stan wysoki na obu - zakres częst. 500kHz)
- PC1, PC0 - wyprowadzenia czujnika S2 i S3 (stan wysoki na obu - zielona fotodioda)

Dodatkowo mam pytanie, czy mój tok rozumowania jest dobry? Jeżeli ustawiłem czujnik na zakres pomiarowy 500kHz, natomiast częstotliwość taktowania procesora to 8MHz (preskaler = 1), to w takiej sytuacji mogę zliczyć maksymalnie 4096 impulsów ze źródła zewnętrznego zanim nastąpi przepełnienie po zliczeniu 65536 impulsów z sygnału taktującego? Wyliczyłem to następująco:
Czas do przepełnienia tp = ( 1 / 8MHz ) * 65536 impulsów = 0,008192s
Najkrótszy czas pomiędzy impulsami z czujnika (największe natężenie barwy) tc = 1 / 500kHz = 0,000002s
Maks. liczba zewnętrznych impulsów zliczonych aż do przepełnienia = tp / tc = 4096.



Ostatnio edytowano 3 sty 2015, o 17:45 przez komandorebombardiero, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sty 2015, o 18:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

dwie rzeczy które zauważyłem

1.wyrzuć z kodu #define F_CPU
częstotliwość ustaw w właściwościach projektu

2.Zmienne których używasz w przerwaniu deklaruj jako volatile
a masz takich co najmniej trzy


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sty 2015, o 13:00 
Offline
Nowy

Dołączył(a): 03 sty 2015
Posty: 2
Pomógł: 0

Zadeklarowałem zmienne jako volatile i program zaczął działać. Częstotliwość taktowania zmienię niebawem, ponieważ używałem WinAVR i nie wiem jak tam się przestawia częstotliwość. Spróbuję przerzucić się na środowisko Eclipse i tam zmienić tą częstotliwość w ustawieniach projektu. Mam nadzieję, że obędzie się bez większych problemów - używam programatora typu usbasp. Bardzo dziękuję za pomoc :)
Planuję później móc dokładnie zmierzyć natężenie składowej RGB danej barwy, dlatego też chciałbym wiedzieć czy w jednym cyklu czujnik zliczy maksymalnie 4096 impulsów, tak jak napisałem w pierwszym poście (0 impulsów -> G (lub R, B) = 0 ; 4096 impulsów --> G = 255)? Aktualnie próbuję zapalać i gasić diodę w zależności od przyłożonej do czujnika barwy. Według tych obliczeń, np. chcąc zapalać diodę przy wykrytej barwie o składowej zielonej >50%, czujnik powinien zliczyć min. 2048 impulsów. Jednak teraz np. aby dioda zapalała się przy przyłożeniu białej, bądź zielonej kartki do czujnika, wystarczy, że czujnik zliczy kilkaset impulsów (np. 200, 300), natomiast przy wpisaniu wartości ok. 2000 układ w ogóle nie reaguje. Zastanawiam się czy moje obliczenia są błędne, czy układ działa tak, ze względu na źle ustawioną częstotliwość taktowania (sprawdzę niebawem), czy też w programie są jeszcze jakieś błędy.

EDIT: Pracuję teraz na Eclipse Luna - zgodnie z poradnikiem z yt: "AVR jak zacząć z Eclipse LUNA ". Częstotliwość została ustawiona na 8MHz. Program działa tak samo - czujnik reaguje, gdy liczba zliczonych impulsów w cyklu zanim nastąpi przepełnienie wynosi kilkaset. Ponawiam zatem pytanie - czy program posiada jeszcze jakieś błędy, czy też mój tok rozumowania w wyliczaniu max. liczby impulsów w cyklu jest zły?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO