اطلاعیه

Collapse
No announcement yet.

ds18b20

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ds18b20

    سلام
    یه مشکل در راه اندازی سنسور دما ds18b20 بروی 7seg دارم
    البته روی ال سی دی کاراکتری به نمایش در آوردم
    ولی هرکاری می کنم روی نمایشگر 7 segment نمی تونم اجرا کنم ( مشکلش اینه که عدد دما رو نشون می ده ولی این سنسور اینقدر سرعت میکرو رو پایین میاره که باعت چشمک زدن نمایشگر 7segment میشه

    از دوستان ..... کسی راه حل داره واسه این مشکل

    برنامه به زبان c نوشتم

    ....


    کد:
    /*****************************************************
    Chip type        : ATmega32
    Program type      : Application
    AVR Core Clock frequency: 16.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega32.h>
    
    // 1 Wire Bus interface functions
    #include <1wire.h>
    #include <ds18b20.h>
    #include <delay.h>
    
    long int part1=0,part2=0,part3=0;
    flash long int c7seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    
    float temp;
    
    
    // Declare your global variables here
    
    void HEX_to_seg(long int k){                      
    part3 = c7seg [k%10];
    part2 = c7seg [k/10%10]; 
    part1 = c7seg [k/10/10%10];                     
     } 
     
    void main(void)
    {
    // Declare your local variables here
    
    PORTB=0x8E;
    DDRB=0xF0;
    
    PORTC=0x00;
    DDRC=0xff;
    
    PORTD=0x00;
    DDRD=0xff;
    
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // 1 Wire Bus initialization
    // 1 Wire Data port: PORTB
    // 1 Wire Data bit: 0
    // Note: 1 Wire port settings must be specified in the
    // Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
    w1_init();
    
    while (1)
       {
    
        
       temp=ds18b20_temperature(0);
    
       HEX_to_seg(temp);
        
       PORTC=0b001;
       PORTD=part1;
       delay_ms(10);
    
       PORTC=0b010;
       PORTD=part2;
       delay_ms(10); 
       
       PORTC=0b100;
       PORTD=part3;
       delay_ms(10);      
         
    
       }
    }







    #2
    پاسخ : ds18b20

    تاخیرهات رو کمتر کن
    ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

    امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

    دیدگاه


      #3
      پاسخ : ds18b20

      سلام. کلا سرعت این سنسور خیلی پایینه. برای خواندن دما میکرو باید روی یک خط 700 میلی ثانیه متوقف شود و اگر در این زمان یکی از وقفه هات سرریز کند، دمای دریافتی اشتباه خوانده میشود. میتونی با یه آی سی دیگه مثل ATTINY2313 دما رو بخونی و بعد با پورت سریال برا میکروی اصلی بفرستی. دلیل اینکه میتونی رو ال سی دی نمایش بدی هم اینه که شما فقط یه بار به ال سی دی کد میفرستی ولی برای سون سگمنت باید مرتبا انرا رفرش کنی تا تمام سگمنت ها روشن به نظر بیایند که این 700 میلی ثانیه اجازه این کار را نمیدهد.
      سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَةِ وَ الرُّوحِ

      (SMART DESIGN....(POWERFUL & QUICK

      موفقیت اتفاقی نیست......بابای پولدار میخواد

      دیدگاه


        #4
        پاسخ : ds18b20

        سلام
        دوستان ممنون از پاسختون

        ... ولی راه بهتری برای کاهش هزینه وجود نداره........؟؟؟؟
        اینطوری که هزینه بالا میره با attiny 2313

        دیدگاه


          #5
          پاسخ : ds18b20

          من اینو با بسکام راه انداختم تا دو رقم بعد اعشار روی سون سگمنت نشون میدادم براش مدار هم چاپ زدم خیلی عالیه کافیه یا تایمر بزاری و سنسور رو زیر اون تایمر توی وقفه سرریزی بخونی تا چشمک زدن تا حدودی حل بشه
          http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

          دیدگاه


            #6
            پاسخ : ds18b20

            خیر جناب زمانی باید برعکس عمل کنه!
            رفرش سون سگمنت رو با تایمر انجام بده و توی برنامه اصلی دما رو بخونه
            در ضمن این سنسور تو رده قیمت خودش بهترینه!

            دیدگاه


              #7
              پاسخ : ds18b20

              سلام
              این کارو با تایمر صفر انجام دادم ولی بازم افاقه نکرد
              اینطوری بود که هر یک ثانیه سر ریز میشد بعد سنسور رو می خوندم
              ولی خوب جواب نداد بازم

              دیدگاه


                #8
                پاسخ : ds18b20

                من با بیسیک این کار کردم خوب جواب میداد
                http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                دیدگاه


                  #9
                  پاسخ : ds18b20

                  اینو با تایمر انجام دادم در رفرش صفحه مشکلی ندارم ولی حالا دما رو نشون نمیده بجاش عدد p نشون میده

                  اینم کد برنامه
                  کسی میتونه ایرادشو بگیره .... لطفا کمک کنید.

                  کد:
                  #include <mega16.h>
                  
                  // 1 Wire Bus interface functions
                  #include <1wire.h>
                  
                  // DS1820 Temperature Sensor functions
                  #include <ds18b20.h>
                  #include <delay.h>
                  
                  long int part1=0,part2=0,part3=0;
                  flash long int c7seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                  
                  float temp;
                  
                  
                   
                  long int b , i;
                  // Timer 0 overflow interrupt service routine
                  interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                  {
                   TCNT0=0x37;
                   b++;
                   if(b==800){b=0;i++;}
                   if(i==2){i=0;}
                  
                  
                  
                      
                     PORTC=0b01;
                     PORTD=part1;
                     delay_ms(i);
                  
                     PORTC=0b10;
                     PORTD=part2;
                     delay_ms(i); 
                     
                     
                  
                  
                  }
                  
                  void HEX_to_seg(long int k){                      
                  part2 = c7seg [k%10];
                  part1 = c7seg [k/10%10]; 
                                      
                   } 
                  
                  // Declare your global variables here
                  
                  void main(void)
                  {
                  PORTA=0x00;
                  DDRA=0x00;
                  
                  PORTB=0x00;
                  DDRB=0xFF;
                  
                  PORTC=0x00;
                  DDRC=0xFF;
                  
                  PORTD=0x00;
                  DDRD=0xFF;
                  
                  // Timer/Counter 0 initialization
                  // Clock source: System Clock
                  // Clock value: 16000.000 kHz
                  // Mode: Normal top=0xFF
                  // OC0 output: Disconnected
                  TCCR0=0x01;
                  TCNT0=0x37;
                  OCR0=0x00;
                  
                  
                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=0x01;
                  
                  
                  // TWI initialization
                  // TWI disabled
                  TWCR=0x00;
                  
                  w1_init();
                  
                  // Global enable interrupts
                  #asm("sei")
                  
                  while (1)
                     {     
                       temp=ds18b20_temperature(0);
                       HEX_to_seg(temp);
                  
                     }
                  }

                  دیدگاه


                    #10
                    پاسخ : ds18b20

                    برنامه مربوط به نمایش دادن عدد بر روی سون سگمنت رو توی حلقه whileبزار و اونی که سنسور رو میخونه توی سر ریز تایمر
                    http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                    دیدگاه


                      #11
                      پاسخ : ds18b20

                      آقا من دیوانه شدم نمیشه هر کاری می کنم
                      می تونی برنامه ای که نوشتید بزارید

                      دیدگاه


                        #12
                        پاسخ : ds18b20

                        نوشته اصلی توسط yoshig2
                        آقا من دیوانه شدم نمیشه هر کاری می کنم
                        می تونی برنامه ای که نوشتید بزارید
                        کد:
                        $regfile = "m8def.dat"
                        $crystal = 8000000
                        
                        Config Portd = Output
                        Config Portb.4 = Output
                        Config Portb.5 = Output
                        Config Portb.6 = Output
                        Config Portb.7 = Output
                        Config Portc.5 = Output
                        Config Portc.4 = Input
                        Config 1wire = Portc.1
                        
                        Red_led Alias Portc.0
                        Dot Alias 128
                        Yekan Alias Digit(1)
                        Dahgan Alias Digit(2)
                        Sadgan Alias Digit(3)
                        Hezargan Alias Digit(4)
                        
                        Aa Alias &B01111111
                        Bb Alias &B10111111
                        Cc Alias &B11011111
                        Dd Alias &B11101111
                        Res Alias &B00000000
                        
                        Config Timer1 = Timer , Prescale = 256           '256
                        Enable Ovf1
                        On Ovf1 Time_1s
                        Stop Timer1
                        
                        
                        Dim A As Single , B As Single , C As Byte , X As Byte , Y As Byte , Y2 As Byte
                        Dim _dot As Byte
                        Dim Digit(4) As Byte
                        
                        Dim Tim As Byte
                        Dim Byte0 As Byte
                        Dim Byte1 As Byte
                        Dim Z As Integer
                        Dim Temp As Single
                        Dim Rep As Byte
                        Config Single = Scientific , Digits = 1
                        
                        
                        X = 1
                        Y = 16
                        Enable Interrupts
                        Start Timer1
                        
                        Tim = 50
                        
                        Do
                        
                        '1
                        Portb = Aa
                        Portd = &B00000001
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '2
                        Portb = Bb
                        Portd = &B00000001
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '3
                        Portb = Cc
                        Portd = &B00000001
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '4
                        Portb = Dd
                        Portd = &B00000001
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '5
                        Portb = Dd
                        Portd = &B00000010
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '6
                        Portb = Dd
                        Portd = &B00000100
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '7
                        Portb = Dd
                        Portd = &B00001000
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '8
                        Portb = Cc
                        Portd = &B00001000
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '9
                        Portb = Bb
                        Portd = &B00001000
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '10
                        Portb = Aa
                        Portd = &B00001000
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '11
                        Portb = Aa
                        Portd = &B00010000
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        '12
                        Portb = Aa
                        Portd = &B00100000
                        Waitms Tim
                        Portb = Res
                        Portd = Res
                        
                        If Rep > 5 Then Exit Do
                        
                        
                        Loop
                        
                        Do
                        
                        
                        
                          If Temp <> A Then
                           A = Temp
                           If A < 1 And A >= 0 Then
                             Hezargan = 0
                             _dot = 4
                             A = A * 10
                             Sadgan = A
                             A = A - Sadgan
                             A = A * 10
                             Dahgan = A
                             A = A - Dahgan
                             A = A * 10
                             Yekan = A
                           Elseif A >= 1 Then
                             C = 0
                             Do
                              A = A / 10
                              Incr C
                              If A < 1 Then Exit Do
                             Loop
                             A = A * 10
                             Hezargan = A
                             A = A - Hezargan
                             A = A * 10
                             Decr C
                             If C = 0 Then _dot = 4
                             Sadgan = A
                             A = A - Sadgan
                             A = A * 10
                             Decr C
                             If C = 0 Then _dot = 3
                             Dahgan = A
                             A = A - Dahgan
                             A = A * 10
                             Decr C
                             If C = 0 Then _dot = 2
                             Yekan = A
                           End If
                           Temp = A
                          End If
                        
                        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                          Portd = Lookup(digit(x) , Common_cathode)
                          If X = _dot Then Portd = Portd Or Dot
                          Y2 = Not Y
                          Portb = Y2
                          Waitms 5
                          Portd = 0
                          Incr X
                          Shift Y , Left , 1
                          If X = 5 Then
                           X = 1
                           Y = 16
                          End If
                        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                        Loop
                        End
                        
                        Common_cathode:
                        Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 127 , 111 , 95 , 124 , 57 , 94 , 121 , 113
                        
                        
                        Time_1s:
                        
                        1wreset
                        
                         If Err = 1 Then
                           Portd = 00000000
                           Set Red_led
                          Else
                           Reset Red_led
                           1wwrite &HCC
                           1wwrite &H44
                           'Waitms 2
                           1wreset
                           1wwrite &HCC
                           1wwrite &HBE
                           Byte0 = 1wread()
                           Byte1 = 1wread()
                           Z = Makeint(byte0 , Byte1)
                           Temp = Z / 16
                           Temp = Temp + 0.0005
                          End If
                        
                        If Rep =< 5 Then Incr Rep
                        
                        Return
                        http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                        دیدگاه


                          #13
                          پاسخ : ds18b20

                          بعضی وقت ها به خاطر کمبود جریان، دستگاهمون قاطی میکنه!

                          دیدگاه


                            #14
                            پاسخ : ds18b20

                            نوشته اصلی توسط roboeli
                            بعضی وقت ها به خاطر کمبود جریان، دستگاهمون قاطی میکنه!
                            افزایش منبع جریان
                            http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                            دیدگاه

                            لطفا صبر کنید...
                            X