اطلاعیه

Collapse
No announcement yet.

راهنمایی در وقفه

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    راهنمایی در وقفه

    سلام

    من وقفه usart در ارسال و در یافت رو فعال کرده ام ولی نمی دانم کدی که میخوام در وقفه بنویسم (مثلا scanf یا getchar یا printf) روکجاش بنویسم. لطفا محل ان را برایم در کدهای تولید شده توسط کد ویزارد زیر مشخص نمایید.متشکرم.


    #include <mega16.h>
    #include <stdlib.h>
    #include <delay.h>
    #include <stdio.h>

    #ifndef RXB8
    #define RXB8 1
    #endif

    #ifndef TXB8
    #define TXB8 0
    #endif

    #ifndef UPE
    #define UPE 2
    #endif

    #ifndef DOR
    #define DOR 3
    #endif

    #ifndef FE
    #define FE 4
    #endif

    #ifndef UDRE
    #define UDRE 5
    #endif

    #ifndef RXC
    #define RXC 7
    #endif

    #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)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // 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)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256
    if (++rx_counter == 0)
    {
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    #endif
    rx_buffer_overflow=1;
    }
    }
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index++];
    #if RX_BUFFER_SIZE != 256
    if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #endif
    #asm("cli&quot
    --rx_counter;
    #asm("sei&quot
    return data;
    }
    #pragma used-
    #endif

    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];

    #if TX_BUFFER_SIZE <= 256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif

    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
    {
    --tx_counter;
    UDR=tx_buffer[tx_rd_index++];
    #if TX_BUFFER_SIZE != 256
    if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    #endif
    }
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli&quot
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
    tx_buffer[tx_wr_index++]=c;
    #if TX_BUFFER_SIZE != 256
    if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
    #endif
    ++tx_counter;
    }
    else
    UDR=c;
    #asm("sei&quot
    }
    #pragma used-
    #endif

    // Standard Input/Output functions






    // Declare your global variables here

    void main(void)
    {

    #2
    پاسخ : راهنمایی در وقفه

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;

    یا متونی اینجا اطلاعات رو بخونی فرضاً get_data=data;



    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256

    if (++rx_counter == 0)



    ولی بهتره اینجا اطلاعات رو بخونی فرقش با بالایی اینه که اینجا مطمئن هست اطلاعاتت درست دریافت شده از لحاظ پریت ،اور ران و ... گک شده و مسئله ایی نیست.


    {
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    #endif
    rx_buffer_overflow=1;
    }
    }
    }


    موفق باشی.

    دیدگاه


      #3
      پاسخ : راهنمایی در وقفه

      شما وقتی وقفه سریال رو فعال کردین کدویزارد یه تابع دریافت و یه دونه هم برای ارسال بصورت وقفه ایجاد میکنه که داده های دریافتی/ارسالی رو به طریقه Fifo حلقوی ارسال/دریافت میکنند که شما جز در موارد خاص بهش نیاز نداری. این توابع با کلمه کلیدی interrupt مشخص میشن.
      اما اونچیزی که شما نیاز داری تنها توابع getchar و putchar هستند که با توابع بالا در ارتباطند. مثلا اگه داده ای موجود باشه با تابع getchar میتونید اونو بخونید اما اگه داده ای موجود نباشه این تابع منتظر دریافت داده میشه. یه سری متغیر هم کدویزارد تعریف کرده که اندازه اون FIFO حلقوی و ابتدا و انتهای اون و تعداد داده های موجود رو مشخص میکنه که خیلی بدرد بخورند

      دیدگاه

      لطفا صبر کنید...
      X