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.

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

Maxe 14 Mar 2011 14:53 6645 76
  • #1 14 Mar 2011 14:53
    Maxe
    Poziom 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:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Bardzo proszę o pomoc. Zależy mi na czasie również.
    Pozdrawiam.

    0 29
  • Pomocny post
    #2 14 Mar 2011 15:44
    dondu
    Moderator Mikrokontrolery Projektowanie

    Witaj,
    Opisz dokładniej, co masz na wyświetlaczu i czego dokładnie brakuje.
    To ułatwi nam znalezienie rozwiązania.

    Dodano po 13 [minuty]:

    I pokaż kod funkcji: ADC_Read()

    1
  • #3 14 Mar 2011 15:45
    Maxe
    Poziom 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

    0
  • Pomocny post
    #4 14 Mar 2011 15:52
    dondu
    Moderator Mikrokontrolery Projektowanie

    Na szybko zakomentuj linię z adc_rd = ADC_Read(2);
    Jeżeli pojawi się napis NAPIĘCIE to na pewno zatrzymuje się w ADC_Read(2)
    Dlatego niezbędne będzie wklejenie kodu tej funkcji.

    1
  • #5 14 Mar 2011 15:55
    Maxe
    Poziom 13  

    Już tak robiłem, sprawdzałem tą linię. Ale nie przyniosło to żadnych rezultatów..

    0
  • Pomocny post
    #6 14 Mar 2011 16:04
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zamień kolejność na:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i sprawdź czy wyświetli napis NAPIĘCIE:

    1
  • #7 14 Mar 2011 16:13
    Maxe
    Poziom 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..

    0
  • #8 14 Mar 2011 16:21
    dondu
    Moderator Mikrokontrolery Projektowanie

    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 napisał:
    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ć:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    1
  • #9 14 Mar 2011 16:24
    Maxe
    Poziom 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?

    0
  • Pomocny post
    #10 14 Mar 2011 16:27
    dondu
    Moderator Mikrokontrolery Projektowanie

    A zrobiłeś próbę z ostatnim kodem, który pokazałem powyżej?

    1
  • #11 14 Mar 2011 16:29
    Maxe
    Poziom 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..

    0
  • #12 14 Mar 2011 16:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Maxe napisał:
    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?

    1
  • #13 14 Mar 2011 16:38
    Maxe
    Poziom 13  

    Znalazłem na forum microC ale tylko w asemblerze.

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    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.

    0
  • #14 14 Mar 2011 16:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie ma sprawy i życzę powodzenia!

    1
  • #15 14 Mar 2011 17:55
    Maxe
    Poziom 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 :/

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #16 14 Mar 2011 18:10
    dondu
    Moderator Mikrokontrolery Projektowanie

    Wklej jeszcze raz całą aktualną main(), a najlepiej cały program.

    Dodano po 28 [sekundy]:

    i nie odpowiedziałeś na pytanie o 1023 vs 1024

    0
  • #17 14 Mar 2011 18:18
    Maxe
    Poziom 13  

    Bo 1023 odpowiada 5V ?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #18 14 Mar 2011 18:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    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?

    0
  • #19 14 Mar 2011 18:35
    Maxe
    Poziom 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.

    0
  • #20 14 Mar 2011 18:39
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ustalmy więc czy procedura odczytu wstrzymuje dalsze wykonywanie programu tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #21 14 Mar 2011 18:45
    Maxe
    Poziom 13  

    Tak, zawiesza sie program .
    Tzn "byłem tu" nie wyświetliło się.

    0
  • #22 14 Mar 2011 19:07
    dondu
    Moderator Mikrokontrolery Projektowanie

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ...

    Dodano po 8 [minuty]:

    Skąd takie bity w tym rejestrze?
    Kod: c
    Zaloguj się, aby zobaczyć kod

    w datasheet PIC16F87x nie ma ich w rejestrze ADCON1.

    0
  • #23 14 Mar 2011 19:07
    Maxe
    Poziom 13  

    No włąsnie te linie :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    były dołączone do definicji ADC_Read2() którą znalazłem w Internecie, komentarze widocznie nie trafione.

    0
  • #24 14 Mar 2011 19:09
    dondu
    Moderator Mikrokontrolery Projektowanie

    Czy ty na pewno masz prawidłowo wybrany procesor w swoim kompilatorze?

    Dodano po 40 [sekundy]:

    No to wszystko jasne :) :) :)

    0
  • #25 14 Mar 2011 19:11
    Maxe
    Poziom 13  

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

    0
  • #26 14 Mar 2011 19:14
    dondu
    Moderator Mikrokontrolery Projektowanie

    ADC masz nieprawidłowo ustawiony dlatego nie działa i funkcja odczytująca zawiesza się w :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    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 napisał:
    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 :|

    0
  • #27 14 Mar 2011 19:39
    Maxe
    Poziom 13  

    Widze postęp. Teraz nie wiem dlaczego wartość napięcia wyświetlana jest Ciągle 0.000 V..

    a bity ustawiłem:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    zmiana z ANSEL na ADRESL
    ANSELH -> ADRESH
    ADCON1.VCFG0 - > ADCON1.PCFG0
    ADCON1.VCFG1 - > ADCON1.PCFG1

    0
  • #28 14 Mar 2011 19:46
    dondu
    Moderator Mikrokontrolery Projektowanie

    Maxe napisał:
    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:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    zobaczymy czy to problem odczytu czy wyświetlania.

    0
  • #29 14 Mar 2011 19:52
    Maxe
    Poziom 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.

    0
  • #30 14 Mar 2011 19:58
    dondu
    Moderator Mikrokontrolery Projektowanie

    OK, no to sprawdzamy bity.

    0