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][C] - Brak komunikacji z DS18B20

docencior 30 Wrz 2012 16:57 1371 7
  • #1 30 Wrz 2012 16:57
    docencior
    Poziom 10  

    Witam,
    Zgłaszam się do was z prawdopodobnie prostym problemem, który mnie mocno przyblokował i pewnie sam sobie z nim nie poradzę. Zaznaczę, że przeszukałem połowę internetu i nie znalazłem odpowiedzi...

    Układ stanowi Atmega8 taktowana wewnętrznym zegarem 1MHz. Atmega jest podłączona do DS18B20 przewodem z rezystorem pullup ~4,4kohm

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodatkowo do pinu 2 w porcie B jest podłączona dioda, która powinna się zapalić kiedy nie występuje komunikacja z DS18B20, niestety w moim przypadku pali się zawsze...

    Sprawdziłem już czy DS18B20 jest prawidłowo podpięty, zmieniałem taktowanie zegara na 8MHz, próbowałem przeróżnych kombinacji _delay_us... Niestety nic nie pomogło dlatego zwracam się z prośbą o pomoc do was.

    0 7
  • #2 30 Wrz 2012 17:33
    excray
    Poziom 39  

    DDRC |= (1<<PC4); jest ok. Ale wymaga wcześniej ustawienia PORTC &= ~(1<<PC4);
    Daj to przed spr=ResetPulse(); Sygnał presence_pulse najlepiej sprawdzać kilkakrotnie przez jakiś czas. Jak jest podłączona dioda?

    0
  • #3 30 Wrz 2012 18:08
    docencior
    Poziom 10  

    Byłem przekonany, że ustawiając Port C, pin 4 na wyjście automatycznie jest on w stanie niskim. Dioda jest podłączona dobrze, przez rezystor 330 do minusa.
    Wszystkie twoje sugestie sprawdzę jak tylko będę mógł.

    EDIT.

    Według wskazówek powyżej zrobiłem coś takiego

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety dioda dalej świeci...

    0
  • #4 01 Paź 2012 17:54
    excray
    Poziom 39  

    Ten nowy program main jest 3 razy gorszy niż ten stary. Wywal go zanim jakiś miłośnik C zobaczy to GOTO. Stary był dobry. Dlaczego używasz typu int w 8-mio bitowym procesorze skoro przechowujesz tam tylko bit informacji? Używaj typu char bo to naturalny typ dla 8-mio bitowego procesora, chyba że naprawdę potrzebujesz większy typ. Jak wspominałem dobrze jest sprawdzać ileś tam razy czy nie wystąpił presence pulse a Ty w dalszym ciągu sprawdzasz tylko raz. Spróbuj tego:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 01 Paź 2012 23:09
    docencior
    Poziom 10  

    Źle zrozumiałem twój poprzedni post. Myślałem, że trzeba DSa 'atakować' pulsami bo nie zawsze odpowiada, a że naskrobałem coś bardzo szybko to pojawiło się GOTO. Cały czas się uczę...

    Tak czy inaczej stała się rzecz dla mnie dziwna. Wkleiłem twój kod i znów dioda się paliła. Zacząłem kombinować z czasami i taktowaniem zegara i okazało się, że działa. Okazało się, że na końcu nawet wkleiłem kod, który umieściłem tu w pierwszym poście i też zadziałał...
    Wynikiem poszukiwań było to, że gdy ustawię w makefile zegar na 8MHz to układ nie działa a gdy ustawię 1MHz działa.
    To czemu na początku mi nie działało? Zauważyłem, że po zmianie pliku makefile nie wystarczy wcisnąć 'Make ALL' a następnie 'Program', musiałem najpierw zrobić jakiś ruch w kodzie (np wcisnąć enter) żeby zapisać plik *.c i dopiero wtedy wszystko działało...
    Inna sprawa czemu program nie działa przy zegarze wewnętrznym 8Mhz?

    0
  • Pomocny post
    #6 01 Paź 2012 23:14
    excray
    Poziom 39  

    Nie wiem w jakim środowisku piszesz ale w AVR Studio musisz też podać częstotliwość zegara z jaką układ będzie pracować. Inaczej źle Ci powylicza opóźnienia _delay_ms i _delay_us

    0
  • #8 02 Paź 2012 13:15
    docencior
    Poziom 10  

    Używam WinAVR. Wydaję mi się, że WinAVR nie zmienia fusebitów tak więc _delaye były dla częstotliwości 8MHz a uC pracował z 1MHz. Stąd problemy...
    Tak czy inaczej dzięki za pomoc.

    0