logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8] [atmega8][C] - Nieprawidłowe odczyty kolorów z czujnika tcs3200, chaotyczne wartości

bercik999 24 Sie 2013 10:08 2493 9
REKLAMA
  • #1 12662047
    bercik999
    Poziom 10  
    Posty: 44
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 12668629
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 12668813
    bercik999
    Poziom 10  
    Posty: 44
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #4 12668846
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 12668876
    bercik999
    Poziom 10  
    Posty: 44
    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ć.
  • REKLAMA
  • #6 12668969
    Konto nie istnieje
    Konto nie istnieje  
  • #7 12669008
    bercik999
    Poziom 10  
    Posty: 44
    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ć.
  • #8 12681195
    bercik999
    Poziom 10  
    Posty: 44
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 12681479
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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.
  • #10 12683058
    bercik999
    Poziom 10  
    Posty: 44
    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 / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ W dyskusji poruszono problem nieprawidłowych odczytów kolorów z czujnika TCS3200 przy użyciu mikrokontrolera ATmega8. Użytkownik zauważył, że wartości dla kolorów R, G, B i C są chaotyczne i niezgodne. W odpowiedziach zasugerowano użycie słowa kluczowego "volatile" dla zmiennych używanych w przerwaniach oraz przeniesienie obsługi LCD do pętli głównej, co poprawiło odczyty dla R i G, ale nie rozwiązało problemu dla B i C. Użytkownik zidentyfikował, że problemem może być niezerowanie timera 0. Ostatecznie, po zmianie podejścia do obsługi czujnika, udało się uzyskać poprawne odczyty, jednak wartości dla zielonego i niebieskiego koloru były nadal zaniżone, co mogło być spowodowane wpływem światła otoczenia.
Wygenerowane przez model językowy.
REKLAMA