Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[mega16][c] Program nie wykrywa urządzeń 1wire (DS18B20)

22 Sie 2011 21:14 3518 26
  • Poziom 10  
    Witam!

    Korzystam z biblioteki pana Mirosława Kardasia do obsługi 1wire. Jednak już na samym początku są problemy, a mianowicie w ogóle nie wykrywa mi urządzeń na tej magistrali.

    Poniżej kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Ogólnie kod jest troche zagmatwany bo dużo już kombinowałem. Ale przede wszystkim chodzi o to że już pierwsza komenda:
    czujniki_cnt = search_sensors();
    zwraca zawsze wartość zero, czyli nie wyrywa żadnego czujnika temperatury.

    Podłączałem jeden czujnik, podłączałem dwa czujniki (podłączone są w trybie normal). Kombinowałem z różnymi pinami na różnych portach i nadal nic. Oczywiście ustawienia w bibliotekach odnośnie wykorzystywanych przez 1wire portów zmieniałem.

    Wszystko dzieje się na zestawie uruchomieniowym ATB (atnel.pl), także o połączenia elektryczne jestem pewien.

    Kwarc, którego używam to 12mhz. Fusebity dobrze ustawione, JTAG wyłączony.

    Pozdrawiam
    Z góry dziękuje za odpowiedzi.
  • Poziom 42  
    Sempth napisał:

    Korzystam z biblioteki pana Mirosława Kardasia do obsługi 1wire. Jednak już na samym początku są problemy, a mianowicie w ogóle nie wykrywa mi urządzeń na tej magistrali..


    Problemy z czym? z bibliotekami? z zestawem? z czujnikiem? czy z czym - skoro nie wykrywa? .... czy może ze zrozumieniem jak to działa? Może więc warto najpierw spokojnie dopytać co jest źle robione a nie pisać, że ze wszystkim są same problemy. Tym bardziej, że jestem zawsze do dyspozycji na maila, na skype, na telefon i chętnie udzielam pomocy technicznej.

    Tak z ciekawości zapytam na jakim pinie mikrokontrolera podpięty jest czujnik czy też podpięte są czujniki DS18x20 ??? Jak jest zrealizowane to połączenie ???

    Dodano po 2 [minuty]:

    Sempth napisał:

    Wszystko dzieje się na zestawie uruchomieniowym ATB (atnel.pl), także o połączenia elektryczne jestem pewien.


    No a ja coś tak nie jestem pewien do końca tym bardziej, że standardowo w zestawie jest kwarc 11,0592MHz, że standardowo w zestawie jest ATmega32 albo ATmega644PA .... więc jakieś zmiany nastąpiły. Warto byłoby więc wszystko dokładniej opisać.
  • Poziom 10  
    Dokładnie procek został wymieniony na mege16, a kwarc na 12mhz.

    Czujnik jest aktualnie podpięty do portu PD3. Połączenie ze środkową nóżką DS18B20 a portem PD3 jest, bo sprawdzałem multimetrem. Również zasilanie 5V na czujniku jest.
  • Poziom 42  
    Sempth napisał:
    Dokładnie procek został wymieniony na mege16, a kwarc na 12mhz.
    Ok to zrozumiałe.

    Sempth napisał:
    Czujnik jest aktualnie podpięty do portu PD3. Połączenie ze środkową nóżką DS18B20 a portem PD3 jest, bo sprawdzałem multimetrem. Również zasilanie 5V na czujniku jest.


    a czy zaglądał kolega w swojej łaskawości do pliku konfiguracyjnego o nazwie "onewire.h" w którym definiuje się pin i port na który podłączamy czujniki 1wire ???

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Bo tak coś mi się wydaje, że nie za bardzo hmmm ?
  • Poziom 10  
    Pisałem o tym w pierwszym poście:

    Sempth napisał:
    ...Kombinowałem z różnymi pinami na różnych portach i nadal nic. Oczywiście ustawienia w bibliotekach odnośnie wykorzystywanych przez 1wire portów zmieniałem....


    Kod z tej biblioteki:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 42  
    No dobra - a MAXSENSORS ustawione na ile?

    Ile jest fizycznie podłączonych czujników ? jeden (ten w zestawie? czy więcej ? (jeszcze zewnętrzne)

    Można jakąś fotkę żeby zobaczyć jak to jest fizycznie połączone przewodem połączeniowym ?

    Dodano po 5 [minuty]:

    Aha i poproszę może cały ten nie-działający kod na maila - to z chęcią rzucę okiem.
  • Poziom 10  
    MAXSENSORS ustawione teraz na 4, ale kombinowałem też ustawiać na 1 bądź 2.

    Podłączałem też oprócz tego, który jest wlutowany także zewnętrznie jeden czujnik DS18B20, także chyba można wykluczyć uszkodzenie czujnika.

    Nie wiem czy da coś tutaj fotka, po prostu podłączone zwykłym kabelkiem z konektorkami po dwóch stronach. Z jednej strony do goldpina "1wire" z drugiej do goldpina "PD3". Połączenie jest, bo jak już pisałem sprawdzałem przejście miernikiem.
    Sprawdzałem też rezystor podciągający 2,2kohm, wylutowałem, zmierzyłem jest ok.

    Podłączałem wyświetlacz LED, zegar RTC wszystko śmigało. Ale teraz już się zawiesiłem z tym, zupełnie nie wiem o co chodzi.


    Cały kod to jest to co wysłałem w pierwszym poście. Oprócz tego są dołączone pliki nagłówkowe, bez modyfikacji.
    Mogę podesłać cały projekt w AVRStudio jeżeli będzie taka potrzeba.
  • Poziom 10  
    Myślisz że d_led.c ma coś do rzeczy? NIe wiem, wrzucam kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przerwania od RTC wyłączałem, nic to nie dało.
    Albo mam tu gdzieś jakiś głupi błąd, albo oba czujniki sa popsute, co mało prawdopodobne.
  • Poziom 10  
    Biblioteki do obsługi 1wire nie korzystają z żadnego timera.

    Dodano po 9 [minuty]:

    Niestety ten zabieg też nic nie dał.
  • Poziom 11  
    Ja mam taką propozycję abyś przeanalizował kod podany w książce, a następnie spróbował obsłużyć jeden czujnik ok?

    P.S Tylko wiesz nie metodą kopiego pasta... bo widzę że przerobileś tak gotowca że nie wiadomo o co chodzi.

    Ja na twoim miejscu bym się zastanowił po co jest ten fragment:

    Code:
    int main(void)
    
    {
     
     
       czujniki_cnt = search_sensors();
       DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );
     
       _delay_ms(750);
     
       if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &subzero, &cel, &cel_fract_bits) )
          {
          cy1= cel/10;
          cy2= cel%10;
          }
       else { cy1=8; cy2=8;}



    bo moim zdaniem powinno być to tylko w pętli while(1), bynajmniej ja tak mam i działa.

    Ale jak już wcześniej mówiłem przeanalizuj jeszcze raz kod źródłowy w książce tam jest to inaczej rozwiązane ponieważ opiera się to na timerze(sprawdzanie co 3 sekundy obecność czujników na magistrali) a następnie obsłużyć jeden czujnik.

    Możesz dla pewności uruchomić na swoim zestawie ATB przykład z obsługi ds18x20 i sprawdzić działanie czujników.
  • Poziom 10  
    Wiem że program jest pokopany, ale to tylko dlatego że dużo w nim testowałem, jak zadziała to dojdę z nim do ładu.

    Wiesz podstawą tutaj jest funkcja search_sensors(); , która zawsze zwraca mi 0 (bez względu czy podłączony jest 1 czy 2 dsy). Czyli nic nie wykrywa na magistrali.
  • Poziom 10  
    Taktowanie jest ok, sprawdziłem.
  • Poziom 10  
    Problemem był kwarc..
    Zmieniłem kwarc na 8Mhz i nie wiedzieć czemu wszystko bez problemu działa.

    Pozdrawiam!
  • Poziom 42  
    Sempth napisał:
    Problemem był kwarc..
    Zmieniłem kwarc na 8Mhz i nie wiedzieć czemu wszystko bez problemu działa.

    Pozdrawiam!


    Bo prawdopodobnie w ustawieniach projektu wpisane było taktowanie 8MHz a kwarc był 11,0592MHz - przez co rozjechały się zupełnie czasy opóźnień _delay_ms i _delay_us - a przez to nie zadziałała obsługa DS'ów

    Ja bym tam spróbował włożyć znowu kwarc 11,0592MHz , zmienić taktowanie w ustawieniach projektu, skompilować ponownie ALE UŻYWAJĄC PRZY OKAZJI OPCJI CLEAN !!! i ponownie build

    Musi ruszyć i działać. Dla mnie nie może być takich rzeczy, że "nie wiedzieć czemu" ;) - trzeba do tego dojść, żeby na przyszłość tego samego błędu nie popełniać i tracić tyle czasu.
  • Poziom 10  
    Niestety muszę się z tym nie zgodzić, ponieważ wiem, że podstawą jest zmiana w plikach projektu częstotliwości kwarcu (Project->Configuration Options->Frequency).
    I tak jak wtedy miałem ustawione 12Mhz, tak teraz przestawiłem tam na 8Mhz.
  • Poziom 42  
    No ok - to dobrze - a co z kwarcem 11,0592MHz który był w zestawie? Z nim też nie działało ? Poza tym , ja procedury do obsługi DS'ów testowałem na bardzo różnych kwarcach zewn albo i na wewn. oscylatorach - nigdy nie było problemów, co zresztą może potwierdzić mnóstwo osób korzystających z tych bibliotek. Nawiasem mówiąc wcale nie moich - ja je tylko nieco zmodyfikowałem ale też nie pod kątem pracy z kwarcami czy coś w tym stylu.
  • Poziom 12  
    Dołączę się do tematu. Mam ten sam problem. Funkcja search_sensors() zwraca mi wartość 0 :(

    Poniżej kod:

    Code:
    #define F_CPU 8000000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>

    #include "lcd44780.h"

    #include "ds18x20.h"
    uint8_t subzero, cel, cel_fract_bits;
    uint8_t czujniki_cnt;
    void display_temp(uint8_t x);

    int main(void)
    {
       lcd_init();
       while (1)
       {
          czujniki_cnt = search_sensors();
          DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );
          _delay_ms(750);
          if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &subzero, &cel, &cel_fract_bits) ) display_temp(0);
          else
             {
                lcd_locate(1,0);
                lcd_str(" error ");
             }
       }      
    }


    Oczywiście w konfiguracji ustawiłem odpowiedni pin i port. Skoro innym działa , błąd tkwi gdzieś u mnie, niestety, już wyczerpały mi się pomysły :(
    Dodam, że po dołączeniu innego czujnika, nic się nie zmieniło.
  • Poziom 11  
    Sprawdź taktowanie procesora bo w tym może leżeć problem.
  • Poziom 42  
    Jak widzę u kogoś w kodzie programu taki wpis:

    Code:
    #define F_CPU 8000000UL 


    i coś tam nie działa, co zwykle zawsze i wszystkich działa, to już od razu czuję, że będzie sporo rzeczy źle zrobionych.....
  • Poziom 12  
    Ale co tu może być źle ? Nic więcej poza tym kodem nie ma. Jak widzisz to jest fragment kodu z twojej książki. Oczywiście próbowałem także uruchomić cały kod bez jakichkolwiek zmian i efekt był ten sam. Taktowanie raczej chyba ok, wyświetliłem sobie na LCD zmienną 'sekundy' i odliczało mniej więcej co sekundę.
    Zrobiłem "#define F_CPU 8000000UL " bo w nowej wersji AVRStudio z chiny nie mogę znaleźć gdzie ustawić.

    Pilnie był mi potrzebny sterownik, więc zrobiłem go w końcu w Bascom i działa. Jednak chciałbym uruchomić go w C ale powoli się poddaję...

    Absolutnie nie twierdzę , że program w książce jest zły, to na bank mea culpa, tylko nie wiem gdzie tkwi błąd.
  • Poziom 42  
    iXXL napisał:

    Zrobiłem "#define F_CPU 8000000UL " bo w nowej wersji AVRStudio z chiny nie mogę znaleźć gdzie ustawić.


    I to jest pierwszy gwóźdź zwykle do trumny w takich sytuacjach, korzystanie z AVR Studio5. Jakbyś to zrobił na AVR Studio 4 to podejrzewam, że już byłoby lepiej. A jak byś zrobił na ECLIPSE to byłoby jeszcze lepiej. Tymczasem gdybyś przejrzał to forum i poczytał tylko kilka wątków n/t AVRS 5 to być może szybko dałbyś sobie spokój z tym (niestety na razie gniotem) Może następna wersja AVRS6 będzie dopiero lepsza od ECLIPSE wtedy to i ja być może będę polecał AVRS6

    [quote="iXXL"]Jednak chciałbym uruchomić go w C ale powoli się poddaję.../quote]

    A szkoda :( tym bardziej, że nie wiem dlaczego nie odczytujesz mojej wiadomości przesłanej na PRIV do ciebie przez to forum ????

    I tym bardziej szkoda, że zdaje mi się że nawet nie zajrzałeś do lekcji VIDEO dostępnych na płycie DVD dołączonej do książki - no szkoda.

    Jak coś to napisz do mnie na maila: mirekk36 - małpka - o2.pl
  • Poziom 12  
    hmmm, żadna wiadomość nie dotarła....

    Video oglądałem jak kupiłem książkę, jednak zawsze używałem AVR studio a z tego co pamiętam, prezentowałeś obsługę Eclipse.
    Spróbuję uruchomić program w tym środowisku. Naprawdę AVR Studio jest tak tragiczne, że dobrze napisany program może po kompilacji nie ruszyć ?
  • Poziom 42  
    iXXL napisał:
    Naprawdę AVR Studio jest tak tragiczne, że dobrze napisany program może po kompilacji nie ruszyć ?


    To nie o to chodzi - tylko AVRS5 dzięki temu że nie możesz m.in znaleźć gdzie można zdefiniować wprost taktowanie procesora już jest sporym uchybieniem wg mnie a tym bardziej, w tym przypadku ....... Więc to nie sprowadza się do tak ogólnego stwierdzenia.... bo jest to bardziej skomplikowane ale jak to wytłumaczyć osobie początkującej ???? hmmm???

    Tymczasem dziwię się dlaczego właśnie nikt komu to nie zadziałało pod AVRS5 nie spróbował skompilować tego pod AVRS4 a najlepiej pod ECLIPSE, no na prawdę szkoda. A zdziwiłbyś się ....

    Zajrzyj do swojej skrzynki wiadomości na elektrodzie proszę - a jak nie to odezwij się do mnie na maila, który podałem w poprzednim poście - bo jak mogę się z tobą inaczej skontaktować ????
  • Moderator Mikrokontrolery Projektowanie
    A sprawa jest prosta - w AS5 i dołączonym do niego toolchainie skopana jest funkcja delay - w efekcie programy takie jak powyższy nie będą działały. Można skopiować delay.h z WinAVR lub najlepiej przejść na WinAVR (nawet jeśli korzysta się z AS5).