PDA

View Full Version : مبتدی: درخواست توضیح در مورد کد مبدل آنالوگ به دیجیتال (ولت متر)



mostafa272
یک شنبه 20 فروردین 1391, 21:55 عصر
با سلام

کد زیر مربوط به یه برنامه تبدیل آنالوگ به دیحیتال هست . ولی زیاد با توابع avr آشنا نیستم و نمی دونم این توابع چی کار می کنند. لطفا اگه ممکنه یکی از دوستان تابع Run رو توضیح بده خط به خط چیکار میکنه و اون توابع COMMAND و CHAR_0 کارشون چیه؟

با تشکر


register addresses for Atmega 8535 */
#include "io8535.h"

#define ADSC ADCSR_Bit6
#define DDD7 DDRD_Bit7
#define DDD3 DDRD_Bit3
#define PIND3 PIND_Bit3
#define I SREG_Bit7

// Declare variables
unsigned char flag;
unsigned int result;
__flash unsigned char msg1[]=" Volt meter ";
__flash unsigned char msg2[]=" ADC0: 0.000 [V]";
__flash unsigned char ASCII[]="0123456789ABCDEF"; // ASCII Code
// PC0-PC7 : Data bus, PB5=RS, PB6=RW, PB7=E
#include "LCD8.h"

// ADC conversion complete handler
#pragma vector = ADC_vect
__interrupt void A_D_C(void)
{
result = ADC;
flag = 1 ;
}

void RUN(void)
{
unsigned char bcdh,bcdl;
flag = 0;
ADSC = 1; // Start ADC conversion
while(!(flag));
ADSC = 0;
//
result &= 0x03ff;
result *= 5;

bcdh = result >> 10;
bcdh <<= 4;

result &= 0x03ff;
result *= 10;
bcdh |= result >> 10;

result &= 0x03ff;
result *= 10;
bcdl = result >> 10;
bcdl <<= 4;

result &= 0x03ff;
result *= 10;
bcdl |= result >> 10;

COMMAND(0xc7);
CHAR_O((bcdh >> 4)+0x30);
CHAR_O('.');
CHAR_O((bcdh & 0x0f)+0x30);
CHAR_O((bcdl >> 4)+0x30);
CHAR_O((bcdl & 0x0f)+0x30);
COMMAND(0xcf);
}
// Main
void main(void)
{
L_INIT();
DISPLAY();
DDRA = 0; // Set PA0 input
DDD7 = 1; // Set PD7 output
DDD3 = 0; // Set PD3 input
ADMUX = 0; // Channel 0
ADCSR = 0xbc;
I = 1; // Set global interrupt enable
// Scan key
do{
if (!PIND3) RUN();
}while(1);
}

mostafa272
جمعه 25 فروردین 1391, 12:22 عصر
نزدیک یه هفته است یه سوال پرسیدم که آقا این دو تا تابع چی کار میکنن یکی پیدا نشد جواب بده!

sharin
جمعه 25 فروردین 1391, 19:01 عصر
سلام.

خط به خط كه زياد مي شه ...
كدها يه مقداري الكي پيچيده هستن ... كامپايلرش winnavr هست ؟
نمي دونم اين كد ماله كي هست ...!

تنه ي اصلي برنامه كه در تابع main نوشته شدهه ...
يه سري پيكربندي ها صورت مي گيره و برنامه وارد حلقه ي بينهايت مي شه و منتظر زده شدن كيدي كه به PD7 وصل هست مي شه تا به تابع RUN پرش كنه .

تابع RUN مي ياد ADC رو روشن مي كنه و شروع مي كنه به تبديل . flag تا موقعي كه صفر هست برنامه رو معطل مي كنه ( در واقع ميكرو و منتظر مي ذارهه تا ADC كار تبديل مقدارش رو تمام كنه )
وقتي كار تبديل مقدار ADC تمام شد يه وقفه رخ مي ده و خط برنامه مي رهه به روال وقفه و اونجا flag رو 1 مي كنه و مقدار تبديل شده ي ADC رو در result ذخيره مي كنه و بر مي گرده به خط

while(!(flag));

از تابع RUN . در اين حالت شرط while برقرار نيست و برنامه ي ميكرو از اين خط در مياد و خط هاي بعدي رو اجرا مي كنه ...

result &= 0x03ff
مي خواد از رزولوشن 10 بيت ADC استفاده كنه ، پس مقدار هاي Valid رو نگه مي دارهه و بقيه رو 0 مي كنه ، 3FF به باينري مي شه 10 بيت 1 پشت سر هم.
بعد ضربدر 5 اش مي كنه و حاصل رو مي ذارهه تو result در ادامه به اين ور و اونور شيفتش مي دهه و ...
اينها بستگي به سخت افزاري دارهه كه طراح آماده كردهه و كاري كه مي خواد براش انجام بدهه ... ، عمليات كه مشخص هستن ...

بعد مي رسيم به تابع COMMAND كه يه سري دستور رو به LCD مي فرسته ( در ديتاشيتش موجودهه )
در خطوط بعد هم مقدار هاي تبديل شده ي ADC رو كه قبلا به فرمي در آوردهه بود كه روي LCD نشون بده رو به LCD مي فرسته براي نمايش و در نهايت دوبارهه بر مي گرده به main و ...
روز از نو ، روزي از نو ...

اميدوارم كافي بودهه باشه ...
البته كدها در codvision و bascom به شدت مي تونن ساده تر باشن ...
موفق باشيد.