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

من میخوام بصورت مداوم دما روی ال سی دی نشون داده بشه و در این حین قراره زمانگیری هم انجام بشه و در یه زمان تعیین شده یکاری انجام بشه یعنی در بین نمایش دما و سنجش زمان یسری زیر بنامه ( تابع فراخوانی میشن ولی هرکاری کردم نشد !
#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;
}
}
}
#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;
}
}
}
احتمالا من توی استفاده از تایمرم مشکل دارم و همین باعث میشه که توی زمان فراخوانی تابع وقفه اتفاق میافته و از رفتن به تابع خودداری میکنه ، ولی واقعا هرکاری کردن نفهمیدم چیکار میشه کرد
لطفا یکی بدادم برسه


با تشکر