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

DS 18b20, atmega8, c++. Czujnik działa tylko po podłączeniu do 0.

slimak281 26 Lut 2007 10:25 2044 7
REKLAMA
  • #1 3619018
    slimak281
    Poziom 11  
    Posty: 86
    Pomógł: 2
    Ocena: 1
    Witam przeszukiwalem forum dotyczace czujnika, ale z takim problemem jak moim to jeszcze sie nie spotkalem. Czujnik ds18b20 podlaczylem do PB0, dziala elegancko, a jak podlaczylem go do PB7, to juz mi nie dziala, wychodza krzaki, temperatury dziesietne to mam na przemian µ i ε, jednosci to raz 2 a raz 0, a po przecinku nonstop 1. Podlaczalem takze do innych pinow tego samego portu, podobne rzeczy sie dzieja, Dziala tylko w PB0. Patrzylem takze w porcie C i D, to samo, Pin0 tylko mi poprawnie dziala. W programie oczywiscie zmieniam piny. Czy to tak ma by? ze czujnik dziala gdy go sie podlaczy do 0 pinu ? Bardzo prosze o pomoc.
  • REKLAMA
  • #2 3619105
    d.d
    Poziom 20  
    Posty: 386
    Pomógł: 36
    Ocena: 18
    u mnie działa na PC0 PC1 PC2 PC3 bez problemu ale za to n PD0 nie chce działać .
    nie wiem od czego to zależy.
  • REKLAMA
  • #3 3623038
    slimak281
    Poziom 11  
    Posty: 86
    Pomógł: 2
    Ocena: 1
    No wlasnie, czy to jest spowodowane wadliwym czujnikiem, czy kazdy tak ma? dziwne rzeczy sie dzieja
  • #4 3632141
    slimak281
    Poziom 11  
    Posty: 86
    Pomógł: 2
    Ocena: 1
    Czy ktos z was mial kiedys taki problem?, o czego to zalezy, prosze o pomoc
  • REKLAMA
  • #5 3632196
    johny_w
    Poziom 24  
    Posty: 674
    Pomógł: 80
    Ocena: 63
    Być może coś nie tak z programem. czasami tak bywa, że jakaś funkcja mimo iż ma możliwość definiowania pinu - coś tam ustala sobie na sztywno i zmiana pinu nie daje efektu. Wrzuć kod obsługi DS to się zobaczy. uC i czujnik nie powinny mieć nic do tego.
  • #6 3643371
    slimak281
    Poziom 11  
    Posty: 86
    Pomógł: 2
    Ocena: 1
    
    //***************** CZUJNIK TEMPERATURY **********************
    // Definicje dotyczace 1wire
    #define PORT1Wa PORTB             // port z podlaczanym 1Wire
    #define DDR1Wa DDRB              // port z podlaczanym 1Wire
    #define PIN1Wa PINB              // port z podlaczanym 1Wire
    #define ONEWIRE  0              // bit uzytego wejscia
    // 1wire podlaczony jest do PORTB.0
    #define WIRE_0a sbi(DDR1Wa, ONEWIRE)  // ustaw 0 na wyjscie WIRE
    #define WIRE_1a cbi(DDR1Wa, ONEWIRE)  // ustaw 1 na wyjscie WIRE
    
    #define PORT1Wb PORTC             // port z podlaczanym 1Wire
    #define DDR1Wb DDRC              // port z podlaczanym 1Wire
    #define PIN1Wb PINC              // port z podlaczanym 1Wire
    // 1wire podlaczony jest do PORTB.0
    #define WIRE_0b sbi(DDR1Wb, ONEWIRE)  // ustaw 0 na wyjscie WIRE
    #define WIRE_1b cbi(DDR1Wb, ONEWIRE)  // ustaw 1 na wyjscie WIRE
    // WIRE_0  i WIRE_1 polega na przelaczaniu pinu jako wejscie i wyjscie
    // stan 1 uzyskujemy przez rezystor podciagajacy
    // stan zero uzyskujemy przelaczajac pin jako wyjscie
    // zero jest na stałe wpisane
    //  Procedura opóźnienia czasowego
    
    //RESET 1WIRE
    /*unsigned char*/void wire_reset(short int czujnik)
    {
           // unsigned char potwierdzenie;
           
    			if(czujnik==0) WIRE_0a; else WIRE_0b;              				// reset urzadzenia
    			delay(480);								// czekaj okolo 500us
    			if(czujnik==0) WIRE_1a; else WIRE_1b;
    			delay(70);          					// czekaj okolo 75us
    
      //      potwierdzenie = PIN1W & (1<<ONEWIRE); 	// sprawdz bit ONEWIRE
       //     potwierdzenie>>=7;                     // zero oznacza OK
    												// zero wyslane przez urzadzenie
            delay_ms(1);                   		// czekaj okolo 1ms koniec resetu
    												// po tym czasie powinna wrócic jedynka
    	/*	if (potwierdzenie) potwierdzenie=0x00;
            else 
    		{
    			potwierdzenie=0x01;				// zamien zeby 1 znaczylo OK
    		}
         */   										
            //return potwierdzenie;           		// 1 OK; 0 brak urzadzenia
    
    }
    
    // procedura zapisu pojedynczego bitu
    void wire_write_bit(unsigned char bit,short int czujnik)
    {
            if(czujnik==0) WIRE_0a; else WIRE_0b;
    			asm("nop");
    			asm("nop");	
    			if (!bit)
    			{
    			delay(60);
    			if(czujnik==0) WIRE_1a; else WIRE_1b;
    			asm("nop");
    			asm("nop");
    			}
                                            // przedluzenie dla zera
                    else
    				{
    				if(czujnik==0) WIRE_1a; else WIRE_1b;
    				delay(60);
    				}
                                            // jesli 1 koncz i czekaj
    }
    // procedura zapisu bajtu do urzadzenia
    void wire_write_byte(unsigned char bajt,short int czujnik)
    {
    unsigned char i;
            for(i = 0; i<8; i++)
                    {
                    wire_write_bit(bajt & 0x01,czujnik);    // wyslij bit zerowy bajtu
                    bajt>>=1;                       // przesun w prawo i tak osiem bitow
                    }
    }
    
    // procedura odczytu bitu od urzadzenie 1wire
    unsigned char wire_read_bit(short int czujnik)
    {
        unsigned char bit;
        if(czujnik==0) WIRE_0a; else WIRE_0b;
        asm("nop");
    	asm("nop");
        if(czujnik==0) WIRE_1a; else WIRE_1b;
        asm("nop");asm("nop");asm("nop");		// 13us
    	asm("nop");asm("nop");asm("nop");
    	asm("nop");asm("nop");asm("nop");
    	asm("nop");asm("nop");asm("nop");
    	asm("nop");
        if(czujnik==0) bit=PIN1Wa&(1<<ONEWIRE); else bit=PIN1Wb&(1<<ONEWIRE);
    	
    	
        delay(80);
        return bit;
    }
    
    //procedura odczytu bajtu z urzadzenia
    unsigned char wire_read_byte(short int czujnik)
    {
    	unsigned char bajt, tmp, i;
    	bajt = 0;
    	for(i = 0;i<8; i++)
        {
            tmp = wire_read_bit(czujnik);
            tmp = tmp << i;
            bajt = bajt | tmp;
        }
    return bajt;
    }
    

    Chciałem zrobic na 2 innych pinach czytanie temperatury, mozliwe ze cos jest z programem. Na zerowych pinach działa, a mnie ciekawi dlaczego tak sie dzieje ze na innych pinach nie dziala
  • REKLAMA
  • Pomocny post
    #7 3643692
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    slimak281 napisał:

    
    //procedura odczytu bajtu z urzadzenia
    unsigned char wire_read_byte(short int czujnik)
    {
    	unsigned char bajt, tmp, i;
    	bajt = 0;
    	for(i = 0;i<8; i++)
        {
            tmp = wire_read_bit(czujnik);
            tmp = tmp << i;
            bajt = bajt | tmp;
        }
    return bajt;
    }
    

    Chciałem zrobic na 2 innych pinach czytanie temperatury, mozliwe ze cos jest z programem. Na zerowych pinach działa, a mnie ciekawi dlaczego tak sie dzieje ze na innych pinach nie dziala


    Pomyśl i popraw , a będzie dziać na dowolnym bicie portu.


    Piotrek

    PS
    Podpowiedź:
    Jeśli odczytasz na magistrali 1wire bit o wartości 1 , to dla 1wire na PINx.0 , tmp = 0x01 , jeśli 1wire masz np. na PINx.7 , to tmp=0x80.
  • #8 3647714
    slimak281
    Poziom 11  
    Posty: 86
    Pomógł: 2
    Ocena: 1
    Dzieki Zumek, poprawilem w funkcji
    // procedura odczytu bitu od urzadzenie 1wire 
    unsigned char wire_read_bit(short int czujnik) 
    { 
        unsigned char bit; 
        if(czujnik==0) WIRE_0a; else WIRE_0b; 
        asm("nop"); 
       asm("nop"); 
        if(czujnik==0) WIRE_1a; else WIRE_1b; 
        asm("nop");asm("nop");asm("nop");      // 13us 
       asm("nop");asm("nop");asm("nop"); 
       asm("nop");asm("nop");asm("nop"); 
       asm("nop");asm("nop");asm("nop"); 
       asm("nop"); 
        if(czujnik==0) bit=PIN1Wa&(1<<ONEWIRE); else bit=PIN1Wb&(1<<ONEWIRE); 
        
        
        delay(80); 
        return bit; 
    }


    3 wiersz od konca na:
      if(czujnik==0) bit=(PIN1Wa&(1<<ONEWIRE))>>ONEWIRE; else bit=(PIN1Wb&(1<<ONEWIRE))>>ONEWIRE;

    i dziala ;).
    Dzieki WIELKIE :D

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy działania czujnika temperatury DS18B20 podłączonego do mikrokontrolera Atmega8 w języku C++. Czujnik działa poprawnie tylko po podłączeniu do pinu PB0, natomiast przy podłączeniu do innych pinów portu B (np. PB7) lub portów C i D występują błędne odczyty temperatury, pojawiają się nieprawidłowe znaki i wartości. W dyskusji zasugerowano, że problem może wynikać z błędów w oprogramowaniu, gdzie funkcje obsługujące magistralę 1-Wire mogą mieć na stałe przypisany pin, co uniemożliwia poprawną zmianę pinu. Przykładowy fragment kodu pokazuje definicje portów i bitów, jednak wymaga poprawy w obsłudze odczytu bitu, aby uwzględnić różne pozycje bitów na porcie. Wskazano, że odczyt bitu z magistrali 1-Wire musi uwzględniać przesunięcie bitowe odpowiadające numerowi pinu (np. dla PINx.0 wartość 0x01, dla PINx.7 wartość 0x80). Po poprawieniu funkcji odczytu bitu, czujnik powinien działać na dowolnym pinie portu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA