ايران ويج

نسخه‌ی کامل: مشکل مبتدیانه در برنامه نویسی!!!
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام خدمت تموم مهندسین و حضار محترم
میدونم خیلی مبتدی و ابتداییه اما خب سوال نیمی از علمه، منو ببخشید که اینا رو میپرسم.
من میخوام از وقفه USART استفاده کنم و به محض رخ دادن وقفه( که همون دریافت داده جدیده) یه سری محاسبات انجام بشه و نتایج با کد مشخصه خودشون روی پورتهایی که موازی به دستگاه دیگه وصل اند ارسال بشه. سوال من اینه که من این تابع وقفه رو تو حلقه (1) while باید بزارم که ازش استفاده کنم یا اینکه فرقی نداره که کجا باشه؟؟ دستوراتی که محاسبات رو انجام میدن چی؟ اونا رو تو اون حلقه قرار بدم؟؟ اینا گیجم کرده اگه راهنماییم کنین ممنون میشم
با زبان C میخوام بنویسم
(۲۷-آذر-۱۳۹۰, ۰۰:۵۲:۴۶)arash_ee نوشته است: [ -> ]سلام خدمت تموم مهندسین و حضار محترم
میدونم خیلی مبتدی و ابتداییه اما خب سوال نیمی از علمه، منو ببخشید که اینا رو میپرسم.
من میخوام از وقفه USART استفاده کنم و به محض رخ دادن وقفه( که همون دریافت داده جدیده) سه سری محاسبات انجام بشه و نتایج با کد مشخصه خودشون روی پورتهایی که موازی به دستگاه دیگه وصل اند ارسال بشه. سوال من اینه که من این تابع وقفه رو تو حلقه (1) while باید بزارم که ازش استفاده کنم یا اینکه فرقی نداره که کجا باشه؟؟ دستوراتی که محاسبات رو انجام میدن چی؟ اونا رو تو اون حلقه قرار بدم؟؟ اینا گیجم کرده اگه راهنماییم کنین ممنون میشم

بگین با چه زبانی برنامه مینویسین تا بشه با یه مثال راهنمایتون کرد
ولی در کل : تابع وقفه خارج از وایل نوشته میشه
و محاسبات هم میتون داخل وقفه باشه هم بیرون (داخل وقفه ساده ترین راه حله)
(۲۷-آذر-۱۳۹۰, ۰۱:۰۰:۱۷)sajadgh نوشته است: [ -> ]
(۲۷-آذر-۱۳۹۰, ۰۰:۵۲:۴۶)arash_ee نوشته است: [ -> ]سلام خدمت تموم مهندسین و حضار محترم
میدونم خیلی مبتدی و ابتداییه اما خب سوال نیمی از علمه، منو ببخشید که اینا رو میپرسم.
من میخوام از وقفه USART استفاده کنم و به محض رخ دادن وقفه( که همون دریافت داده جدیده) سه سری محاسبات انجام بشه و نتایج با کد مشخصه خودشون روی پورتهایی که موازی به دستگاه دیگه وصل اند ارسال بشه. سوال من اینه که من این تابع وقفه رو تو حلقه (1) while باید بزارم که ازش استفاده کنم یا اینکه فرقی نداره که کجا باشه؟؟ دستوراتی که محاسبات رو انجام میدن چی؟ اونا رو تو اون حلقه قرار بدم؟؟ اینا گیجم کرده اگه راهنماییم کنین ممنون میشم

بگین با چه زبانی برنامه مینویسین تا بشه با یه مثال راهنمایتون کرد
ولی در کل : تابع وقفه خارج از وایل نوشته میشه
و محاسبات هم میتون داخل وقفه باشه هم بیرون (داخل وقفه ساده ترین راه حله)
یادم رفت بگم، با زبان C
در بیرون while نوشته میشه
باید قبلش وقفه کلی و وقفه usart رو فعال کنی
کد:
interrupt [12] void usart_int(void)
{
دستورات داخل وقفه
}
شاید این کمکت کنه

کد:
#include <mega32.h>
#include <delay.h>


#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RX_BUFFER_SIZE 8
//////////////////////////////////////////////////////////////////////////
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index;
//////////////////////////////////////////////////////////////////////////
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
       {
        char status,data;
        status=UCSRA;
        data=UDR;
        if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
           {
             برنامه مربوط به محاسبات
           }
       }
//////////////////////////////////////////////////////////////////////////
void main(void)
       {
        UCSRB=0x90;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x33;
        #asm("sei")
        while(1)
            {
                برنامه اصلي
            }
       }
//////////////////////////////////////////////////////////////////////////
ممنون از این برنامه ای که گذاشتین. میشه کمی در موردش توضیح بدین؛ این #DEFINE های اول برنامه متوجه نمیشم واسه چی هستن اگه توضیح بدین ممنون میشم

FE بیت چهارم رجیستر UCSRA : در صورتی که قالب داده دریافتی صحیح نباشه یکه میشه
UPE بیت دوم رجیستر UCSRA : درصورتی که خطای پریتی بوجود بیاد یک میشه
DOR بیت سوم رجیستر UCSRA : اگه یک باشه یعنی خطای OVER RUN رخ داده
UDRE بیت پنجم رجیستر UCSRA : وقتی یک باشه یعنی بافر ارسال آماده دریافت اطلاعات جدیدِ ، البته اینجا کاربرد نداره باید پاک شه
RXC بیت هفتم رجیستر UCSRA : در صورتی که در بافر دریافتی داده وجود داشته باشه یک میشه
این دو مورد آخر کاربرد نداره توی این کدی گذاشتم (این قسمتی از برنامه هست که جایی استفاده کرده بودم قسمتهای اضافی رو پاک کردم اینجا گذاشتم که این دو خط + rx_buffer و RX_buffer که اضافیه و باید پاک شه)

توی خط
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
چک شده اگه خطای رخ نداده از داده دریافتی استفاده بشه (اعتبار سنجی داده ورودی)

اون دیفیاین ها هم برای راحتی کار برنامه نویسی به این صورت که شماره همیه بیتهای ذکر شده توی هدر فایل میکرو هست و عدد به همون تعداد به سمت چپ شیف خورده تا بیت مورد نظر بدست بیاد. میشد اون دیفاین هارو تعریف نکرد و بجاش جای خط زیر
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
از این خط استفاده کرد
if ((status & 0x1C )==0)
من با ویزارد کدویژن تنظیمات Usart رو انجام دادم کدش این شده اما تعجب اینه که چرا آکولادی که باز کرده رو نبسته:
[code]
iinterrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer0[rx_wr_index0++]=data;
#if RX_BUFFER_SIZE0 == 256
// special case for receiver buffer size=256
if (++rx_counter0 == 0)
{
#else
if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0=0;
#endif
rx_buffer_overflow0=1;
}
}
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
[\code]
اشتباه میکنی دوباره تکرار کن
منم تعجب کردم و فکر کردم که اشتباه میکنم اما وقتی آکولاد رو میبندم پیغام خطا میده، من اشتباه نمیکنم، برنامه همینه، عینا کپی پیست کردم. حالا میشه بگید محاسباتم رو کجا باید اضافه کنم؟ و اصلا این همه برنامه واسه چیه؟
سلام آقا آرش
ميتوني كل برنامتو بزاري
احتمالا توي بقيه برنامت يه آكولد زيادي گذاشتي.
صفحه‌ها: 1 2