folder Tahribat.com Forumları
linefolder Elektronik / Embedded / Mobil Cihazlar
linefolder PIC16F628A Ve DS18B20 Sıcaklık Sensörü



PIC16F628A Ve DS18B20 Sıcaklık Sensörü

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    overbite
    overbite's avatar
    Kayıt Tarihi: 13/Ağustos/2011
    Erkek

    Merhaba arkaşalar, daha önce bahsettiğim ayfonda bile olmayan muhteşem özellik (:D) sıcaklık ölçme devresini tamamladım.

    Video:

    http://www.youtube.com/watch?v=tOtGNDLUCb8

    Şimdiki hedefim iki pic arasında veri alışverişi. Bu yapmak istememin sebebi kullandığım pic'de 16 giriş çıkış pini var ve LCD 7 tanesini kullanıyor. pic'lerden birini sadece LCD'yi çalıştıracak şekilde programlamak istiyorum. Böylelikle eğer mümkünse diğer pic'de istediğim işlemleri yapıp ekrana yazmak istediklerimi tek pinden LCD'yi çalıştıran pic'e göndermek ve onun ekrana yazmasını sağlamış olacağım.


    Bundan sonra da önce 2 sıcaklık sensörü bağlayacağım sonra daha fazlası için programı geliştireceğim. Şu an tek sensör var, fakat birden fazla bağlayınca hepsinden aynı anda veri alabilmek için önce device id'lerini okumak falan gerekiyormuş.

    2'den fazla sensörden okuma yaptıktan sonra da öğrenmek istediğim konu RTOS ama sanırım bu askerlikten sonraya kalacak.

     

     

    Kodlar:

    main.c

    #include <16F628A.h>
    #FUSES NOWDT, INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
    #use delay(clock=4000000)
    #include "C:\Users\Emre\Desktop\pic proje\ccs temp\flex_lcd.c"
    #include "C:\Users\Emre\Desktop\pic proje\ccs temp\ds18b20.c"
    
    void main()
    {
    float temperature;
    
    lcd_init();
    delay_ms(10);
    lcd_putc("\fDS18B20\noverbite");
    delay_ms(1000);
    
    while (TRUE) {
    output_high(PIN_A0);
    temperature = ds1820_read();
    delay_ms(250);
    printf(lcd_putc,"\fS: %3.1f C\n-emre-", temperature);
    output_low(PIN_A0);
    delay_ms(450);
    }
    }

    ds18b20.c:

    #define ONE_WIRE_PIN PIN_A1
    
    void onewire_reset()
    {
    output_low(ONE_WIRE_PIN);
    delay_us(500);
    output_float(ONE_WIRE_PIN);
    delay_us(500);
    output_float(ONE_WIRE_PIN);
    } 
    
    void onewire_write(int data)
    {
    int count;
    for (count=0; count<8; ++count)
    {
    output_low(ONE_WIRE_PIN);
    delay_us(2);
    output_bit(ONE_WIRE_PIN, shift_right(&data,1,0));
    delay_us(60);
    output_float(ONE_WIRE_PIN);
    delay_us(2);
    }
    } 
    
    int onewire_read()
    {
    int count, data;
    for (count=0; count<8; ++count)
    {
    output_low(ONE_WIRE_PIN);
    delay_us(2);
    output_float(ONE_WIRE_PIN);
    delay_us(8);
    shift_right(&data,1,input(ONE_WIRE_PIN));
    delay_us(120);
    }
    return(data);
    } 
    
    float ds1820_read()
    {
    int8 busy=0, temp1, temp2;
    signed int16 temp3;
    float result;
    onewire_reset();
    onewire_write(0xCC);
    onewire_write(0x44);
    while (busy == 0) { busy = onewire_read(); }
    onewire_reset();
    onewire_write(0xCC);
    onewire_write(0xBE);
    temp1 = onewire_read();
    temp2 = onewire_read();
    temp3 = make16(temp2, temp1);
    result = (float) temp3 / 16.0;
    delay_ms(200);
    return(result);
    }
    

    flex_lcd.c:

    #define LCD_DB4   PIN_b4  
    #define LCD_DB5   PIN_b5  
    #define LCD_DB6   PIN_b6  
    #define LCD_DB7   PIN_b7  
    
    #define LCD_E     PIN_b0  
    #define LCD_RS    PIN_b2  
    #define LCD_RW    PIN_b1  
    
    
    
    #define LCD_CGRAM_ADDR 0x40           // Set the CGRAM address 
    #define LCD_DDRAM_ADDR 0x80           
    #define USE_LCD_RW   1
    
    //========================================
    
    #define lcd_type 2        
    #define lcd_line_two 0x40 
    
    #define LCD_CHAR_1 0x01 
    #define LCD_CHAR_2 0x02 
    #define LCD_CHAR_3 0x03 
    #define LCD_CHAR_4 0x04 
    #define LCD_CHAR_5 0x05 
    #define LCD_CHAR_6 0x06 
    #define LCD_CHAR_7 0x07 
    #define LCD_CHAR_8 0x08 
    
    int8 const LCD_INIT_STRING[4] =
    {
     0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
     0xc,                    // Display on
     1,                      // Clear display
     6                       // Increment cursor
     };
    
    
    //-------------------------------------
    void lcd_send_nibble(int8 nibble)
    {
     output_bit(LCD_DB4, !!(nibble & 1));
     output_bit(LCD_DB5, !!(nibble & 2));
     output_bit(LCD_DB6, !!(nibble & 4));
     output_bit(LCD_DB7, !!(nibble & 8));
    
     delay_cycles(1);
     output_high(LCD_E);
     delay_us(2);
     output_low(LCD_E);
    }
    
    
    #ifdef USE_LCD_RW
    int8 lcd_read_nibble(void)
    {
    int8 retval;
    #bit retval_0 = retval.0
    #bit retval_1 = retval.1
    #bit retval_2 = retval.2
    #bit retval_3 = retval.3
    
    retval = 0;
    
    output_high(LCD_E);
    delay_cycles(1);
    
    retval_0 = input(LCD_DB4);
    retval_1 = input(LCD_DB5);
    retval_2 = input(LCD_DB6);
    retval_3 = input(LCD_DB7);
    
    output_low(LCD_E);
    
    return(retval);
    }
    #endif
    
    //---------------------------------------
    
    #ifdef USE_LCD_RW
    int8 lcd_read_byte(void)
    {
    int8 low;
    int8 high;
    
    output_high(LCD_RW);
    delay_cycles(1);
    
    high = lcd_read_nibble();
    
    low = lcd_read_nibble();
    
    return( (high<<4) | low);
    }
    #endif
    
    //----------------------------------------
    void lcd_send_byte(int8 address, int8 n)
    {
    output_low(LCD_RS);
    
    #ifdef USE_LCD_RW
    while(bit_test(lcd_read_byte(),7)) ;
    #else
    delay_us(60);
    #endif
    
    if(address)
       output_high(LCD_RS);
    else
       output_low(LCD_RS);
    
     delay_cycles(1);
    
    #ifdef USE_LCD_RW
    output_low(LCD_RW);
    delay_cycles(1);
    #endif
    
    output_low(LCD_E);
    
    lcd_send_nibble(n >> 4);
    lcd_send_nibble(n & 0xf);
    }
    
    void lcd_setcursor_vb(short visible, short blink) {
      lcd_send_byte(0, 0xC|(visible<<1)|blink);
    }
    
    //----------------------------
    void lcd_init(void)
    {
    int8 i;
    
    output_low(LCD_RS);
    
    #ifdef USE_LCD_RW
    output_low(LCD_RW);
    #endif
    
    output_low(LCD_E);
    
    delay_ms(15);
    
    for(i=0 ;i < 3; i++)
       {
        lcd_send_nibble(0x03);
        delay_ms(5);
       }
    
    lcd_send_nibble(0x02);
    
    for(i=0; i < sizeof(LCD_INIT_STRING); i++)
       {
        lcd_send_byte(0, LCD_INIT_STRING[i]);
    
        #ifndef USE_LCD_RW
        delay_ms(5);
        #endif
       }
    
    }
    
    //----------------------------
    
    void lcd_gotoxy(int8 x, int8 y)
    {
    int8 address;
    
    if(y != 1)
       address = lcd_line_two;
    else
       address=0;
    
    address += x-1;
    lcd_send_byte(0, 0x80 | address);
    }
    
    //-----------------------------
    void lcd_putc(char c)
    {
     switch(c)
       {
        case '\f':
          lcd_send_byte(0,1);
          delay_ms(2);
          break;
    
        case '\n':
           lcd_gotoxy(1,2);
           break;
    
        case '\b':
           lcd_send_byte(0,0x10);
           break;
        default:
           lcd_send_byte(1,c);
           break;
       }
    }
    
    //------------------------------
    #ifdef USE_LCD_RW
    char lcd_getc(int8 x, int8 y)
    {
    char value;
    
    lcd_gotoxy(x,y);
    
    while(bit_test(lcd_read_byte(),7));
    
    output_high(LCD_RS);
    value = lcd_read_byte();
    output_low(lcd_RS);
    
    return(value);
    }
    #endif
    

     


    ulan bir susar mısın?
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    kesmeleri (interrupt) arşatır hocam.

    sensör olarak daha kaliteli bir şey kullanabilirsin. bunların fiyatı nedir bilmiyorum, arkadaşa bi sensör aldık 35 liraydı ama çok daha stabil. istersen resimleri falan vardı ekleybilirm buraya..

    sadece sıcaklık ölçümü değil de, mesela sıcaklık şu seviyeye geldiğinde alarm çalsın v.s. gibi bi şey yapabilirsin. bahsettiğim sensör sht11, nem,sıcaklık ve bi şeyi daha ölçüyordu djital olarak çalışıyor hatırladığım kadarıyla..

    https://www.google.com.tr/search?q=lm35&aq=f&um=1&ie=UTF-8&hl=tr&tbm=isch&source=og&sa=N&tab=wi&authuser=0&ei=rXwnUeumA-mj0QXw_IAQ&biw=1280&bih=673&sei=sXwnUf3uD-3M0AWA1oD4CA#um=1&hl=tr&safe=off&authuser=0&tbm=isch&sa=1&q=sht11&oq=sht11&gs_l=img.3..0l2j0i24l8.1566.2472.0.2820.5.5.0.0.0.0.218.883.0j4j1.5.0...0.0...1c.1.4.img.mXsHoL6CnZc&bav=on.2,or.r_gc.r_pw.r_qf.&fp=93fe5369d9d06547&biw=1280&bih=709

     

    burda örneklerlerine bi bak ..eğer profesyonel bir şey yapacağım diye bu sensörü alırsan pinlisini almaya çalış. pinsiz olana lehim yapamazsın normal havya ile, havalı havya gerekli :) arkadaştaki pinsizdi yapamadık bi türlü.en son bi elektronikçide vardı o şekilde halloldu. bu şekil uğraşma yani küçük bi şey zaten

     

    kolay gelsin


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    overbite
    overbite's avatar
    Kayıt Tarihi: 13/Ağustos/2011
    Erkek

    Sağolasın hocam, sıcaklığa göre alarm işi artık veriyi alabildikten sonra programa bakıyor o yüzden fazla zaman kaybetmeden diğer temel işlemleri öğrenmeyi istiyorum. Dediğiniz gibi kesmeleri öğrenmem lazım. Bir de elimde max232 entegresi var onu kullanarak pc ile iletişimi de halledersem gerisi kolay gibi (bana göre:). Verdiğiniz linkteki sensör de güzelmiş nem değerini de veriyor. Aslında benim için daha öğrenecek çok şey var. devreye sd kart bağlayabilmek istiyorum log tutabilmek için, onun için fat32 dosya sistemini iyi bilmek gerekir diye okumuştum ama o kadar ileri gidecek zamanım yok.


    ulan bir susar mısın?
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    sd kart okuma işi biraz zor hocam ama yapılır

    http://mega-mp3.googlecode.com/files/mmc_sd_memory_card_driver_technical_manual.pdf

    bu konuda türkçe kaynak bulmak zor, ben de daha önce araştırmıştım bi proje için. bir tane türk kitap yazmış ama o da ingilizce :)

    1566445

    http://tr.scribd.com/doc/50925747/SD-Card-Projects-Using-the-PIC-Microcontroller 

    unbalanced tarafından 22/Şub/13 16:48 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
Toplam Hit: 2643 Toplam Mesaj: 4