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.

Atmega8 +lcd2x16 + DS18B20 brak komunikacji

misiu14 13 Sty 2014 21:38 1362 5
  • #1 13 Sty 2014 21:38
    misiu14
    Poziom 10  

    Witam
    Pisząc program pod mikrokontroler Atmega8 napotkałem problem.
    Ogólnie program ma pokazywać tylko temperaturę odczytaną z czujnika DS18B20
    Obsługa LCD działa, układ programuję się prawidłowo, ale na wyświetlaczu dostaje tylko komunikat, że czujnik jest niedostępny.
    Czujnik temperatury podłączony jest pod port PD0. I zasilany jest z tego samego źródła zasilania, co Atmega8. Pod linią danych jest też rezystor podciągający 4,6k.
    Niżej dodaje kod programu.
    Czy mógłby ktoś pomóc w znalezieniu przyczyny złego działania układu?

    Kod programu :

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 5
  • #2 14 Sty 2014 00:14
    dejmos
    Poziom 23  

    W funkcji unsigned char read(void) powinno być opóźnienie na pozostałą część trwania bitu.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Funkcja void send(char bit) jest chyba też źle napisana powinno być:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dopisz jeszcze w mainie
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przeanalizuj dokładnie cały program i skorzystaj jeszcze z tego Link strona 9 i 10 interwały czasowe i algorytmy. Powodzenia.

    0
  • #3 14 Sty 2014 00:25
    laki_17
    Poziom 17  

    Code:

    #define PORT_1wire PIND - czytanie portu
    #define SET_1wire DDRD&=~_BV(we) - ustawienie portu jako wejscie
    #define CLEAR_1wire DDRD|=_BV(we) -ustawienie portu jako wyjscie

    Do zmiany stanu na porcie "D" służy "PORTD". A "DDRD" zmienia czy to ma być wejście albo wyjście.
    Przejrzyj funkcje
    Code:
    unsigned char RESET_PULSE(void) 

    i wywnioskuj jak działa u Ciebie.
    Używaj znaczników "code" podczas wklejania fragmentów programu do posta i pomyliłeś dział.

    0
  • #4 14 Sty 2014 07:53
    dondu
    Moderator Mikrokontrolery Projektowanie

    Pokaż jeszcze na wszelki wypadek schemat.

    laki_17 napisał:
    Używaj znaczników "code" podczas wklejania fragmentów programu do posta i pomyliłeś dział.

    Nie. Na tym forum używamy znacznika SYNTAX wybierając język C, czyli tak jak kolega Dejmos.

    0
  • #5 14 Sty 2014 07:53
    dejmos
    Poziom 23  

    laki_17 napisał:
    Do zmiany stanu na porcie "D" służy "PORTD". A "DDRD" zmienia czy to ma być wejście albo wyjście.

    laki_17 masz rację tylko w przypadku linii 1wire jest akurat dobrze ponieważ wpisując na początku programu zero do rejestru PORTD i ustawiając port jako wyjście ściągamy linię 1 wire do zera. Ustawiając go jako wejście (port w stanie wysokiej impedancji) zwalniamy linię a rezystor na linii podciąga ją do jedynki. Takie rozwiązanie jest bezpieczne bo nie spowodujemy przypadkowego uszkodzenia portu (np zwarcie na linii) a w przypadku wielu urządzeń na linii z zasilaniem pasożytniczym port mógłby zostać przeciążony.

    0
  • #6 14 Sty 2014 08:54
    laki_17
    Poziom 17  

    dondu masz rację co do tego znacznika SYNTAX, myślałem że ogólnie stosowany jest znacznik CODE.
    dejmos miałem to sprawdzić osobiście jak to jest w tym przypadku, ale dzięki za info przy okazji ja czegoś się nauczę podczas tego tematu.

    0