NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2822 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 3 از 3

موضوع: استفاده از وقفه سریال

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Jul 2015
    نوشته ها
    25
    تشکر
    2
    تشکر شده 0 بار در 0 پست

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

    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
    
          }
    }

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر فعال pirozy آواتار ها
    تاریخ عضویت
    May 2010
    نوشته ها
    337
    تشکر
    147
    تشکر شده 192 بار در 84 پست

    پیش فرض

    سلام
    مهندس نیازی نیست که از وقفه خارجی استفاده کنی همون که وقفه دریافت سریال رو فعال کردی کافیه
    تو روتین مربوط به وقفه سریال نباید کار زیادی انجام بدی چون میکروت هنگ میکنه و یا بعضی از داده هات رو نادیده میگیره
    فقط تو روتین وقفه داده رو میخونی میریزی تو یه بافر و در تابع main اون بافر رو مقایسه می کنی اگه برابر با داده مورد نظرت بود کار مربوطه رو انجامش میدی
    موفق باشی

  4. تشکرها از این نوشته :


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Jul 2015
    نوشته ها
    25
    تشکر
    2
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط pirozy نمایش پست ها
    سلام
    مهندس نیازی نیست که از وقفه خارجی استفاده کنی همون که وقفه دریافت سریال رو فعال کردی کافیه
    تو روتین مربوط به وقفه سریال نباید کار زیادی انجام بدی چون میکروت هنگ میکنه و یا بعضی از داده هات رو نادیده میگیره
    فقط تو روتین وقفه داده رو میخونی میریزی تو یه بافر و در تابع main اون بافر رو مقایسه می کنی اگه برابر با داده مورد نظرت بود کار مربوطه رو انجامش میدی
    موفق باشی
    ممنون.
    مثال یا کد ساده که اینو انجام داده باشه دارید که نمونه کدش رو ببینم ؟

موضوعات مشابه

  1. پاسخ: 6
    آخرين نوشته: 31-03-2016, 20:01
  2. ساعت‎ها نشستن پای کامپیوتر بدون خستگی چشم! با مانیتور BenQ BL2420Z آشنا شوید
    توسط shayans2 در انجمن اخبار کامپیوتر و IT و مسابقات رباتیک
    پاسخ: 0
    آخرين نوشته: 29-03-2016, 23:22
  3. ساعت‎ها نشستن پای کامپیوتر بدون خستگی چشم! با مانیتور BenQ BL2420Z آشنا شوید
    توسط shayans2 در انجمن اخبار کامپیوتر و IT و مسابقات رباتیک
    پاسخ: 0
    آخرين نوشته: 29-03-2016, 23:20
  4. پاسخ: 3
    آخرين نوشته: 04-03-2016, 13:24
  5. پاسخ: 3
    آخرين نوشته: 24-03-2013, 18:38

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •