سلام
این برنامه یه مشکلی داره
قراره 4 تا از ورودی های آنالوگ رو مثایسه کنه وبزرگترین اونا رو مشخص کنه
ولی وقتی ورودی اول بزرگتر از بقیه میشه بعد از کم شدنش به ترتیب خروجی ها رو روشن میکنه
یعنی وقتی
adc1
بزرگتر از بقیه میشه خروجی معادلش یعنی
B1
رو روشن میکنه ولی بعد از اینکه مقدارش کم شد به تر تیب با یه تاخیر کوچیک
B2,B3,B4
رو روشن میکنه
هر چی هم مقدار ورودی بیشتر باشه مدت روشن موندن خروجی ها بیشتر میشه
همینطور اگه
adc2
بیشتر از بقیه بشه بعد از کم شدنش
B3,B4
روشن میشن که این اصلا منطقی نیست
تو پروتئوس هم درست جواب میده ولی تو عمل مشکل داره
رو چند تا میکرو هم تست کردم ولتاژ مرجع رو تغییر دادم ولی درست نشد
حالا باید چیکار کنم؟؟؟
#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "avrlibdefs.h"
#include "avrlibtypes.h"
#include "a2d.c"
//************************************************** *******************
#define E 100
#define set2 20
//************************************************** *******************
void mjs(void);
//************************************************** *******************
int main()
{
//-------------------------------------------------
cbi(DDRC, 1); //input
cbi(PORTC, 1); //disable pullup
cbi(DDRC, 2); //input
cbi(PORTC, 2); //disable pullup
cbi(DDRC, 3); //input
cbi(PORTC, 3); //disable pullup
cbi(DDRC, 4); //input
cbi(PORTC, 4); //disable pullup
//-------------------------------------------------
sbi(DDRB, 0); //output
cbi(PORTB, 0); //disable pullup
sbi(DDRB, 1); //output
cbi(PORTB, 1); //disable pullup
sbi(DDRB, 2); //output
cbi(PORTB, 2); //disable pullup
sbi(DDRB, 3); //output
cbi(PORTB, 3); //disable pullup
sbi(DDRB, 4); //output
cbi(PORTB, 4); //disable pullup
//-------------------------------------------------
a2dInit();
a2dSetPrescaler(ADC_PRESCALE_DIV64);
a2dSetReference(ADC_REFERENCE_AREF);
a2dSetChannel(ADC_CH_ADC1);
a2dSetChannel(ADC_CH_ADC2);
a2dSetChannel(ADC_CH_ADC3);
a2dSetChannel(ADC_CH_ADC4);
a2dStartConvert();
//-------------------------------------------------
_delay_ms(500);
mjs();
return 0;
}
//************************************************** *******************
void mjs(void)
{
unsigned int adc1,adc2,adc3,adc4;
//-------------------------------------------------
PORTB=0b00000001;
while(1)
{
adc1 = a2dConvert10bit(ADC_CH_ADC1);
adc2 = a2dConvert10bit(ADC_CH_ADC2);
adc3 = a2dConvert10bit(ADC_CH_ADC3);
adc4 = a2dConvert10bit(ADC_CH_ADC4);
//-------------------------------------------------
if(adc1>=adc2+set2 && adc1>=adc3+set2 && adc1>=adc4+set2 && adc1>=E)
{
PORTB=0b00000011;
}
else if(adc2>=adc1+set2 && adc2>=adc3+set2 && adc2>=adc4+set2 && adc2>=E)
{
PORTB=0b00000101;
}
else if(adc3>=adc1+set2 && adc3>=adc2+set2 && adc3>=adc4+set2 && adc3>=E)
{
PORTB=0b00001001;
}
else if(adc4>=adc2+set2 && adc4>=adc3+set2 && adc4>=adc1+set2 && adc4>=E)
{
PORTB=0b00010001;
}
else
{
PORTB=0b00000001;
}
}
}
//************************************************** ******************
این برنامه یه مشکلی داره
قراره 4 تا از ورودی های آنالوگ رو مثایسه کنه وبزرگترین اونا رو مشخص کنه
ولی وقتی ورودی اول بزرگتر از بقیه میشه بعد از کم شدنش به ترتیب خروجی ها رو روشن میکنه
یعنی وقتی
adc1
بزرگتر از بقیه میشه خروجی معادلش یعنی
B1
رو روشن میکنه ولی بعد از اینکه مقدارش کم شد به تر تیب با یه تاخیر کوچیک
B2,B3,B4
رو روشن میکنه
هر چی هم مقدار ورودی بیشتر باشه مدت روشن موندن خروجی ها بیشتر میشه
همینطور اگه
adc2
بیشتر از بقیه بشه بعد از کم شدنش
B3,B4
روشن میشن که این اصلا منطقی نیست
تو پروتئوس هم درست جواب میده ولی تو عمل مشکل داره
رو چند تا میکرو هم تست کردم ولتاژ مرجع رو تغییر دادم ولی درست نشد
حالا باید چیکار کنم؟؟؟
#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "avrlibdefs.h"
#include "avrlibtypes.h"
#include "a2d.c"
//************************************************** *******************
#define E 100
#define set2 20
//************************************************** *******************
void mjs(void);
//************************************************** *******************
int main()
{
//-------------------------------------------------
cbi(DDRC, 1); //input
cbi(PORTC, 1); //disable pullup
cbi(DDRC, 2); //input
cbi(PORTC, 2); //disable pullup
cbi(DDRC, 3); //input
cbi(PORTC, 3); //disable pullup
cbi(DDRC, 4); //input
cbi(PORTC, 4); //disable pullup
//-------------------------------------------------
sbi(DDRB, 0); //output
cbi(PORTB, 0); //disable pullup
sbi(DDRB, 1); //output
cbi(PORTB, 1); //disable pullup
sbi(DDRB, 2); //output
cbi(PORTB, 2); //disable pullup
sbi(DDRB, 3); //output
cbi(PORTB, 3); //disable pullup
sbi(DDRB, 4); //output
cbi(PORTB, 4); //disable pullup
//-------------------------------------------------
a2dInit();
a2dSetPrescaler(ADC_PRESCALE_DIV64);
a2dSetReference(ADC_REFERENCE_AREF);
a2dSetChannel(ADC_CH_ADC1);
a2dSetChannel(ADC_CH_ADC2);
a2dSetChannel(ADC_CH_ADC3);
a2dSetChannel(ADC_CH_ADC4);
a2dStartConvert();
//-------------------------------------------------
_delay_ms(500);
mjs();
return 0;
}
//************************************************** *******************
void mjs(void)
{
unsigned int adc1,adc2,adc3,adc4;
//-------------------------------------------------
PORTB=0b00000001;
while(1)
{
adc1 = a2dConvert10bit(ADC_CH_ADC1);
adc2 = a2dConvert10bit(ADC_CH_ADC2);
adc3 = a2dConvert10bit(ADC_CH_ADC3);
adc4 = a2dConvert10bit(ADC_CH_ADC4);
//-------------------------------------------------
if(adc1>=adc2+set2 && adc1>=adc3+set2 && adc1>=adc4+set2 && adc1>=E)
{
PORTB=0b00000011;
}
else if(adc2>=adc1+set2 && adc2>=adc3+set2 && adc2>=adc4+set2 && adc2>=E)
{
PORTB=0b00000101;
}
else if(adc3>=adc1+set2 && adc3>=adc2+set2 && adc3>=adc4+set2 && adc3>=E)
{
PORTB=0b00001001;
}
else if(adc4>=adc2+set2 && adc4>=adc3+set2 && adc4>=adc1+set2 && adc4>=E)
{
PORTB=0b00010001;
}
else
{
PORTB=0b00000001;
}
}
}
//************************************************** ******************
دیدگاه