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.

Wyświetlenie temperatury przy użyciu czujnika DS18B20 Atmega16,

mirek1968 20 Mar 2011 00:55 3603 16
  • #1 20 Mar 2011 00:55
    mirek1968
    Poziom 13  

    Mam bardzo wielką prośbę o pomoc w kwestii wyświetlenia temperatury na mojej płytce testowej Atmega16.Mam czujnik DS18B20 procesor Atmega16 zewnętrzny kwarc 16MHZ ,LCD 2X16
    Używam programu Win AVR i Mfile.Na porcie B mam wyświetlacz,PINA0 to wejście DQ mojego czujnika temperatury .do tej pory bawiłem się-właściwie uczyłem sterować diodą LED,używałem przycisków i to wszystko.Jestem bardzo początkującym w tej dziedzinie,interesuje mnie tylko programowanie w C.Proszę o najprostszy programik w C. dzięki któremu ożyje moja płytka z czujnikiem.
    https://obrazki.elektroda.pl/4950474600_1300578829.jpg

    0 16
  • #2 20 Mar 2011 12:31
    hotek
    Poziom 15  

    Jest świetny kurs na dioda.com odnośnie AVR w C. Nie wiem czy linkowanie do innych for jest dozwolone zatem Link

    0
  • #3 20 Mar 2011 14:17
    mirek1968
    Poziom 13  

    Tak wiem korzystałem z tego kursu ale jeśli chodzi o tą część z termometrem lub z LCD to mam problem z kompilacją tego programu tzn jak w Mfile wpisuję w polu Makefile->C/C++source files(s) wpisuję hd44780.c ds18b20.c to mam błąd podczas kompilacji niewiem czy pomiędzy hd44780.c a ds18b20.c mam dać spację?-czy raczej nie?Jak by nie było co kolwiek wpiszę w polu Makefile->C/C++source files(s) to i tak podczas kompilacji wyrzuca mi błąd w WinAVR Programmers Notepad

    make.exe: *** No rule to make target `termo.elf', needed by `elf'. Stop.

    > Process Exit Code: 2
    > Time Taken: 00:00

    Nie mogę poradzić sobie z pozbyciem się tego będu dlatego prosze jeszcza raz o pomoc co robię źle w moim Mfile-bo wzoruję się na tej właśnie stronie z kursem Dioda.avr no i porażka :-(

    0
  • #4 20 Mar 2011 14:30
    hotek
    Poziom 15  

    Niestety nie pomogę bo piszę w AVR Studio bo z WinAVR też miałem problemy, także gdybyś chciał się przerzucić to pomogę.

    0
  • #6 20 Mar 2011 17:23
    mirek1968
    Poziom 13  

    Jak bym wiedział za zadziała mi to wszystko w AVR Studio to by było fajnie.Pomoc w wejściu w ten program-był bym wdzięczny.mam tylko jeden problem mam programator na USB typu usbasp bo mam laptopa zmiana na inny programator nie wchodzi u mnie w rachubę-niewiem czy ten program AVR Studio obsługuje ten mój programator-proszę o odpowiedź i pomoc:-)

    0
  • #7 20 Mar 2011 17:48
    gdL
    Poziom 27  

    Lepiej by się czytało, gdybyś używał znaków interpunkcyjnych. Programator nie ma nic do programu, natomiast musisz otworzyć projekt w avr studio i obejrzeć konfigurację pinów (opisane).

    0
  • #8 20 Mar 2011 18:11
    hotek
    Poziom 15  

    Odnoszę wrażenie że jednak jego programator nie współpracuje z AVRStudio.
    @mirek1968 jeżeli używasz materiałów z Diody to napisz na ich forum.
    Pozdrawiam.

    0
  • #9 20 Mar 2011 18:18
    gdL
    Poziom 27  

    Tu jest konfiguracja pod AVR Studio -> http://www.microsense.pl/allegro/AVR_USB_PROG/manuals/AVR_USB_PROG_manual.pdf

    Prawdę powiedziawszy nie wiem czy to zadziała, bo nie próbowałem. Hexa można sobie przygotować i wgrać AVRdude, tu chyba problemu nie będzie.

    EDIT: Dla tych co zawsze czytają tylko pierwsze kilka zdań, polecam zerknięcie na stronę 9.

    0
  • #10 20 Mar 2011 18:21
    hotek
    Poziom 15  

    "Wspópracuje z programem AVRDUDE jako USbasp, a po zmianie firmware'u może pracować jako programator STK500v2." Zakładając że ma standardowy USbasp, małą wiedzę to można powiedzieć że nie będzie mu działać.

    0
  • #11 21 Mar 2011 21:30
    mirek1968
    Poziom 13  

    Poprzestanę jednak na programie WinAVR i Mfile pomimo że nie wszystko mi jak na razie na nim działa.
    Macie rację z moim niziutkim poziomem wiedzy na temat języka C+ i programowania procesorów AVR muszę zacząć szkolenie od podstaw.Mam też zaistalowany program
    AVR Burn-O-Mat w którym mam skonfigurowanie fusebity i dzięki któremu mogę wgrać plik z rozszerzeniem .hex.(to wszytko mi działa poprawnie)
    Mam prośbę ponieważ korzystam z Mfile jeśli ktoś z Was wie jak go poprawnie skonfigurować żeby nie wyskakiwał mi błąd który opisałem wcześniej powyżej ,gdy próbowałem wyświetlić coś na moim LCD.
    Irytuje mnie to dlaczego nie mogę zgodnie z przykładem z kursu diody cz5 w temacie LCD oraz termometru nic wpisać w opcji Makefile->C/C++source files(s)
    Musze spróbować wejść na forum diody i może tam uzyskam jakąś pomoc w tym temacie.
    Bardzo dziękuję za dotychczasowe odpowiedzi i wszelkie cenne rady:-)

    0
  • #12 21 Mar 2011 22:34
    janbernat
    Poziom 38  

    Albo dalej się będziesz katował Mfile-m albo poświęcisz parę zł i parę tygodni(dni?) na nauczenie się prawidłowego pisania kodu.
    http://atnel.pl/wydawnictwo

    0
  • #13 21 Mar 2011 23:10
    dondu
    Moderator Mikrokontrolery Projektowanie

    mirek1968 napisał:
    Poprzestanę jednak na programie WinAVR i Mfile pomimo że nie wszystko mi jak na razie na nim działa.

    Czyli będąc niewidomym chcesz dodatkowo zatkać sobie uszy, by utrudnić uczenie się poruszania po mieszkaniu?
    Po to zrobiono AVR Studio by ułatwić, a nie utrudniać życie programistom.

    Dodano po 2 [minuty]:

    Masz ode mnie 20pkt na zachętę, by Ci ułatwić zadawanie ewentualnych pytań.

    0
  • #14 23 Mar 2011 20:14
    mirek1968
    Poziom 13  

    Dziękuję dondu za punkty.
    Dziś zainstalowałem program AVR Studio 4 i mam w związku z tym kilka pytań.
    W jaki sposób prawidłowo połączyć dwa pliki jeden z rozszerzeniem ".c" z drugim z rozszerzeniem ".h"w jedna całość w tym programie AVR Studio.
    Może to głupie pytanie ale ja jestem zieloniutki jeszcze i proszę o wyrozumiałość dla moich pytań.
    Ja połączyłem je w ten sposób ale pewnie źle bo wystąpiły błędy w kompilacji.
    Proszę o pokazanie mi sposób połączenia tych dwóch plików w prawidłowy sposób.

    //-------------------------------------------------------------------------------------------------
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780
    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
    // z dowolnym przypisaniem sygnałów sterujących
    // Plik : HD44780.c
    // Mikrokontroler : Atmel AVR
    // Kompilator : avr-gcc
    // Autor : Radosław Kwiecień
    // Źródło : http://radzio.dxp.pl/hd44780/
    // Data : 24.03.2007
    //-------------------------------------------------------------------------------------------------

    #include "HD44780.h"
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_OutNibble(unsigned char nibbleToWrite)
    {
    if(nibbleToWrite & 0x01)
    LCD_DB4_PORT |= LCD_DB4;
    else
    LCD_DB4_PORT &= ~LCD_DB4;

    if(nibbleToWrite & 0x02)
    LCD_DB5_PORT |= LCD_DB5;
    else
    LCD_DB5_PORT &= ~LCD_DB5;

    if(nibbleToWrite & 0x04)
    LCD_DB6_PORT |= LCD_DB6;
    else
    LCD_DB6_PORT &= ~LCD_DB6;

    if(nibbleToWrite & 0x08)
    LCD_DB7_PORT |= LCD_DB7;
    else
    LCD_DB7_PORT &= ~LCD_DB7;
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    _delay_us(50);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu rozkazu do wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteCommand(unsigned char commandToWrite)
    {
    LCD_RS_PORT &= ~LCD_RS;




    _LCD_Write(commandToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu danych do pamięci wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteData(unsigned char dataToWrite)
    {
    LCD_RS_PORT |= LCD_RS;
    _LCD_Write(dataToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wyświetlenia napisu na wyswietlaczu.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteText(char * text)
    {
    while(*text)
    LCD_WriteData(*text++);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja ustawienia współrzędnych ekranowych
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_GoTo(unsigned char x, unsigned char y)
    {
    LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja czyszczenia ekranu wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Clear(void)
    {
    LCD_WriteCommand(HD44780_CLEAR);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Home(void)
    {
    LCD_WriteCommand(HD44780_HOME);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Procedura inicjalizacji kontrolera HD44780.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Initalize(void)
    {
    unsigned char i;
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB5_DIR |= LCD_DB5; //
    LCD_DB6_DIR |= LCD_DB6; //
    LCD_DB7_DIR |= LCD_DB7; //
    LCD_E_DIR |= LCD_E; //
    LCD_RS_DIR |= LCD_RS; //
    _delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
    LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
    LCD_E_PORT &= ~LCD_E; // wyzerowanie linii E

    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
    {
    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_OutNibble(0x03); // tryb 8-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0
    _delay_ms(5); // czekaj 5ms
    }

    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_OutNibble(0x02); // tryb 4-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0

    _delay_ms(1); // czekaj 1ms
    LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
    LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
    _delay_ms(2);
    LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
    }

    //-------------------------------------------------------------------------------------------------
    //
    // Koniec pliku HD44780.c
    //
    //-------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780
    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
    // z dowolnym przypisaniem sygnałów sterujących
    // Plik : HD44780.h
    // Mikrokontroler : Atmel AVR
    // Kompilator : avr-gcc
    // Autor : Radosław Kwiecień
    // Źródło : http://radzio.dxp.pl/hd44780/
    // Data : 24.03.2007
    //-------------------------------------------------------------------------------------------------

    #include <avr/io.h>
    #include <util/delay.h>

    //-------------------------------------------------------------------------------------------------
    //
    // Konfiguracja sygnałów sterujących wyświetlaczem.
    // Można zmienić stosownie do potrzeb.
    //
    //-------------------------------------------------------------------------------------------------
    #define LCD_RS_DIR DDRA
    #define LCD_RS_PORT PORTA
    #define LCD_RS (1 << PA2)

    #define LCD_E_DIR DDRA
    #define LCD_E_PORT PORTA
    #define LCD_E (1 << PA3)

    #define LCD_DB4_DIR DDRA
    #define LCD_DB4_PORT PORTA
    #define LCD_DB4 (1 << PA4)

    #define LCD_DB5_DIR DDRA
    #define LCD_DB5_PORT PORTA
    #define LCD_DB5 (1 << PA5)

    #define LCD_DB6_DIR DDRA
    #define LCD_DB6_PORT PORTA
    #define LCD_DB6 (1 << PA6)

    #define LCD_DB7_DIR DDRA
    #define LCD_DB7_PORT PORTA
    #define LCD_DB7 (1 << PA7)

    //-------------------------------------------------------------------------------------------------
    //
    // Instrukcje kontrolera Hitachi HD44780
    //
    //-------------------------------------------------------------------------------------------------

    #define HD44780_CLEAR 0x01

    #define HD44780_HOME 0x02

    #define HD44780_ENTRY_MODE 0x04
    #define HD44780_EM_SHIFT_CURSOR 0
    #define HD44780_EM_SHIFT_DISPLAY 1
    #define HD44780_EM_DECREMENT 0
    #define HD44780_EM_INCREMENT 2

    #define HD44780_DISPLAY_ONOFF 0x08
    #define HD44780_DISPLAY_OFF 0
    #define HD44780_DISPLAY_ON 4
    #define HD44780_CURSOR_OFF 0
    #define HD44780_CURSOR_ON 2
    #define HD44780_CURSOR_NOBLINK 0
    #define HD44780_CURSOR_BLINK 1

    #define HD44780_DISPLAY_CURSOR_SHIFT 0x10
    #define HD44780_SHIFT_CURSOR 0
    #define HD44780_SHIFT_DISPLAY 8
    #define HD44780_SHIFT_LEFT 0
    #define HD44780_SHIFT_RIGHT 4

    #define HD44780_FUNCTION_SET 0x20
    #define HD44780_FONT5x7 0
    #define HD44780_FONT5x10 4
    #define HD44780_ONE_LINE 0
    #define HD44780_TWO_LINE 8
    #define HD44780_4_BIT 0
    #define HD44780_8_BIT 16

    #define HD44780_CGRAM_SET 0x40

    #define HD44780_DDRAM_SET 0x80

    //-------------------------------------------------------------------------------------------------
    //
    // Deklaracje funkcji
    //
    //-------------------------------------------------------------------------------------------------

    void LCD_WriteCommand(unsigned char);
    void LCD_WriteData(unsigned char);
    void LCD_WriteText(char *);
    void LCD_GoTo(unsigned char, unsigned char);
    void LCD_Clear(void);
    void LCD_Home(void);
    void LCD_Initalize(void);

    //-------------------------------------------------------------------------------------------------
    //
    // Koniec pliku HD44780.h
    //
    //-------------------------------------------------------------------------------------------------

    0
  • #15 23 Mar 2011 21:03
    janbernat
    Poziom 38  

    Z lewej strony masz drzewko projektu.
    Zawiera ono cztery foldery.
    Wszystkie pliki .h mają być w folderze Header Files.
    Wszystkie pliki .c w folderze Source Files.
    Jak któregoś nie ma to należy go utworzyć- prawy przycisk- new- nazwać albo skopiować z miejsca gdzie jest.
    Oczywiscie musi być też main.c a w nim:
    #include "plik1"
    #include "plik2"
    itd.
    Czy już przeczytałeś?
    http://atnel.pl/wydawnictwo
    Odpadło by Ci 90% problemów.

    0
  • Pomocny post
    #16 24 Mar 2011 08:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Aby kod łatwo było analizować używaj znaczniki SYNTAX:

    Code:
    [syntax=c] tu wklej Twój kod [/syntax]



    Plik : HD44780.c

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Plik : HD44780.h

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 25 [minuty]:

    mirek1968 napisał:
    Ja połączyłem je w ten sposób ale pewnie źle bo wystąpiły błędy w kompilacji. Proszę o pokazanie mi sposób połączenia tych dwóch plików w prawidłowy sposób.


    Pierwsze uwagi:
    - te dwa pliki to tylko biblioteka do obsługi LCD
    - brakuje Ci pliku z Twoim programem wykorzystującym tą bibliotekę i zawierającym w sobie startową funkcję main()

    Jak łączyć pliki napisał kolega janbernat, a książkę o której pisze kupuj w ciemno.
    W załączeniu przesyłam Ci spakowany projekt, w którym znajdziesz Twoje pliki oraz plik z funkcją main().
    Wystarczy go rozpakować i otworzyć w AVR Studio 4 poprzez menu PROJECT > OPEN PROJECT


    Przygotowane środowisko kompiluje się bezbłędnie:
    Cytat:
    Build started 24.3.2011 at 08:30:16
    avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT HD44780.o -MF dep/HD44780.o.d -c ../HD44780.c
    avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba11.o -MF dep/Proba11.o.d -c ../Proba11.c
    avr-gcc -mmcu=atmega16 -Wl,-Map=Proba11.map HD44780.o Proba11.o -o Proba11.elf
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature Proba11.elf Proba11.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex Proba11.elf Proba11.eep || exit 0
    avr-objdump -h -S Proba11.elf > Proba11.lss

    AVR Memory Usage
    ----------------
    Device: atmega16

    Program: 412 bytes (2.5% Full)
    (.text + .data + .bootloader)

    Data: 0 bytes (0.0% Full)
    (.data + .bss + .noinit)


    Build succeeded with 0 Warnings...

    0
  • #17 31 Mar 2011 18:23
    mirek1968
    Poziom 13  

    Dziękuję za wszelkie informację.Jak się bardziej pouczę w tym temacie to pewnie znów się odezwę na forum.Zamykam temat,życzę miłego dnia.

    0