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

ATmega128 ADC i wyświetlacz LCD HD44780 - problem z wyświetlaniem wyniku ADC

Albi1983 20 Kwi 2015 14:50 1644 28
REKLAMA
  • #1 14632603
    Albi1983
    Poziom 10  
    Witam

    Mam kolejny problem

    Ze strony http://mikrokontrolery.blogspot.com/2011/03/adc-prezentacja-wyniku-na-lcd.html

    Pobrałem sobie plik prog1.rar zawierający biblioteki do obsługi LCD

    Skopiowałem sobie także pierwszy program mianowicie ten:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W kodzie zmieniłem tylko jako że mam Mege128 pin wejścia ADC na PF0 i napięcie z AVCC

     ADMUX |= (1<<REFS0); //napiecie z Avcc


    oraz w pliku nagłówkowym z mieniłem port jaki mam podłączony na płytce tzn
    #define LCD_RS_DIR		DDRD
    #define LCD_RS_PORT 	PORTD
    #define LCD_RS			(1 << PD0)
    
    #define LCD_E_DIR		DDRD
    #define LCD_E_PORT		PORTD
    #define LCD_E			(1 << PD1)
    
    #define LCD_DB4_DIR		DDRD
    #define LCD_DB4_PORT	PORTD
    #define LCD_DB4			(1 << PD2)
    
    #define LCD_DB5_DIR		DDRD
    #define LCD_DB5_PORT	PORTD
    #define LCD_DB5			(1 << PD3)
    
    #define LCD_DB6_DIR		DDRD
    #define LCD_DB6_PORT	PORTD
    #define LCD_DB6			(1 << PD4)
    
    #define LCD_DB7_DIR		DDRD
    #define LCD_DB7_PORT	PORTD
    #define LCD_DB7			(1 << PD5)[
    


    Pozatym nic nie zmieniałem.

    Pojawia mi się błąd, którego nie bardzo rozumiem:

    Error 1 implicit declaration of function 'itoa' [-Werror=implicit-function-declaration]

    Ktoś mógłby mi pomóc i wytłumaczyć o co chodzi z tym błędem??
    Bardzo dziękuje za pomoc
    Pozdrawiam
  • REKLAMA
  • #2 14632631
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    Pojawia mi się błąd, którego nie bardzo rozumiem:

    Error 1 implicit declaration of function 'itoa' [-Werror=implicit-function-declaration]

    Dodaj nagłówek <stdlib.h> czyli:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przy okazji zmień także:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    na
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Artykuł Drzaśka poprawię.
  • #3 14632669
    Albi1983
    Poziom 10  
    no ok ten problem został rozwiązany, ponieważ mi się już nie pojawia ten błąd natomiast pojawiają mi się kolejne errory:

    
    Error	8	ld returned 1 exit status	collect2.exe
    Error	2	undefined reference to `LCD_GoTo'	
    Error	4	undefined reference to `LCD_GoTo'	
    Error	6	undefined reference to `LCD_GoTo'	
    Error	1	undefined reference to `LCD_Initalize'	
    Error	3	undefined reference to `LCD_WriteText'	
    Error	5	undefined reference to `LCD_WriteText'	
    Error	7	undefined reference to `LCD_WriteText'	
    


    Czy mógłbyś mi w tym pomóc
    Czemu on nie ma tego zdefiniowanego
    Korzystam z Atmel Studio 6
    gdzie mam włożyć ten drugi plik .c bo coś czuje że tu może być problem

    Pozdrawiam
  • REKLAMA
  • #5 14632743
    Albi1983
    Poziom 10  
    Ok to zrobiłem i nie ma już żadnych błędów jednakże jest problem, ponieważ LCD mi nic nie wyświetla

    LCD mam podłączone w następujący sposób:

    Port - pin CLCD
    PD0 - R/S
    PD1 - E
    PD2 - DB4
    PD3 - DB5
    PD4 - DB6
    PD5 - DB7

    i potencjometr

    PF0

    Czy to może mieć coś współnego z fusebitem JTAGEN?? Nie chce sobie zablokować mozliwości programowania przez JTAG bo to jedyny programator jaki posiadam
  • #6 14632805
    dondu
    Moderator na urlopie...
    JTAG podłączony masz do pinów PF4-PF7 nie ma więc kolizji z podłączeniem wyświetlacza.

    Wyświetlacz może więc nie działać z wielu innych powodów, ale z reguły początkowo są to:
    1. F_CPU w opcjach projektu ustawione inaczej niż taktowanie mikrokontrolera ustawione fusebitami,
    2. błędy w podłączeniu LCD do uC.
    3. źle ustawiony kontrast wyświetlacza.


    Poza tym należy wziąć pod uwagę, że ten mikrokontroler dostarczany jest jako zamiennik ATmega103. Aby go przestawić w tryb ATmega128 należy zmienić ustawienie fusebitu M103C - czytaj rozdział: ATmega103 and ATmega128 Compatibility
  • #7 14632835
    Albi1983
    Poziom 10  
    ja miałem ten wyświetlacz podłączony odrazu to płytki tak jak się podłącza karte graficzną do płyty głównej

    Co do fusebitów to po PWM odprogramowałem M103C

    Moje aktualne fusebity wygflądają jak na rysunku ATmega128 ADC i wyświetlacz LCD HD44780 - problem z wyświetlaniem wyniku ADC

    i jeszcze takie pytanko??

    Jak zmienić kontrast wyświetlacza ?
  • #9 14632858
    Albi1983
    Poziom 10  
    tak taktowanie jest ok ustawione na 1 MHz

    zresztą bez tego F_CPU plik nagłówkowy delay.h wymusza mi 1MHz

    A i jeszcze jedno.

    Przy włączaniu płytki wyświetlacz odrazu jest podświetlany. Czy to może mieć wpływ??

    Jak rozwiązać ten mój problem ??
  • REKLAMA
  • #10 14632870
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    zresztą bez tego F_CPU plik nagłówkowy delay.h wymusza mi 1MHz

    Słusznie :)

    Podświetlanie wyświetlacza podłącza się osobno - patrz schemat z artykułu.
    Ale z Twojego postu domyślam się, ze masz jakiś gotowy moduł z ATmega128 - wskaż jaki, albo co najmniej pokaż zdjęcia.

    Ja na razie zmykam, ale koledzy pomogą dalej :)
  • #11 14634860
    Albi1983
    Poziom 10  
    Hej.

    Mógłby mi ktoś powiedzieć jak ustawić fusy, żeby był zegar 2MHz z procka:
    ATmega128 ADC i wyświetlacz LCD HD44780 - problem z wyświetlaniem wyniku ADC

    Bo tak czytam w datasheecie tego HD44780 i tam mi wyskoczyła taka jedna informacja:

    Correspond to high speed MPU bus interface
    - 2 MHz (when VCC = 5V)

    Może to przez to, że nie mam ustawionych na procku 2MHz nie chce mi zadziałać ten LCD?
    Prosiłbym o pomoc.
  • #13 14637101
    Albi1983
    Poziom 10  
    Przesyłam cały projekt, o który prosiłeś. Plik *.h znajduje się w bibliotekach Atmel Studio.

    Pozdrawiam
  • REKLAMA
  • #15 14640001
    Albi1983
    Poziom 10  
    Witam

    No też to zauważyłem i śmiga wszystko bardzo ładnie i ślicznie z ADC w oparciu o PWM i potencjometr logarytmiczny. Super sprawa.

    A powiedz mi jedną rzecz
    Jak zrobić pomiar temperatury bo mam termometr LM35 i nie mam pojęcia co dalej zrobić tzn podłączam wyjście termometru TEMP pod wejście na ADC ( które w medze128 jest na porcie F ) więc ustawiam port F jako wejście.

    No i właśnie co dalej ??

    Jakoś to się inicjalizuje??

    W datasheecie nic nie znalazłem o pomiarze temperatury:(

    Prosiłbym o pomoc
  • #16 14641523
    Jacek Rutkowski
    Poziom 28  
    Witam,
    skoro masz podpiętego LM-a pod wejście ADC na PF0 i napięcie z AVCC to pozostaje
    wywołać pojedyńczy pomiar:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    poczekać aż się wykona:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i odczytanie wartości z rejestru:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Sorry ale nie znam składni C ale powinieneś "załapać" o co chodzi.
    W zmiennej wynik masz wartość temperatury w/g wzoru:
    temperatura°C*0,01V=(AVCC/1024)*wynik
  • #18 14642047
    Albi1983
    Poziom 10  
    Mam taki oto kod:



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tylko nie wiem czemu mi nie łapie wartości z ADC

    tzn jak daje


    	
                    pomiar = ADC;
    //		pomiar = pomiar * 0.0049; // bity na volty
    //		pomiar = pomiar * 100; // volty na kelwiny
    //		pomiar = pomiar - 273; // kelwiny na celsjusze
    

    to na wyświetlaczu cały czas pokazuje 0;

    W czym jest problem?

    A i jeszcze jedno pytanie czy ATmega128 ma w sobie czujnik temperatury wbudowany ??

    Bo tak patrząc w datasheeta to nie widze jakby miała wewenetrzny czujnik w sobie
  • #19 14642126
    dondu
    Moderator na urlopie...
    1. Nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html


    2. Zastanów się co to ustawia i na którym pinie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Gdzie więc podłączasz sygnał mierzony?


    3. Zwiększ długość bufora str i upewnij się że to zadziała poprawnie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodatkowo uwaga mniej istotna - skoro włączasz wyrównanie do lewej za pomocą ADLAR i chcesz odczytywać tylko 8 bitów, bo komentujesz tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to powinieneś odczytywać rejestr ADCH, a nie cały 16-to bitowy rejestr ADC.

    ATmega128 nie ma czujnika temperatury?
  • #20 14642276
    Albi1983
    Poziom 10  
    dondu napisał:


    2. Zastanów się co to ustawia i na którym pinie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Gdzie więc podłączasz sygnał mierzony?



    Faktycznie nie spojrzałem mój błąd oczywiście tam powinno być DDRF

    Ale na wyświetlaczu nadal jest wyświetlana wartość zero mimo, że odczytuje teraz ADCH

    Pozdrawiam
  • #22 14642312
    Albi1983
    Poziom 10  
    3. Zwiększ długość bufora str i upewnij się że to zadziała poprawnie:

    dtostrf(pomiar, 8, 0, 123.45);

    jak ustawiam to powoduje mi następujące błędy:

    Message 2 expected 'char *' but argument is of type 'double'
    Error 1 incompatible type for argument 4 of 'dtostrf'

    Sygnał mierzony mam podłączony na PF1

    Czyli na płytce TEMP podłączam z PF1
  • #23 14642325
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    jak ustawiam to powoduje mi następujące błędy:
    Message 2 expected 'char *' but argument is of type 'double'
    Error 1 incompatible type for argument 4 of 'dtostrf'

    Bo źle podałem - miało być:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod




    Albi1983 napisał:
    Sygnał mierzony mam podłączony na PF1

    ... a przetwornik mierzy ADC0 na PF0, bo nie zmieniłeś kanału.
  • #24 14642345
    Albi1983
    Poziom 10  
    jak napisałem:

    dtostrf(123.45, 8, 0, str);

    to wyskoczyło mi na wyświetlaczu poprostu

    123

    Przepiąłem sygnał mierzony z PF1 na PF0

    Wywaliłem definicje MUX z rejestru ADMUX i przepiąłem na PF0 i dalej nic
  • #25 14642366
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    jak napisałem:
    dtostrf(123.45, 8, 0, str);
    to wyskoczyło mi na wyświetlaczu poprostu
    123

    Czyli prawidłowo, więc to mamy sprawdzone.

    Albi1983 napisał:
    Wywaliłem definicje MUX z rejestru ADMUX i przepiąłem na PF0 i dalej nic

    Chwileczkę. W kodzie, który pokazałeś wyżej nie miałeś instrukcji zmieniających kanał. Skąd więc nagle się tam wzięły?

    Jeżeli mamy Ci pomagać, musimy dokładnie wiedzieć co w danej chwili wykonuje program i jakie są rezultaty jego działania oraz co i w jaki sposób jest podłączone. Jeśli opisujesz objawy dla kodu i podłączenia którego nie widzimy, to nigdy nie dojdziemy do tego co jest przyczyną.
  • #26 14642381
    Albi1983
    Poziom 10  
    W tej chwili mam takie coś:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #28 14642594
    Albi1983
    Poziom 10  
    Uustawiłem w ADC linijke z:

    ADCSRA |= (1<< 5); //ADFR ); //ciagly pomiar


    także teraz mam takie coś:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    teraz mierzy ok tylko problem jest z danymi bo wyświetla mi 5.9 a tu napewno tak zimno nie jest

    więc to jest problem przeliczenia voltów na Celsjusze

    Ktoś mógłby w tym pomóc ??

    W dokumentacji LM35 znalazłem takie coś:

    7.3.1 LM35 Transfer Function
    The accuracy specifications of the LM35 are given with respect to a simple linear transfer function:
    VOUT = 10 mv/°F × T
    where
    • VOUT is the LM35 output voltage
    • T is the temperature in °C

    Ktoś móże to przetłumaczyć na ludzki wzór ?
    Bo tego nie rozumiem

    Pozdrawiam
  • #29 14646383
    Jacek Rutkowski
    Poziom 28  
    Na każdy jeden °C zmierzonej temperatury LM35 daje na wyjściu 10mV.
    Mając temperaturę 25°C na wyjściu będzie 25°C*(10mV/°C)=250mV,
    natomiast gdy będzie 85 °C na wyjściu będzie 85°C*(10mV/°C)=850mV.
    ATmega128 ADC i wyświetlacz LCD HD44780 - problem z wyświetlaniem wyniku ADC
    W przypadku pomiaru ujemnych temperatur konieczne jest posiadanie napięcia ujemnego względem masy które podłączamy przez rezystor wymuszający ujemne napięcie względem masy na wyjściu LM-a.
    	
                    pomiar = ADC;
    //		pomiar = pomiar * (Aref/1024); // bity na volty
    //		pomiar = pomiar * 100; // volty na °C
    

    Ps. Używając ADC w układzie Single Ended Input nie ma możliwości pomiaru ujemnych temperatur bez stosowania dodatkowych sztuczek układowych.
REKLAMA