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

[atmega162][c]DS18b20 - pomiar zero

DrV 30 Maj 2009 17:04 2211 16
  • #1 6594706
    DrV
    Poziom 10  
    Witam,

    Mam podpięty ds18b20 pod atmęgę, korzystam z CodevisionAVR i mam parę pytań może te pytania pozwolą mi na znalezienie błędu w kodzie.

    1. Czy taka definicja portu dla 1wire jest poprawna(w CodeVisionAVR):
    
    // 1 Wire Bus functions
    #asm
       .equ __w1_port=0x07 ;PORTE
       .equ __w1_bit=1
    #endasm

    Głównie mi chodzi czy później jak się odwołam do samej funkcji

    Temp = ds18b20_temperature(0);

    czy w zmiennej Temp będzie temperatura zmierzona przez Ds wpięty w ten pin

    2. Czy długość kabla na którym jest DS ma znaczenie?(mam 100cm kabel w ekranie)

    3.
    Jaką częstotliwością powinienem taktować atmege 162 aby pomiar mógł się odbyć (czy nie ma jakiegoś maximum gdzie już ds nie wyrabia)

    4.
    Czy przed samym wywołaniem funkcji ds18b20_temperature(0); nie muszę wywołać jakiś opóźnień lub innych operacji?
    Pozdrawiam

    Edit(17:47):
    w1_init zwraca mi wartość 0, i teraz nie wiem gdzie szukać problemu...
  • #2 6595292
    DosinskY
    Poziom 19  
    Wyczytałem, że w1_init() zwraca zero, gdy po sygnale reset na szynie nie ma odpowiedzi od urządzenia podpiętego. Sprawdź, czy podana w codevision częstotliwość taktowania uC jest zgodna z tym co masz na pcb. Sprawdź też fuse bity, czy na pewno taktujesz procka z kwarcu zewnętrznego a nie z wbudowanego oscylatora. Na koniec sprawa podstawowa - czy masz rezystor podciągający na linii 1wire (zwykle zalecany 4k7)? Resztę wyjaśnimy jak zadziała init.

    PS jeżeli nie jesteś pewny, czy definicja pinu jest poprawna, to użyj CodeWizard-a
  • #3 6595439
    DrV
    Poziom 10  
    Rezystora nie mam, gdyż ds'a zasilam osobno na Vcc a DQ tylko do danych chce używać.(może tu mój błąd...)

    Co do częstotliwości taktowania to używam wewnętrznego oscylatora, próbowałem w CVR ustawiać 1, 4 i 8 mhz i nic.
  • #4 6595509
    Elektrooonik
    Poziom 29  
    DrV napisał:
    Rezystora nie mam, gdyż ds'a zasilam osobno na Vcc a DQ tylko do danych chce używać.(może tu mój błąd...)

    Musi być rezystor obowiązkowo DQ-Vcc 4,7k lub mniejszy, zależy od warunków w jakich pracuje układ.

    Dodano po 59 [sekundy]:

    DrV napisał:

    2. Czy długość kabla na którym jest DS ma znaczenie?(mam 100cm kabel w ekranie)
    .

    Dla 1 wire to nie jest długi kabel.
  • #5 6595631
    DrV
    Poziom 10  
    No a jak nie używam zasilania pasożytniczego tylko normalne to też?
  • #6 6595674
    Elektrooonik
    Poziom 29  
    A co mówi nota katalogowa od producenta http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf ? :)

    Przy pasożytniczym i przy normalnym zasilaniu potrzebny jest rezystor.

    Po polsku masz tu:
    http://radzio.dxp.pl/ds18b20/ds18b20_podstawy.htm
    http://radzio.dxp.pl/ds18b20/

    + http://mikrokontrolery.net/avr_kursy.htm lekcja nr 10
    Tu masz w C http://mikrokontrolery.net/avr_c_10.htm
    Tu w asm http://mikrokontrolery.net/avr_asm_10.htm
  • #7 6595944
    DrV
    Poziom 10  
    Podpiąłem 5V przez rezystor i dalej nic, ambitne pytanie, czy jeżeli jest trochę za dużo to będzie działać?
  • #8 6595953
    Elektrooonik
    Poziom 29  
    Ale czego za dużo? :)
  • #9 6595993
    DrV
    Poziom 10  
    Nie miałem 4,7k to podpiąłem ok 3,0k + 2,7k więc zastanawiam się czy nie za dużo.
  • #10 6596045
    Elektrooonik
    Poziom 29  
    Nie powinno mieć znaczenia taka różnica na metrowym kabelku, na dłuższym lepiej dać 3k niż 5,7k które dałeś.
  • #11 6596622
    DrV
    Poziom 10  
    A jest jakaś inna opcja przez którą nie mogę połączyć się przez ten 1wire z ds'em?
  • #13 6597491
    DrV
    Poziom 10  
    Więc tak na portach a b c d mam sobie wyświetlacze 7 segmentowe na E mam na bicie 1 ds'a

    Teraz się jeszcze zastanawiam czy deklaracja:

    DDRE=0x00;
    PORTE=0x00;

    W momencie gdy używam 1wire nie jest przypadkiem zbędna i nie przeszkadza.

    Schemat:
    http://img193.imageshack.us/img193/5431/schemat.png

    Ten rezystor który tam narysowałem to w domyśle miałem że są te dwa które wcześniej wymieniałem kilka postów temu.
  • #14 6597526
    Elektrooonik
    Poziom 29  
    DrV napisał:

    DDRE=0x00;
    PORTE=0x00;
    .

    Jest zbędna, ale nie przeszkadza.

    Podłączyłeś DS'a w ten sposób? :[atmega162][c]DS18b20 - pomiar zero
    Bo z twojego "schematu" można się zasugerować, że podłączyłeś w odwrotnej kolejności.
  • #15 6599984
    DrV
    Poziom 10  
    Fakt mój błąd, czytałem z góry zamiast z dołu i zamieniłem nóżki 1 i 3.


    Teraz działa.

    Tylko że nie wiem czemu nie pokazuje więcej niż 25 st, powyżej dostaje na 7segmentowca 07.0 (wartość po przerobie na 7 segmentów, ale 7 faktycznie wskazuje)

    I się zastanawiam czy krzywdy nie zrobiłem tej czujce, jakieś pomysły czemu tak się dzieje?

    
    ds18b20_init(0,0, 125, DS18B20_12BIT_RES);
    


    Tak wygląda inicjalizacja Ds'a w kodzie.

    I plik includowany nagłówek tej funkcji:
    
    unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,
    unsigned char resolution);
    
  • #16 6600147
    Elektrooonik
    Poziom 29  
    Pokaż cały kod programu.
  • #17 6600183
    DrV
    Poziom 10  
    Dobra czujka była zepsuta albo ja jej krzywdę zrobiłem, raczej to drugie. Termometr działa.
    Temat do Zamknięcia.
REKLAMA