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

[atmega8][C] - Obsługa czujnika koloru tcs3200

bercik999 24 Sie 2013 10:08 2058 9
  • #1 24 Sie 2013 10:08
    bercik999
    Poziom 10  

    Witam. Piszę obsługę czujnika koloru tcs3200.datasheet W moim kodzie timer0 ma za zadanie zliczać sygnały wysyłane przez czujnik, a timer1 w trybie CTC generować przerwania co 0,1s (narazie prototyp korzysta z oscylatora wewnętrznego, więc te 0,1 to przybliżenie) po przerwaniu następuje odczytanie ilości zliczonych impulsów dla odpowiedniego koloru i wyświetlenie na wyświetlaczu częstotliwości. Problem jest taki: dla kolorów R,B, i bez żadnego filtra wartość wyświetlana jest ta sama, wszystkie wartości zmieniają się chaotycznie. Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 9
  • Pomocny post
    #2 26 Sie 2013 09:16
    94075
    Użytkownik usunął konto  
  • #3 26 Sie 2013 10:38
    bercik999
    Poziom 10  

    1. Czytałem o volatile tutaj i wyciągnąłem wniosek taki, że jeśli korzystam ze zmiennej gdzieś jeszcze poza przerwaniem, wtedy muszę użyć tego słowa.
    2. Nie uwzględniłem :cry: przeniosłem obsługę lcd do pętli głównej. Efekt jest taki: odczyty z R i G są różne od siebie, ale chaotyczne, natomiast na B i C wisi 0, czasem wskoczy z zakłóceń 10. Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 26 Sie 2013 11:01
    bercik999
    Poziom 10  

    Racja, głupi błąd, poprawiłem, ale niestety nic się nie zmieniło.

    EDIT: wydaje mi się, że przerwanie nadal występuje w różnych odstępach czasu, nie wiem jednak jak to sprawdzić, ani jak naprawić.

    0
  • #6 26 Sie 2013 11:34
    94075
    Użytkownik usunął konto  
  • #7 26 Sie 2013 11:45
    bercik999
    Poziom 10  

    Tak, była pomylona, W czujniku mam ustawione skalowanie na 100%

    Próbowałem oba wejścia czujnika (S2,S3) podłączyć do tego samego wyjścia atmegi, wszystkie wskazania powinny być wtedy identyczne. Nic to jednak nie zmienia, R i G szaleją i są różne, a B i C wskazują 0.

    Wiem już, w czym tkwi problem. Linia TCNT0 = 0; nie zeruje timera0, nie wiem dlaczego tak się dzieje i nie wiem, jak mógłbym to rozwiązać.

    0
  • #8 29 Sie 2013 14:58
    bercik999
    Poziom 10  

    Podszedłem z innej strony do obsługi tego czujnika i udało się, teraz mierzę czas trwania połowy okresu i obliczam na podstawie tego barwę składową, wrzucam kod, może się komuś przyda. Jedyne co jest nie tak to zielony i niebieski mają wskazania ok 2 razy mniejsze od pozostałych 2 kolorów.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #9 29 Sie 2013 16:18
    BlueDraco
    Specjalista - Mikrokontrolery

    Zacznij od wyrzucenia połowy nawiasów (np. przy stałych w case) i wyczyszczenia konstrukcji typu:

    (PINB & 0x01)&(0x01))

    oraz while () pod if () z takim samym warunkiem.

    0
  • #10 29 Sie 2013 22:54
    bercik999
    Poziom 10  

    Program skurczył się o kilkanaście bajtów. Zielony i niebieski dalej mają niskie wskazania - może to wina światła z otoczenia?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0