Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[PIC16] [C] Przetwornik ADC, wyświetlenie wartości napięcia na LCD

Maxe 14 Mar 2011 14:53 7317 76
  • #1
    Maxe
    Level 13  
    Witam.
    Chciałbym wyświetlić napięcie zadane potencjometrem wyświetlić na LCD.
    Do tego użyłem PIC16F877.
    Wszystko byłoby super, ale nie wiem co jest nie tak w moim kodzie.
    Działa ok poza właśnie wyświetleniem wartości napięcia. W ogóle go nie wyświetla.

    Oto część kodu odpowiedzialna za przetworzenie wartości analogowej na cyfrową i wyświetlenie jej na LCD:

    Code: c
    Log in, to see the code



    Bardzo proszę o pomoc. Zależy mi na czasie również.
    Pozdrawiam.
  • #3
    Maxe
    Level 13  
    OK :)
    Więc pierwszy tekst "Witam" sie pojawia razem z drugim wyswietlonym w drugiej linii "Dziala".
    Po czasie dwóch sekund powinno sie pojawić w drugiej linii "Napięcie: X.XX V"
    wartość przetworzonego napięcia zadanego potencjometrem podanego na wejście analogowe RA2 układu PIC16.. Niestety napis "Napiecie..." sie nie pojawia..

    Dodam jeszcze, że korzystam z programu microC PRO for PIC i tam wystarczy zaznaczyć haczykiem biblioteki, których się chce użyć.
    tutaj biblioteka ADC, w której znajduje sie funkcja ADC_Read
    http://www.mikroe.com/esupport/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=127
  • #5
    Maxe
    Level 13  
    Już tak robiłem, sprawdzałem tą linię. Ale nie przyniosło to żadnych rezultatów..
  • #7
    Maxe
    Level 13  
    Fakt. Tego nie próbowałem. Wyświetlił sie napis po około 20 s (spowodowanie ze delay jest 2000 ms ustawione - tez dopiero zauwazyłem to, ma być 2s - już zmieniłem - ale to drobnostka)

    Napięcie sie wyswietla. :) ale wartości dalej nie wyświetla.. Hm..
    Funkcja ADC_Read powinna być dobrze skonstruowana, skoro jest dołączana do pewnego - konkretnego - programu..
  • #8
    dondu
    Moderator on vacation ...
    Po kolei:

    Nie bardzo zrozumiałem co do sekund.
    Miałeś ustawione 2000 i to dało, aż 20 sekund? Jeżeli tak to masz chyba źle ustawioną wartość zegara w kompilatorze.

    Dodano po 4 [minuty]:

    Maxe wrote:
    Napięcie sie wyswietla. :) ale wartości dalej nie wyświetla.. Hm..
    Funkcja ADC_Read powinna być dobrze skonstruowana, skoro jest dołączana do pewnego - konkretnego - programu..

    Oczywiście ufam, że masz funkcję z dobrego źródła. Chciałem ją zobaczyć od środka jak działa.


    Dla próby wrzuć:

    Code: c
    Log in, to see the code
  • #9
    Maxe
    Level 13  
    No tak były różne wartości ustawione w kompilatorze i w symulatorze.
    Dzięki.


    Teraz tylko co zrobić, żeby sprawdzić (i naprawić) czy to źle wykonywana konwersja z binarnego systemu do dziesiętnego, czy wyświetlanie tej wartości tylko?
  • #11
    Maxe
    Level 13  
    Chyba to pewne źródło zawodzi coś..
    Teraz wyświetla pewną wartość napięcia - czyli wnioskuję, że konwersja z bin -> dec jest poprawna, tak samo jak wyświetlanie wartości dec.
    Problem z odczytem z portu RA2.. :/
    Szukam jak wygląda funkcja ADC_Read(); ale nie wiem czy gdzieś w kompilatorze jest dostęp do jej składni..
  • #12
    dondu
    Moderator on vacation ...
    Maxe wrote:
    Szukam jak wygląda funkcja ADC_Read(); ale nie wiem czy gdzieś w kompilatorze jest dostęp do jej składni..

    W tym Ci nie pomogę, bo nie znam microC - szukałbym w katalogu microC może w bibliotekach (?).


    Jeszcze jedna uwaga. Dlaczego dzielisz przez 1023, a nie przez 1024?
  • #13
    Maxe
    Level 13  
    Znalazłem na forum microC ale tylko w asemblerze.

    Code: vb
    Log in, to see the code


    A biblioteki niestety są zapisane w jakiś znanym tylko temu programowi języku i rozszerzeniu .mcl :(

    Jeszcze będę szukał..
    Dzięki za pomoc.
    Pozdrawiam.
  • #15
    Maxe
    Level 13  
    Tak niby wygląda ta funkcja ADC_Read..
    ale nie działa nadal.
    Zrobiona na portów od RA0 do RA4 - można ją zrobić dalej ale nie ma takiej potrzeby. Powinno działać - ale nie działa. Problem z odczytaniem napięcia z portu RA2 dalej nierozwiązany :/

    Code: c
    Log in, to see the code
  • #17
    Maxe
    Level 13  
    Bo 1023 odpowiada 5V ?

    Code: c
    Log in, to see the code
  • #18
    dondu
    Moderator on vacation ...
    1. Pomiar to wartość jak napisałeś od 0 do 5V , ale dzielony na 1024 różne możliwe wyniki z ADC.
    To tak samo jak z bajtem: masz bity od 0 do 7, ale ciągle jest ich 8 :)

    2. program przeanalizuję za parę minut.

    Dodano po 7 [minuty]:

    Jaki jest dokładnie efekt na wyświetlaczu?
  • #19
    Maxe
    Level 13  
    Jeśli chodzi o wyświetlenie warości zadanego napięcia to żaden.
    Wyswietla sie tekst1, tekst2.
    pozniej znika tekst2 a w zamian pojawia sie tekst3, czyli "Napiecie: "
    i tylko tyle.
  • #21
    Maxe
    Level 13  
    Tak, zawiesza sie program .
    Tzn "byłem tu" nie wyświetliło się.
  • #22
    dondu
    Moderator on vacation ...
    Czyli mamy miejsce błędu: albo źle ustawiasz ADC, albo funkcja odczytu nie działa prawidłowo.
    Stawiam na to pierwsze - ja szukam i ty także sprawdź ustawienia ADC.

    Dodano po 8 [minuty]:

    Komentarz niewłaściwy do tego co robią te bity w rejestrzez ADCON0
    Code: c
    Log in, to see the code


    ...

    Dodano po 8 [minuty]:

    Skąd takie bity w tym rejestrze?
    Code: c
    Log in, to see the code

    w datasheet PIC16F87x nie ma ich w rejestrze ADCON1.
  • #23
    Maxe
    Level 13  
    No włąsnie te linie :

    Code: c
    Log in, to see the code


    były dołączone do definicji ADC_Read2() którą znalazłem w Internecie, komentarze widocznie nie trafione.
  • #25
    Maxe
    Level 13  
    Procesor napewno dobrze wybrany heh sprawdziłem dla pewności jeszcze teraz :)
  • #26
    dondu
    Moderator on vacation ...
    ADC masz nieprawidłowo ustawiony dlatego nie działa i funkcja odczytująca zawiesza się w :

    Code: c
    Log in, to see the code


    Musisz na podstawie datasheet odpowiednio ustawić bity w rejestrach ADCON0 i ADCON1 oraz na wszelki wypadek sprawdzić, czy prawidłowo piny masz ustawione by mierzyć na nich.

    Dodano po 2 [minuty]:

    Maxe wrote:
    Procesor napewno dobrze wybrany heh sprawdziłem dla pewności jeszcze teraz :)

    To w takim razie nie bardzo rozumie, dlaczego nie wywalał błędu na instrukcji, której bitów nie ma rejestrze :|
  • #27
    Maxe
    Level 13  
    Widze postęp. Teraz nie wiem dlaczego wartość napięcia wyświetlana jest Ciągle 0.000 V..

    a bity ustawiłem:

    Code: c
    Log in, to see the code


    Dodano po 1 [minuty]:

    zmiana z ANSEL na ADRESL
    ANSELH -> ADRESH
    ADCON1.VCFG0 - > ADCON1.PCFG0
    ADCON1.VCFG1 - > ADCON1.PCFG1
  • #28
    dondu
    Moderator on vacation ...
    Maxe wrote:
    Widze postęp.

    Postęp jest od samego początku tematu :)
    Czyli ADC ruszył i zakończył pomiar, pytanie co mierzył i w drugiej kolejności czy prawidłowo obliczasz.

    Zaraz popatrzę na to, co przygotowałeś a Ty za ten czas wrzuć poprawkę do testów:

    Code: c
    Log in, to see the code

    zobaczymy czy to problem odczytu czy wyświetlania.
  • #29
    Maxe
    Level 13  
    Wyświetlił jakąs wartość napięcia, które odpowiada binarnie=6000, więc to problem dalej pewnie ustawień bitów które odpowiadają za prawidłowo odczytaną wartość. Wyświetlanie wydaje się być poprawne.