با سلام،یه دستگاه جوجه کشی دارم درست میکنم،واسه چرخش از داخل تایمر بعد از یه مدتی یه رله کهوصله به موتور 220 رو روشن و واسه خاموش شدنش از میکروسوئیچ استفاده کردم،که میکروسوئیچ ها رو پول اپ خارجی کردم و وقفه رو مد بالارونده ست کردم،بعضی وقتا رو لبه پایین رونده خاموش میشه،اکثر مواقع رو لبه بالارونده خاموش میشه،بعضی وقتا که کلا قطع نمیشه،ممنون میشم کمکم کنید،کدم هم این هست
و ال سی دی هم به هم میریزه،که توی تاپیک های قبلی خوندم کسی راه حل اساسی نگفته،انگار که این مشکل با هیچ روشی درس نمیشه،ممنون میشم کمکم کنید
[FONT=Yekan]#ifndef F_CPU[/FONT]#define F_CPU 1000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include "LCD_16x2_H_file.h"
#include "DHT.h"
//#define SLEEP_MODE_IDLE 0
double hum,temp;
char buffer[17];
double arr_ave_h[10]={ 0 },arr_ave_t[10]={ 0 };
volatile int count = 0,sec = 0,min = 0,hour = 0,day = 0,i=0,Rotate_flag=0,display_flag=0;
char str[10];
double humidity,Temperature;
//void WDT_ON()
//{
///*
//Watchdog timer enables with typical timeout period 2.1
//second.
//*/
//WDTCR = ( 1<<WDE)|( 1<<WDP2)|( 1<<WDP1)|(1<<WDP0);
//}
//void WDT_OFF()
//{
///*
//This function use for disable the watchdog timer.
//*/
//WDTCR = ( 1<<WDTOE)|( 1<<WDE);
//WDTCR = 0x00;
//}
//
ISR(TIMER1_COMPA_vect)
{
count++;
if (count >= 10)
{
sec++;
count = 0;
if (sec >= 60)
{
min++;
PORTD |= (1 << 4);
sec = 0;
if (min >= 60)
{
hour++;
min = 0;
if (hour >= 24)
{
day++;
hour = 0;
}
}
}
}
}
ISR(TIMER0_COMP_vect)
{
//WDT_OFF();
sprintf(buffer,"T=%0.1fC H=%0.1f%%",avreage(arr_ave_t),avreage(arr_ave_h));
sprintf(str,"%02d:%02d:%02d:%02d",day,hour,min,sec);
LCD_String_xy(0,0,buffer);
LCD_String_xy(1,0,str);
}
ISR(INT0_vect)
{
PORTD &= ~(1 << 4);
_delay_ms(1);
LCD_Clear();
}
ISR(INT1_vect)
{
//PORTD |= (1 << 4);
LCD_Clear();
}
int main(void)
{
LCD_Init();
DHT_Setup();
//WDT_ON();
timer1_init();
timer0_init();
int0_init();
int1_init();
DDRD = 0b00010011;
PORTD = 0b00000000;
sei();
while (1)
{
DHT_Read(&temp,&hum);
arr_ave_t[i]=temp;
arr_ave_h[i]=hum;
i++;
if(i == 10){
i=0;
}
_delay_ms(2000);
}
}
void timer1_init()
{
TCCR1B |= (1 << WGM12) | (1 << CS11);
OCR1A = 0x30D3;
TIMSK |= (1 << OCIE1A);
}
void timer0_init()
{
TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);
OCR0 = 0x60;
TIMSK |= (1 << OCIE0);
}
void int0_init()
{
GICR |= 1<<INT0;
MCUCR |= 1<<ISC00 | 1<<ISC01;
}
void int1_init()
{
GICR |= 1<<INT1 ;
MCUCR |= 1<<ISC10 | 1<<ISC11;
}
و ال سی دی هم به هم میریزه،که توی تاپیک های قبلی خوندم کسی راه حل اساسی نگفته،انگار که این مشکل با هیچ روشی درس نمیشه،ممنون میشم کمکم کنید