آی پی امداد
آی پی امداد
آریا الکترونیک parcham تکشو

مشکل در پروژه سنجش دما با DS18B20 و اندازه گیری زمان

MECO

کاربر
2011-02-15
62
126
سلام

این برنامه که پیوست کردم ( با کدویژن هستش ) قراره که دمای دریافت شده از سنسور DS18B20 رو نمایش بده و سه تا متغییر ساعت دقیقه و ثانیه رو بهش میدیم و اونارو کم میکنه تا صفر بشه و بعد ار اتمام زمان بوق بزنه اما وقتی جای دستور نمایش روی ال سی دی رو جابجا میکنم دیگه نمایش نمیده و مجبورم دمارو همراه با سنجش زمانم نمایش بدم که این باعث میشه دما رو هر یه ثانیه نمایش بده تغییرشو . !!!!!

از طرف دیگه امتحان کردم وقتی توی این حلقه یه تابع رو فراخوانی میکنم کلا میکرو هنگ میکنه و نه دیگه چیزی نمایش میده و نه کاری میکنه . !!!!!!

حدسم اینه که بخاطر پرش به وقفه تایمر صفر باشه ولی نمیدونم دیگه چطور میشه پیاده سازی کردش ؟ یعنی حسابی گیج شدم ، اینو ساده نوشتم اینقده بازی درآورده دیگه اگه بخوام یه تابع برای شستی های ورودی توش فراخوانی کنمو یه تابع برای تنظیماتو یه تابع برای بررسی وجود سنسور و ... اونوقت دیگه معلوم نیست چی بشه .

اگه ممکنه یکی یه مثال کاربردی برام پیوست کنه واقعا که سی خیلی دنگ و فنگ داره کلافه شدم . اکثر مثال هایی هم که پیدا میشه خیلی ساده و گاها ناقص هستن
6.gif


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


#include <mega8.h>
#include <delay.h> // 1 Wire Bus interface functions
#include <math.h>
#include <alcd.h> // Alphanumeric LCD functions
#include <stdio.h> /* include the printf function prototype */
#include <stdlib.h> /* include the abs function prototype */


/* --------------------------------------------------------------------------------------------- */


#define UP PINC.2 /* S4 */
#define SAVE PINC.3 /* S3 */
#define DOWN PINC.4 /* S2 */
#define SET PINC.5 /* S1 */
#define L1 PORTD.0 /* L1 MOTOR */
#define L2 PORTD.1 /* L2 HEATER*/
#define HEATER PORTD.5 /* Heater */
#define TIMER PORTD.6 /* Timer */
#define BUZZER PORTB.7 /* Buzzer */


/* --------------------------------------------------------------------------------------------- */


#include <1wire.h> // DS1820 Temperature Sensor functions
#include <ds18b20.h>
#define MAX_DEVICES 8 /* maximum number of DS1820/DS18S20 connected to the bus */
unsigned char rom_codes[MAX_DEVICES][9]; /* DS1820/DS18S20 devices ROM code storage area,
9 bytes are used for each device
(see the w1_search function description),
but only the first 8 bytes contain the ROM code and CRC */
unsigned char ds1820_devices;
unsigned char i;
char lcd_buffer[32];
float set_temp=35.1;


/* --------------------------------------------------------------------------------------------- */
unsigned int c;
unsigned char second=20,minute=0,hour=0;
/* --------------------------------------------------------------------------------------------- */

interrupt [TIM0_OVF] void timer0_ovf_isr(void){
c++;
}


void main(void){
DDRD=0x01;
PORTD=0x00;
DDRC = 0b00000000;
PORTC = 0b11111110;

#asm("sei") // Global enable interrupts


lcd_init(16);
lcd_clear();


/* --------------------------------------------------------------------------------------------- */


BUZZER=1;
delay_ms(200);
BUZZER=0;
ds1820_devices=w1_search(0xf0,rom_codes);

if(ds1820_devices>0){
lcd_gotoxy(0,0); lcd_putsf(" SENSOR FOUND "); delay_ms(1000); lcd_clear();

if (ds18b20_init(&rom_codes[0],0,120,DS18B20_12BIT_RES)){
BUZZER=1; delay_ms(200); BUZZER=0;delay_ms(200);

} else{
lcd_gotoxy(0,0);
lcd_putsf(" SENSOR ERROR CODE : E 102 ");
delay_ms(1000);
lcd_clear();
}

}

/* --------------------------------------------------------------------------------------------- */

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
//------------------------------------------------------------------------------------------------------------------
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
//------------------------------------------------------------------------------------------------------------------


TCCR0=0x03; /* TCCR0=(0<<CS02) | (1<<CS01) | (1<<CS00); -> Xtal/64 */
TCNT0=0x06;
TIMSK=0x01; // Timer(s)/Counter(s) Interrupt(s) initialization


lcd_init(16);
lcd_clear();
//second=30 ; minute=1 ; hour=0 ;


while (1){

if((c==500)&(second>0)) {
second--;
c=0;
if((second==0)&(minute>0)){
minute--;
second=59;
if((minute==0)& (hour>0)){
hour--;
minute=59;
}

}
lcd_gotoxy(0,0) ;
sprintf(lcd_buffer,"T:%02.1f\xdf""C " "S:%02.1f" " %02d:%02d:%02d",ds18b20_temperature(&rom_codes[0][0]),set_temp,hour,minute,second);
lcd_puts(lcd_buffer);
}

if((hour==0)&(minute==0)&(second==0)){
BUZZER=1;
}

}


}





احتمالا من توی استفاده از تایمرم مشکل دارم و همین باعث میشه که توی زمان فراخوانی تابع وقفه اتفاق میافته و از رفتن به تابع خودداری میکنه ، ولی واقعا هرکاری کردن نفهمیدم چیکار میشه کرد
لطفا یکی بدادم برسه
5.gif
5.gif

با تشکر
 

Shayan371

کاربر vip
کاربر
2017-02-13
9
3
با سلام
در مدارساخته شده که نقشه شماتیک آن پیوست شده است دمای نمایش داده شده بر روی سون سگمنت در ابتدای اتصال به تغذیه ۵ ولت صحیح است ولی بعد از چند دقیقه , سون سگمنت , دما را صفر نشان می دهد . سنسور دمای بکار رفته DS18B20 است که حتی با تعویض آن ایراد نمایش درست دما برطرف نشده است به لحاظ سخت افزاری. قطعات چک شده اند تنها شک من خود میکروی AT89C52است که آن هم در نمایش ساعت و تقویم مشکلی ندارد ممنون میشوم نظرتان را در مورد رفع عیب دمای نمایش داده شده بدانم.مشاهده فایل‌پیوست EC1204B_Schematics (1).pdf
 
آخرین ویرایش:

jfrras

مدير انجمن تخصصی الکترونیک
مدیر تالار
2007-04-13
3,095
74,081
48
ایران
با سلام
در مدارساخته شده که نقشه شماتیک آن پیوست شده است دمای نمایش داده شده بر روی سون سگمنت در ابتدای اتصال به تغذیه ۵ ولت صحیح است ولی بعد از چند دقیقه , سون سگمنت , دما را صفر نشان می دهد . سنسور دمای بکار رفته DS18B20 است که حتی با تعویض آن ایراد نمایش درست دما برطرف نشده است به لحاظ سخت افزاری. قطعات چک شده اند تنها شک من خود میکروی AT89C52است که آن هم در نمایش ساعت و تقویم مشکلی ندارد ممنون میشوم نظرتان را در مورد رفع عیب دمای نمایش داده شده بدانم.مشاهده فایل‌پیوست 171452

سلام
اگر نو خریده اید ممکنه های کپی باشه . اورجینال بودن DS18B20 مطمئن بشید .
 
  • Like
واکنش‌ها[ی پسندها]: Shayan371
بالا