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

[AVR][C] - DS1990A, DS18B20, 1Wire - kompletny przykład

PietrekDer 11 Sie 2008 15:53 23786 28
REKLAMA
  • #1 5429456
    PietrekDer
    Poziom 13  
    Witam
    Wiem, temat był już poruszany, przeglądałem kilka wcześniejszych postów nt 1Wire, przeczytałem kilka dokumentacji, opis z TEJ strony, a także opis z książki "Mikrokontrolery AVR w praktyce". Patrzę w kod, i nie widzę jakichś błędów i wszystko wydaje się być w porządku. A mimo to nie mogę odczytać danych z pastylki DS1990A.

    Jeśli chodzi o te wszystkie interwały czasowe, to korzystałem też z tych opisów z książki (obrazki na dole).

    A także z tych co są na podanej wyżej stronie (tylko czasy są w us, bo tam są używane mylące skróty ms).

    Magistrala 1-Wire jest na PortB.0, na razie "na sztywno" przyporządkowana.
    Oto kod który o dziwo niestety nie działa :/ :p :

    Główne dwa makra, sterujące magistralą 1-Wire:
    #define _1W_SET_0()	{ DDRB |= 0x01; }	//PB.0 jako wyjście, 
    														//PortB.0 = 0, więc stan na linii wynosi 0
    #define _1W_SET_1()	{ DDRB &= 0xFE;}	//PB.0 jako wejście,
    														//stan 1 pochodzi z rezystora PullUp


    Inicjalizacja magistrali 1-Wire, to działa, pastylka daje 0 na linii, funkcja zwraca 0.
    
    uint8_t _1WireInit( void )
    {
    	uint8_t InitBit=0;
    	
    	_1W_SET_0();	//stan 0 na linii
    	waitus(250);	//opóźnienie 500us
    	waitus(250);
    	_1W_SET_1();	//stan 1 na linii
    	waitus(75);
    	InitBit = (PINB & 0x01);	//czytaj z PinB.0
    	waitus(200);
    	waitus(205);	//czekaj 416us do końca inicjalizacji
    	return InitBit;	//zwraca 0-OK lub 1-nie wykryto pastylki
    }


    "Slot" zapisu:
    
    void _1WireWriteSlot(uint8_t bit)
    {
    	if(bit)		//Write 1
    	{
    		_1W_SET_0();
    		waitus(10);
    		_1W_SET_1();
    		waitus(65);
    	}
    	else		//Write 0
    	{
    		_1W_SET_0();
    		waitus(100);
    		_1W_SET_1();
    		waitus(3);
    	}
    }
    

    "Slot" odczytu:
    
    uint8_t _1WireReadSlot(void)
    {
    	uint8_t _bit=0;
    	
    	_1W_SET_0();	//ustaw 0
    	waitus(1);
    	_1W_SET_1();	//zwolnij magistralę, stan H z rezystora PullUp
    	waitus(8);
    	_bit = (PINB & 0x01);		//zwróć wartość PinB.0, 1 lub 0
    	
    	waitus(25);
    	return _bit;
    }


    Wysłanie bajtu danych do układu:
    
    void _1WireWriteByte(uint8_t dana)
    {
    	uint8_t i;
    	for(i=0; i<8; i++)
    	{
    		_1WireWriteSlot( dana & 0x01 );		//wyślij 1 lub 0
    		dana >>= 1;
    	}
    }


    Odczyt bajtu danych z magistrali:
    
    uint8_t _1WireReadByte(void)
    {
    	uint8_t i;
    	uint8_t data=0;
    	
    	for(i=0x01; i!=0; i<<=1)	//za każdym obiegiem, przesuń jedynkę w lewo odpowiada
    	{							//pozycjom zczytanej wartości (czytamy od LSB do MSB)
    		if( _1WireReadSlot() )		//jeśli _1WireReadSlot() odczytał 1
    			data |= i;			//umieść 1 na odpowiedniej pozycji
    	}
    	return data;
    }


    Fragment funkcji main, nie wrzucam całego żeby nie robić śmietnika:
    
    		DDRB = 0x00;
    		PORTB = 0x00;
    		
    		data1 = _1WireInit();
    		if(!data1)	//0 - oznacza udaną inicjalizację
    		{
    			_1WireWriteByte(0x33);
    			for(uint8_t i=0; i<8; i++)
    			{	//zapis 8-miu bajtów do bufora
    				WireBuffer[i] = _1WireReadByte();
    			}
    		}


    Później bufor odczytanych wartości wrzucam na wyśw. LCD i tam pokazuje wartości 255 albo 254.

    Przeglądałem kod nie raz, wszystkie odstępy czasowewydają się być w porządku, opcje sterowania linią 1W też. Ale jednak coś nie działa, i już nie mam zielonego pojęcia co to może być. Pastylka jest dobra.
  • REKLAMA
  • #2 5429829
    aster11
    Poziom 19  
    1. Czy masz zewnętrzny rezystor podciągający na linii danych?, wewnętrzny (najprawdopodobniej) nie będzie wystarczający.
    2. Testuj funkcjonalność programu stopniowo. Na początek sprawdź, czy pastylka odpowiada sygnałem obecności po resetowaniu.
  • #3 5429884
    PietrekDer
    Poziom 13  
    Tak, mam zewnętrzny rezystor 4.7k, i pastylka odpowiada, funkcja _1WireInit zwraca 0 gdy wykryje urządzenia Slave. Resztę funkcji (slot czytania, zapisywania; wysłanie i odebranie bajtu) pisałem korzystając z przykładu ze strony BTC ćw9-obsługa 1-Wire. Mogę nawet powiedzieć, że po części przepisywałem te funkcje, używając jednak swoich makr i funkcji opóźniających. A makra są dobre, bo wykrywa pastylkę, nawet w AVRStudio sprawdzałem jak dokładnie odmierzane są opóźnienia przez funkcje waitus(t) oraz wait100us(t) i dokładność wynosi +/- 0.5us dla pierwszej i +/- 2us dla drugiej funkcji. Kwarce w symulacji w układzie jak i Makefile są zdefiniowane na 4MHz.
  • REKLAMA
  • #4 5429983
    aster11
    Poziom 19  
    Z 1-wire trzeba trochę poeksperymentować, ale z reguły szybko się udaje. Bawiłem się z tym na różnych rodzinach mikrokontrolerów i przeszkadzały różne niedopatrzenia (najczęściej czasy), ale ostatecznie wszystko ruszało.

    Czy może nie masz zbyt małego czasu przed odczytem linii danych w funkcji odczytu bitu uint8_t _1WireReadSlot(void) ? Specyfikacja podaje, że czas walidacji danych wynosi 15us od zbocza opadającego, a u Ciebie jest (1+8)us, może spróbuj ustawić (3+12)us, czy coś koło tego.

    I klasyczne pytanie - przerwania? Jeżeli używasz jakichś, powinieneś blokować na czas elementarnych transakcji 1-wire. To jednak pewnie nie powód kłopotów, bo przerwania powodują zakłócenia raczej akcydentalne.
  • #5 5431392
    PietrekDer
    Poziom 13  
    Witam
    Udało mi się końcu dzisiaj rozwiązać problem. W jednym miejscu (_1WReadSlot(), tuż za odczytaniem bitu) ustawiłem za małe opóźnienie (25us, a powinno być 60us). Jeszcze spróbuje "pogadać" z DS18B20, i postaram się wrzucić tutaj gotowe funkcje do obsługi 1Wire.

    Dodano po 4 [godziny] 47 [minuty]:

    Zgodnie z obietnicą podaje gotowy projekt w WinAVR, pod ATmega8 @ 4MHz. Program obsługuje albo DS18B20 albo DS1990A, należy po prostu wykomentować odpowiedni fragment programu. Są też dwa gotowe HEX.
  • #6 6332870
    NIEBO!
    Poziom 12  
    Witam!
    Czy ktoś sprawdzał ten projekt z pliku ZIP opublikowany 12 Sie 2008 13:23 przez PietrekDer. Jutro jadę po kwarc 4MHz, bo na wewnętrznym oscylatorze RC=4MHz mam "czrny" LCD i mówiąc krótko nic się nie dzieje - na magistrali 1wire cisza - podejrzewam, iż tak procek nie ruszy.... Próbowałem już z zewnętrznym 8MHz, ale chyba to też nie tędy droga... sorrki za pytanie, ale czy ktoś to sprawdza,ł bo jestem początkujący w programowaniu, a troszkę tych plików tu jest polinkowanych :-) Zaznaczam iż program (co rzadko się zdarza w tutaj zamieszczonych) kompiluje się poprawnie w AVRGCC.

    Jeśli ktoś sprawdzał i nie działa, albo nie sprawdzał, a zna jakiś poprawny program do obsługi DS1990A pod ATMega8 lub ATTiny2313 napisany w C to bardzo proszę o kontakt!

    Pozdrawiam!
    NIEBO!™
  • #7 6333248
    PietrekDer
    Poziom 13  
    No szczerze mówiąc, to ja założyłem temat, mając problemy z odpaleniem 1Wire, ale gdy mi się to udało, wrzuciłem cały gotowy kod oraz projekt do pobrania. Nie wrzucałbym gdyby nie działało :) Sprawdź jak masz ustawiony Adjust (kontrast) w wyświetlaczu (powinieneś mieć podłączony do którejś nóżki wyświetlacza jakiś potencjometr), bo jak masz cały czarny, to może jest na max ustawiony kontrast?

    Domyślnie nawet nie musisz nic kompilować, jak chcesz odczytać kod z DS1990A wystarczy że wgrasz plik DS1990.hex do procka (mega8) i powinno ruszyć.
  • #8 6335786
    NIEBO!
    Poziom 12  
    Witam serdecznie autora :)

    Dzięki za szybką odpowiedź i domyślam się ( i to bardzo miłe z Twojej strony) ,że wrzuciłeś nie tylko hex ale cały projekt mimo wszystko mam problemy z jego odpaleniem. Może mam coś źle podłączone lub ustawione.Poniżej zamieszczam schemat wg którego mam to spięte na płytce stykowej i ustawienia FuseBitów. Dzisiaj nabyłem rezonator 4MHz zmieniłem Fuse Bity i ... no nie działa :P Gdybyś Ty lub ktokolwiek inny mógł rzucić okiem.... Oczywiście kontrast sprawdzałem - albo jest cały czarny - zapalone wszystkie pola - albo nic nie ma - mam ustawione teraz na środek suwaczek więc zauważę gdy cokolwiek sie zaświeci. Wyświetlacz sprawny - po przełożeniu do uruchomionego wcześniej multimetru na ATMega działa.
    [AVR][C] - DS1990A, DS18B20, 1Wire - kompletny przykład
    [AVR][C] - DS1990A, DS18B20, 1Wire - kompletny przykład

    Z góry przepraszam za mało czytelny schemat ....

    Mam jeszcze merytoryczne pytanie bo nigdzie nie jest napisane jak działa ów program ... do czego służy przycisk i czy po dołożeniu pastylki na wyświetlaczu pojawia się jej numer seryjny ... bo może ja nie wiem jak powinien działać ten program i spodziewając się czegoś innego twierdzę że nie działa :-)

    Pozdrawiam
    NIEBO!™
  • #9 6336920
    zumek
    Poziom 39  
    NIEBO! napisał:
    ... do czego służy przycisk...

    Wciśnięcie tego przycisku, powoduje jednokrotne wykonanie programu głównego.
    DS1990A - odczytanie ID
    DS18B20 - odczyt temperatury
  • REKLAMA
  • #10 6337349
    NIEBO!
    Poziom 12  
    zumek napisał:

    Wciśnięcie tego przycisku, powoduje jednokrotne wykonanie programu głównego.
    DS1990A - odczytanie ID

    Aaahhh zumek ale mi zrobiłeś nadzieję - włączyłem jeszcze raz machinerię, przyłożyłem na stałe pastylkę do czytnika ... z napięciem wcisnąłem swich'a i ... i nic :P Ktoś ma jeszcze jakieś pomysły? :) Wierzę że autor tak jak wczoraj pojawi się po 22:00 i znów rzuci jakąś iskierkę nadziei :) Tak czy siak zachęcam wszystkich :):):):)

    Jednocześnie może ktoś wie jak przerobić przykład Pana Dolińskiego z książki Mikrokontrolery AVR w praktyce - ćwiczenie 9 pod uK ATTiny2313 lub inny "mały" AVR, bo ten program niestety się nie kompiluje i wyskakuje za dużo, błędów których nie umiem poprawić. W załączniku znajduje się wyodrębniony plik zawierający plik C i HEX zaczerpnięty ze strony BTC

    Pozdrawiam!
    NIEBO!™
  • #11 6337818
    zumek
    Poziom 39  
    NIEBO! napisał:
    Ktoś ma jeszcze jakieś pomysły? :)

    Ja mam ;)
    Masz gotowy projekt, więc popracuj nad nim, bo o gotowca, to tu niezwykle ciężko :-P
    Na początek, zacznij może od uruchomienia LCD, a jak już go uruchomisz, to w następnej kolejności zajmij się 1wire. W razie kłopotów, pisz tu śmiało.

    PS
    Jakiego środowiska używasz do "zabawy" w programowanie :?: ;)
  • #12 6338140
    NIEBO!
    Poziom 12  
    zumek napisał:
    Masz gotowy projekt, więc popracuj nad nim, bo o gotowca, to tu niezwykle ciężko

    Wiesz ... ze słów autora wynika, iż ów gotowiec działa i nie trzeba nad nim pracować, a ja nie jestem nawet pewien poprawności podłączenia uK do LCD ... np zastanawia mnie linia RW ... w projekcie wisi w powietrzu, a ja ją podpiąłem do masy ... a ona chyba powinna być jakoś sterowana :)

    zumek napisał:
    Jakiego środowiska używasz do "zabawy" w programowanie?

    Zestawik w postaci:
    • WinAVR-20080610
    • Programmers Notepad [WinAVR]
    • AVRDude + AVR8-Burn-O-Mat
    • Programator DIY - USBasp by Duch

    Mam także nieuruchomiony niestety jeszcze AVT-3505 (brak czasu) ... i niestety nie jestem na tyle dobry jeszcze w C żeby zapanować nad całym tym projektem i raczej nie będziesz mnie "mógł" (niestety) zmusić do tak intensywnych działań jak kolegę Kubbaz w temacie 1-wire interface ATMEGA8 czego żałuję, bo chciałbym już posiadać tą wiedzę, a Ty widzę jesteś nieźle obcykany - cóż ... pozostaje szukać dalej :) Jak uruchomię projekt na pewno również go zamieszczę dla potomnych początkujących, bo te pastylki teraz są już bardzo tanie i bardzo "fajnie" działają ... no nie mi jeszcze ... ale chyba je poskromię :) Przynajmniej takie jest założenie. :) ... a tak jak mówisz - gotowców jest jak na lekarstwo.

    Pozdrawiam
    NIEBO!™


    P.S. Nadal mam cichą nadzieję ze pojawi się tutaj PietrekDer :)
  • #13 6360635
    PietrekDer
    Poziom 13  
    No gotowiec jest, a (może o tym zapomniałem wspomnieć) jeśli chodzi o podłączenie LCD itd, to ja podałem podłączenie tylko tych pinów które są TYLKO I WYŁĄCZNIE pomiędzy LCD (DS1990A) a uC, reszta pinów LCD (jak m.in. wspomniane RW) powinna być podpięta domyślnie jak w standardowych projektach. Czyli wszystkie piny typu Reset, do kwarców, zasilania :P i inne "standardowe" podłączamy "sami".

    Jak będziesz miał jakieś problemy to pisz śmiało :)
  • #14 6362477
    NIEBO!
    Poziom 12  
    Witam!
    No napisałem wyżej - a raczej narysowałem schemat ... dla mnie nie ma jakieś standardowej nóżki do podpięcia RW - oczywiście mam podpięte zasilanie uK i LCD, rezonator + 2x22pF, wszystko wg wyżej pokazanego schematu* - RW nie próbowałem podciągać pod żadne z wyprowadzeń uK. W każdym razie podpięte pod masę nie działało. W/w program złożony wg schematu*, który udało mi się wywnioskować nie działa. Jeśli masz jeszcze jakieś rady co powinienem zmienić w "gotowcu" "to pisz śmiało Smile"

    *schemat pokazano wyżej 26 Mar 2009 17:50.

    ========= PO x GODZINACH ==========

    UKŁAD DZIAŁA!
    Trzeba nad nim troszkę posiedzieć :) Mam jednak nadzieję, że na coś się te moje "zwątpienia" zdały - schemat podłączenia który wywnioskowałem jest poprawny LCD_RW może być podpięte do masy.

    Pozdrawiam
    NIEBO!™
  • #15 6369084
    PietrekDer
    Poziom 13  
    No nie "można" ale wręcz trzeba podpiąć do masy, jest to sygnał Read/Write.
    Tak więc z moimi plikami źródłowymi oraz z Twoim schematem powstał tutaj całkiem przyjemny gotowiec do obsługi 1Wire :D

    Pozdrawiam.
  • #16 6637677
    Mihó
    Poziom 27  
    Odkopuję temat. Mam już uruchomiony program. Chciałbym jednak, by odczytany numer seryjny został zapisany do jakiejś zmiennej, którą następnie można stosunkowo łatwo odczytać/porównać. Jakieś sugestie ?
  • #17 6644678
    NIEBO!
    Poziom 12  
    Z tego co widzę to odczytany numer masz w zmiennej WireBuffer :)
  • #20 6649391
    Mihó
    Poziom 27  
    Nie mam takich funkcji w bibliotece. By wyświetlać wartości 16tkowe, wykonuję:

     for(i=6;i!=0xff;i--)     //wyświetlenie danych z pastylki
        {	
    utoa((unsigned char)bufor1w[i],buflcd,16); //przepisz bufor1w do bufora wyświetlacza z jednoczesną konwersją na ASCII
    		lcd_puts(buflcd);		
    	}


    Ta funkcja wyświetla mi w jednym wierszu wszystko.

    Zastanawia mnie, jak wyciągnąć tą wartość wprost - bym miał ją zapisaną w jakiejś zmiennej (np. char/string) i mógł porównywać (czy są zgodne)
  • #21 6657671
    Mihó
    Poziom 27  
    Niestety problem jest dalej. Program wyświetla w pierwszej linii zawartość bufora, ale nie wiem jak tę zmienną wykorzystać dalej - chciałbym mieć możliwość jej sprawdzenia - tzn. sygnalizacji, że odczytana zawartość bufora jest zgodna z zapisanym wcześniej numerem - chodzi mi o porównanie z inną zmienną

    
    #include <stdlib.h>
    #include <lcd.c>
    #include <lcd.h>
    
    //  Poniższe definicje służą do realizacji wygodnego dostępu bitowego
    typedef struct _bit_struct
    {
     unsigned char bit0: 1;
     unsigned char bit1: 1;
     unsigned char bit2: 1;
     unsigned char bit3: 1;
     unsigned char bit4: 1;
     unsigned char bit5: 1;
     unsigned char bit6: 1;
     unsigned char bit7: 1;
    }pole_bitowe;
    
    int buf;
    
    #define DAJ_BIT(adr) (*((volatile pole_bitowe*) (adr)))
    #define _PORTB 0x38
    #define _PINB 0x36
    #define _PORTD 0x32
    #define _DDRD 0x31
    #define _PIND 0x30
    #define pastylka_we DAJ_BIT(_PIND).bit3
    #define pastylka_wy DAJ_BIT(_DDRD).bit3
    
    #define stan_0 1   //definicja stanu niskiego na linii1-wire
                       //"1" oznacza przełączenie portu w tryb wyjściowy
                       //port jest wcześniej wysterowany w stan niski
    #define stan_1 0   //definicja stanu wysokiego na linii1-wire
                       //"0" oznacza przełączenie portu w tryb wejściowy
                       //stan wysoki jest wymuszany przez zewnętrzny
                       //rezystor podciągający
    
    char buflcd[4];    //roboczy bufor wyświetlacza LCD
    unsigned char bufor1w[8];    //bufor interfejsu 1-wire (dane z pastylki)
    char *pbuflcd;     //wskaźnik na bufor wyświetlacza
    unsigned char *pbufor1w;     //wskaźnik na bufor danych z pastylki
    
    //>>>>>>>>>>>>>    Procedury obsługi interfejsu 1-Wire   <<<<<<<<<<<<<<<<<<
    void waitus(unsigned char tau)
    {    
    	do
    	{
    		asm("nop");           //NOP
    	}while(--tau!=0);
    }
    
    unsigned char slot1w_czyt(void)  //slot odczytu pastylki
    {
     unsigned char bit1w;
     pastylka_wy=stan_0;         //inicjuj slot czytania
     waitus(1);               //odczekaj tsu
     pastylka_wy=stan_1;         //zwolnij linię
     waitus(12);              //ok. 14us
     bit1w=pastylka_we==1?1:0;
     waitus(60);             //ok. 60us
     return bit1w; 
    }
    
    void slot1w_zap(unsigned char znak)       //slot zapisu do pastylki
    {
     if(znak)
     {                           //slot "1"
      pastylka_wy=stan_0;        //inicjuj slot
      	waitus(11);            //ok. 11us
      pastylka_wy=stan_1;        //podciąganie do "1" rezystorem zewnętrznym
      	waitus(49);            //60us do końca slotu  
     }
     else
     {                           //slot "0"
      pastylka_wy=stan_0;        //inicjuj slot
      waitus(70);            //ok. 70us
      pastylka_wy=stan_1;        //podciąganie do "1" rezystorem zewnętrznym
    waitus(3);
     }
    }
    
    void zapisz1w(unsigned char rozkaz)    //transmisja 8-bitowego rozkazu do pastylki
    {
     unsigned char i;
     for(i=0;i<8;i++)
     {
      slot1w_zap(rozkaz&0x01); //wyślij bit do pastylki
      rozkaz>>=1;
     }
    }
    
    void czytaj1w(void)          //odczyt bajtu z pastylki
    {
     unsigned char i,j;
     unsigned char dana;
    
     pbufor1w=&bufor1w[0];  //dane będą umieszczone w buforze "bufor1w"
     for(i=0;i<8;i++)       //czytaj "family code" (1bajt) 
     {                      //i "registration number" (6 bajtów)
      dana=0;               //wstępne zerowanie danej
      for(j=0x01;j!=0;j<<=1)     //zmienna sterująca pętli wskazuje jednocześnie
      {                          //aktualnie zapisywany bit
       dana|=slot1w_czyt()?j:dana;   //czytaj kolejne bity (są one sumowane logicznie
      }                          //z odczytanymi wcześniej
      *pbufor1w++=dana;          //po skompletowaniu zapisz odebrany bajt do bufora
     }
    }
    
    void licz_CRC(char bajt,unsigned char *CRC)      //procedura wyliczania CRC
    {                  //wielomian generujący jest równy: x^8 + x^5 + x^4 + 1
     unsigned char zp1,zp2,i;    //zmienne pomocnicze
     zp1=bajt;
     for(i=0;i<8;i++)
     {
      bajt^=*CRC;           //wskaźnik *CRC wyznacza aktualnie wyliczony CRC
      zp2=bajt&0x01;        //wydzielenie bitu do obliczeń
      bajt=*CRC;
      if(zp2)
      {
       bajt^=0x18;
      }
      bajt=((unsigned char)(bajt)>>1)+0x80*zp2; //konwersja uch jest potrzebna do
                                                //prawidłowego wykonania przesunięcia 
      *CRC=bajt;
      zp1=(bajt=zp1>>1);    
     }
    }
    
    int main(void)     //program główny
    {
     unsigned char i;
     unsigned char zp=0;
    	DDRD = 0b00000000;
    	PORTD = 0b00000000;	
    	lcd_init(LCD_DISP_ON);
    
     while(1)               //główna pętla programu
     {
      zp=0;
      pastylka_wy=stan_0;   //sekwencja inicjująca pastylkę
      	waitus(200);	//opóźnienie 500us
    	waitus(250);            
      pastylka_wy=stan_1;   //zwolnij linię
      waitus(60);
     if(pastylka_we==0)
      {
       zp++;                //zapamiętaj fakt wykrycia impulsu obecności pastylki
      }
       
      	waitus(200);
    	waitus(200);	//czekaj 416us do końca inicjalizacji 
      if(pastylka_we==0)
      {
       zp++;           //jeśli pozostaje w stanie niskim, to oznacza zwykłe zwarcie
      }
      
      
      if(zp==1)        //reakcja na rozpoznane sytuacje
      {                //jeśli zp=1, to oznacza że pastylka zgłosiła się
    	lcd_gotoxy(0,0);
    	zapisz1w(0x33); //wyślij do pastylki kod rozkazu przesłania numeru seryjnego 
    	czytaj1w();     //czytaj numer seryjny pastylki (+ kod rodziny + CRC)
    	zp=0;           //w zp będzie liczone CRC - wstępne zerowanie
    	for(i=0;i<8;i++)
    	{
    		licz_CRC(bufor1w[i],&zp);     //licz CRC ze wszystkich bajtów odebranych
    	}  
    	pbufor1w=&bufor1w[7];
    	
        for(i=6;i!=0xff;i--)     //wyświetlenie danych z pastylki
        {	
    		itoa((unsigned char)bufor1w[i],buflcd,16); //przepisz bufor1w do
    														//bufora wyświetlacza z jednoczesną konwersją na ASCII
    		lcd_puts(buflcd);
    	}
    	}
    }	
    }
  • #22 10194263
    parkerb
    Poziom 11  
    Odświeżam trochę temat. Udało się komuś uruchomić jednocześnie pastylkę i termometr?
  • #23 10195058
    NIEBO!
    Poziom 12  
    Witaj!
    Co masz na myśli mówiąc "jednocześnie"? Masz na myśli immobiliser z termometrem w jednym? :)

    Ten przykład tutaj działa :) To niewątpliwie, bo kiedyś go uruchomiłem ... z pełnym sukcesem, tak więc musisz próbować :) Albo pisz co jest niejasne, co Ci nie działa, albo jakie masz błędy ...

    Ja teraz zmagam się z zegarem :)
    Chcę zrobić zegar ATMEGA8+PCF+właśnie DS18B20... najpierw na LCD potem na LED. Jest tego masa w BASCOMie, ale ja próbuję znaleźć i dostosować pod siebie C ... może ktoś ma namiary na jakiś "gotowiec" zegara z termometrem w C na ATMEGA 8? :) Jeden już znalazłem i jest obiecujący, ale pytam na wyrost :)


    Pozdrawiam
    NIEBO!™
  • #24 10195509
    parkerb
    Poziom 11  
    NIEBO! napisał:
    Witaj!
    Co masz na myśli mówiąc "jednocześnie"? Masz na myśli immobiliser z termometrem w jednym? :)

    Ten przykład tutaj działa :) To niewątpliwie, bo kiedyś go uruchomiłem ... z pełnym sukcesem, tak więc musisz próbować :) Albo pisz co jest niejasne, co Ci nie działa, albo jakie masz błędy ...

    Ja teraz zmagam się z zegarem :)
    Chcę zrobić zegar ATMEGA8+PCF+właśnie DS18B20... najpierw na LCD potem na LED. Jest tego masa w BASCOMie, ale ja próbuję znaleźć i dostosować pod siebie C ... może ktoś ma namiary na jakiś "gotowiec" zegara z termometrem w C na ATMEGA 8? :) Jeden już znalazłem i jest obiecujący, ale pytam na wyrost :)


    Pozdrawiam
    NIEBO!™

    No można powiedzieć że immobiliser z kilkoma termometrami :D Tu masz link do czegoś podobnego co brat robił jakiś czas temu.
    Nie korzystam z programu który jest umieszczony w tym temacie. Chodziło mi o to czy ktoś kiedyś w ogóle uruchamiał te dwa układy i czy się nie "gryzły".

    Miałem problem z tym że jak podłączyłem pastylkę to zawieszało się zczytywanie ID z termometrów, ale udało mi się to rozwiązać. Muszę jeszcze sprawdzić czy prawidłowo działa odbieranie danych. Jak nie zapomnę i znajdę trochę czasu to podeślę Ci jutro gotowy program na ATmega32 do odczytu czasu z PCF8583. LCD: KS108 czy HD44780 ??
  • #25 10195615
    NIEBO!
    Poziom 12  
    Hej - Fajny projekcik ten z linku :) Ja obsługiwałem tylko same 1990A i to działało :) Tyle mogę doradzić.

    Mój LCD to HD44780. Jeśli coś masz to będe wdzięczny :) Zweryfikuję z tym co już znalazłem :).

    Pozdrawiam
  • REKLAMA
  • #26 10227235
    PietrekDer
    Poziom 13  
    Hmm, z tego co pamiętam, program który tu wrzuciłem obsługiwał tylko jeden układ podłączony do magistrali 1-Wire, czyli trzeba by go tak zmodyfikować, żeby można było podpiąć wiele urządzeń i odwoływać się do nich poprzez ich specyficzne adresy. Modyfikacje chyba nie byłyby zbyt duże, tak mi się wydaje :)

    Albo tak zmodyfikować program, by można było wybrać który pin ma być aktualnie używany do komunikacji i np na każde urządzenie (układ) przyporządkować osobny pin mikrokontrolera, co jednak ogólnie jest pomysłem do bani, kod wynikowy może być nawet większy niż w pierwszym przypadku i niepotrzebne marnowanie pinów procka :]
  • #27 10422421
    Sensej17
    Poziom 11  
    Witam. Mam tak połączony układ
    [AVR][C] - DS1990A, DS18B20, 1Wire - kompletny przykład

    i kod wgrany ten z początku postu pod ds18b20
    Ale na wyświetlaczy pokazuje się tylko kreska i po wciśnięciu nic się nie dzieje :/ A jak przytrzymam to wyświetla się napis zwarcie.

    Proszę o pomoc

    edit:
    Nie miałem podłączonego rezystory idącego do czujnika ma być 4,7 K ja podłączyłem 5 K. I teraz zamiast napisu zwarcie wyświetla się "nic".

    edit:
    Schemat jest dobry Kod tez. Nie miałem ustawionych fuse bitów. Wszystko już działa..
  • #28 11143289
    electronicsbasecom
    Poziom 2  
  • #29 14530229
    Kubowy
    Poziom 12  
    Program faktycznie działa bez zarzutu
    Mam jednak pytanie, w którym miejscu muszę go przerobić żeby odczyt temp. był ciągły, powiedzmy co 5 s bez użycie przycisku ?
    Czy da się kalibrować wskazania?
REKLAMA