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

DS1820 na LPC2378 - brak odczytu temperatury, zmiany CRC

Zorander 23 Kwi 2008 15:40 1815 7
REKLAMA
  • #1 5069013
    Zorander
    Poziom 11  
    Posty: 15
    Witam, podłączyłem DS1820 do płytki z LPC2378 miałem stary program z MSP więc go przerobiłem. Finał jest taki, że termometr mi wykrywa ale niestety odczyt temperatury nie działa. Sprawdzam crc które nie jest 0 czyli takie jak być powinno, przy zmianach opóźnień czasowych dla odczytu i zapisu zmienia się tylko wartość crc ale wciąż jest dodatnia. Nie mam pojęcia o co chodzi czy może ktoś miał podobny problem ? Z góry dziękuje za odpowiedź.


    Poprawiłem tytuł - Regulamin. [c_p]
  • REKLAMA
  • REKLAMA
  • #3 5071256
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    ano zapewne o to chodzi. na jakiej czestosliwosci chodzi Ci ten procek? uruchomilem DSa na LPC2148 i smigal prawie odrazu (jedyny problem wynikal z pomylonego wyprowadzenia procka).
  • REKLAMA
  • #4 5072117
    Zorander
    Poziom 11  
    Posty: 15
    Domyślam się ze to timingi ale jakoś nie mogę sobie z tym poradzić, moje ustawienia co do częstotliwości taktowania procka to M = 12, N = 1, CClksel = 4 wiec CClk = 72M. Jak w takim przypadku obliczyć czas wykonywania się
    funkcji

    void DelayUs( int us )
    {
    int i;
    for (i=0; i<us; i++) {asm("nop");};
    }

    ile czasu zabiera wejście do funkcji i wyjście a ile same iteracje pętli. Jeżeli ktoś wie jak to obliczyć to bardzo proszę o pomoc bo jak na razie kolejny dzień zmieniam prawie w ciemno timingi i nic z tego nie wychodzi :/
  • REKLAMA
  • #5 5072126
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    To chyba zależy od optymalizacji stosowanej przez kompilator. U mnie przy optymalizacji na 1 poziomie CrossStudio wyrzucał wszystkie pętle opóźniające. Możesz użyć Timera do pomiaru czasu pętli, albo sprawdzić w symulacji, jeśli Twoje środowisko ją posiada.
  • #6 5072174
    slomo
    Poziom 18  
    Posty: 203
    Pomógł: 20
    Ocena: 4
    Jezeli chcesz robic dokladnie to najlepiej na timerze.
    Ja swego czasu uzywalem instrukcji SUBS(kod ponizej )calosc zajmuje 4 cykle(1 na instrukcje SUBS i 3 gdy warunek nie jest prawdziwy , 1 gdy true)

    void Delay(unsigned long int loop)  __arm
    {
          __asm{      												                                                   
    loop1:                                       
         SUBS R0,R0,#1  		 	  ;
        // SUBS R0,R0,#1 
    	 BNE loop1                 ;                               
       																			 }
    }


    pz
  • #7 5072329
    Zorander
    Poziom 11  
    Posty: 15
    Dzięki za zainteresowanie:) nie wiem dlaczego uparłem się, żeby robić delay za pomocą for, odpaliłem timera i za pierwszym razem wszystko hula.....niezły ze mnie lamer ;/ Dziękuje za odpowiedzi
    pozdrawiam
  • #8 5073692
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    no ja nie powiedzialbym zeby uzywanie timera tylko do 1wire bylo jakims super rozwiazaniem ;-) Ja z DS1820 uzywam podanej nizej funkcji opozniajacej napisanej metoda prob i bledow z wykozystaniem miernika czestotliwosci. WinARM, procek na 60MHz (peryferia na 15), optymalizacja s:
    void delay_10us(unsigned short ile_us)
    {
    	volatile unsigned short j,i;
    
    	for (i=0;i<ile_us;i++)
    		for (j=0;j<35;j++);
    }

    Powyzsza funkcja jest dosc dokladna = opoznienie 10us. np delay_10us(50) daje okolo 494us opoznienia wiec do tego zastosowania dokladnosc ma wystarczajaca w zupelnosci.

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy braku poprawnego odczytu temperatury z czujnika DS1820 podłączonego do mikrokontrolera LPC2378. Czujnik jest wykrywany, jednak odczyt temperatury nie działa prawidłowo, a wartość CRC zmienia się przy modyfikacji opóźnień czasowych, pozostając dodatnia. Dyskusja wskazuje, że przyczyną problemu są nieprawidłowe timingi komunikacji 1-Wire. Użytkownik ma trudności z precyzyjnym ustaleniem opóźnień, zwłaszcza przy implementacji funkcji delay w oparciu o pętlę for i instrukcję nop. Zalecane jest stosowanie timerów sprzętowych do dokładnego odmierzania czasu opóźnień, co potwierdzają doświadczenia innych użytkowników. Przykładowe implementacje opóźnień obejmują użycie instrukcji asemblerowych (SUBS, BNE) oraz pętli zagnieżdżonych dostosowanych do częstotliwości taktowania procesora. Wskazano także, że optymalizacja kompilatora może usuwać pętle opóźniające, co wymaga uwzględnienia przy implementacji. Ostatecznie zastosowanie timera pozwoliło na poprawne działanie odczytu temperatury z DS1820 na LPC2378.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA