اطلاعیه

Collapse
No announcement yet.

استفاده از وقفه سریال

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

    استفاده از وقفه سریال

    1-برای اینکه از وقفه پورت سریال استفاده کنم ( جهت دریافت پیامک با sim900) ، باید پایه INT0 در میکرو را به RX وصل کنم ؟
    2- برای فعال کردنش ، همین که در قسمت usart setting ، گزینه rx interrupt & tx interrupt را فعال کنم کافیه ؟ یا گزینه دیگری هم نیاز به فعال سازی دارد ؟
    3- کد تولید شده با کدویزاد با فعال کردن rx interrupt & tx interrupt به این صورت هست ، حالا باید دستورات را کجای کد وارد کنم ؟ یعنی فرمان های وقفه باید کجا ی این کد قرار بگیرن ؟
    کد:
    
    #include <mega32a.h>
    
    // Alphanumeric LCD functions
    #include <alcd.h>
    
    // Declare your global variables here
    
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)
    
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index=0,rx_rd_index=0;
    #else
    unsigned int rx_wr_index=0,rx_rd_index=0;
    #endif
    
    #if RX_BUFFER_SIZE < 256
    unsigned char rx_counter=0;
    #else
    unsigned int rx_counter=0;
    #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) rx_buffer_overflow=1;
    #else
       if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
       if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          }
    #endif
       }
    }
    
    #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")
    --rx_counter;
    #asm("sei")
    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=0,tx_rd_index=0;
    #else
    unsigned int tx_wr_index=0,tx_rd_index=0;
    #endif
    
    #if TX_BUFFER_SIZE < 256
    unsigned char tx_counter=0;
    #else
    unsigned int tx_counter=0;
    #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")
    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")
    }
    #pragma used-
    #endif
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
    DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) |  (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) |  (0<<DDA0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
    PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) |  (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) |  (0<<PORTA1) | (0<<PORTA0);
    
    // Port B initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
    DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) |  (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) |  (0<<DDB0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) |  (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) |  (0<<PORTB1) | (0<<PORTB0);
    
    // Port C initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
    DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) |  (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) |  (0<<DDC0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
    PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) |  (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) |  (0<<PORTC1) | (0<<PORTC0);
    
    // Port D initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
    DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) |  (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) |  (0<<DDD0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
    PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) |  (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) |  (0<<PORTD1) | (0<<PORTD0);
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) |  (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Disconnected
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) |  (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0<<AS2;
    TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) |  (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
    TCNT2=0x00;
    OCR2=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) |  (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) |  (0<<OCIE0) | (0<<TOIE0);
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
    MCUCSR=(0<<ISC2);
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) |  (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
    UCSRB=(1<<RXCIE) | (1<<TXCIE) | (0<<UDRIE) |  (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) |  (0<<TXB8);
    UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) |  (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) |  (0<<UCPOL);
    UBRRH=0x00;
    UBRRL=0x47;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) |  (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) |  (0<<ACIS0);
    SFIOR=(0<<ACME);
    
    // ADC initialization
    // ADC disabled
    ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) |  (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) |  (0<<ADPS0);
    
    // SPI initialization
    // SPI disabled
    SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) |  (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) |  (0<<SPR0);
    
    // TWI initialization
    // TWI disabled
    TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
    
    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTB Bit 0
    // RD - PORTB Bit 1
    // EN - PORTB Bit 2
    // D4 - PORTB Bit 4
    // D5 - PORTB Bit 5
    // D6 - PORTB Bit 6
    // D7 - PORTB Bit 7
    // Characters/line: 16
    lcd_init(16);
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
          {
          // Place your code here
    
          }
    }
    جدیدترین ویرایش توسط hossein.ahmadvand; ۱۲:۵۱ ۱۳۹۵/۰۵/۱۱.
    امضاندارم. میشه انگشت بزنم...؟

    www.AsanService.ir

    #2
    پاسخ : استفاده از وقفه سریال

    چند تا فیلم آموزشی در رابط(وقفه سریال) تو آپارات گزاشتم - بگردی پیدا میکنی - آموزش در این زمینه هم الی ماشالله زیاده تو نت.
    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

    اگه دوس دارید سریع به جواب برسید :
    1) قبل از پرسیدن سوال، بسرچید.
    2) سوالاتون رو با جزئیات کامل مطرح کنید.

    دیدگاه


      #3
      پاسخ : استفاده از وقفه سریال

      کسی جواب سوالات رو نمیده ؟؟

      دلیل: ادغام دو پست برای جلوگیری از اسپم

      نوشته اصلی توسط md3848 نمایش پست ها
      چند تا فیلم آموزشی در رابط(وقفه سریال) تو آپارات گزاشتم - بگردی پیدا میکنی - آموزش در این زمینه هم الی ماشالله زیاده تو نت.
      نفهمیدم این دستورات وقفه رو که مینویسی ، میگی اگر این پایه int0 تحریک شد ، برو این زیر برنامه را اجرا کن ... خب! حالا این زیر برنامه رو چجوری مشخص کنم ؟
      امضاندارم. میشه انگشت بزنم...؟

      www.AsanService.ir

      دیدگاه


        #4
        پاسخ : استفاده از وقفه سریال

        1-برای اینکه از وقفه پورت سریال استفاده کنم ( جهت دریافت پیامک با sim900) ، باید پایه INT0 در میکرو را به RX وصل کنم ؟
        2- برای فعال کردنش ، همین که در قسمت usart setting ، گزینه rx interrupt & tx interrupt را فعال کنم کافیه ؟ یا گزینه دیگری هم نیاز به فعال سازی دارد ؟
        3- کد تولید شده با کدویزاد با فعال کردن rx interrupt & tx interrupt به این صورت هست ، حالا باید دستورات را کجای کد وارد کنم ؟ یعنی فرمان های وقفه باید کجا ی این کد قرار بگیرن ؟
        تو sim900 پایه های 9و10 پایه های rx و tx هستن.
        حالا میخوای وقفه وقتی دیتا از طرف Sim 900 دریافت کردی - وقفه رخ بده و متوجه بشی سریع، خب آموزشش تو نت هستش، int0 مربوطه به وقفه خارجی ولی نیاز شما وقتی داخلی tx هستش.

        حالا sim900 پایه 3 اش به نام dtr که مخفف Data Terminal Ready هستش، وقتی دیتایی موجود باشه(ماژول پیامکی دریافت کنه، زنگی بخوره و...) این پایه وضعیتش طبق توضیحات دیتاشیت تغییر میکنه و به ما اطلاع میده که دیتا موجود هستش، اینو طبق حرف شما که درسته باید به یه وقفه ی خارجی بدی و بعد وقتی وقفه خارجی رخ داد، اطلاعات پورت سریال مربوطه رو بخون.

        برای فعال کردن وقفه ها هم مطلب و آموزش تو نت هیمن eca و... موجوده

        کدویزارد رو ولش کن آدمو تنبل میکنه (البته یه زمانی رفیقم هم به من میگفت و من ... >>>>> آقا این شکلک مورد علاقه منو چرا از صفه اصلی برداشتین)
        اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

        اگه دوس دارید سریع به جواب برسید :
        1) قبل از پرسیدن سوال، بسرچید.
        2) سوالاتون رو با جزئیات کامل مطرح کنید.

        دیدگاه

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