اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه ارتباط سریال

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

    مشکل با وقفه ارتباط سریال

    سلام
    من یه میکرو را وصل کردم به pc و با ارسال دیتا از pc وقفه سریال میکرو فعال میشه و یه مقدار senddata را عوض می کنه ولی نمیدونم چرا برای بار دوم که دیتا می فرستم دیکه تغییر نمی کنه
    این برنامشه توضیحات هم پایین نوشتم


    #include <mega16.h>

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

    // Standard Input/Output functions

    unsigned long int timer0_ov;
    unsigned long int in_freq;
    char str[10];
    bit senddata=0;
    float tf;
    char str1[10];
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #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];
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    #pragma savereg-
    interrupt [USART_RXC] void uart_rx_isr(void)
    {
    char status,data,;
    #asm
    push r26
    push r27
    push r30
    push r31
    in r26,sreg
    push r26
    #endasm
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    if(data=='#&#039
    {
    senddata=1;
    };
    if(data=='@&#039
    {
    senddata=0;
    };
    rx_buffer[rx_wr_index]=data;
    if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    };
    };
    #asm
    pop r26
    out sreg,r26
    pop r31
    pop r30
    pop r27
    pop r26
    #endasm
    }
    #pragma savereg+

    #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_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli&quot
    --rx_counter;
    #asm("sei&quot
    return data;
    }
    #pragma used-
    #endif

    // Standard Input/Output functions
    #include <stdio.h>

    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Place your code here
    timer0_ov++;
    }

    #define ADC_VREF_TYPE 0x40
    // Read the AD conversion result
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input|ADC_VREF_TYPE;
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
    // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
    // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
    // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func0=Out Func1=In Func2=In Func3=In Func4=In Func5=Out Func6=In Func7=In
    // State0=0 State1=T State2=T State3=T State4=T State5=0 State6=T State7=T
    PORTD=0x00;
    DDRD=0x21;

    // Timer/Counter 0 initialization
    // Clock source: T0 pin Falling Edge
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 125.000 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Toggle
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x40;
    TCCR1B=0x0A;
    TCNT1H=0x00;
    TCNT1L=0x00;
    OCR1AH=0x01;
    OCR1AL=0xF3;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    GICR|=0x00;
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 9600
    UCSRA=0x00;
    UCSRB=0x98;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    // Analog Comparator Output: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC High Speed Mode: On
    // ADC Auto Trigger Source: None
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x86;
    SFIOR&=0xEF;
    SFIOR|=0x10;

    // Global enable interrupts


    while (1)
    {
    // Place your code here
    if(senddata==0)
    {

    TCCR0=0x06; // Start Timer T0 pin Falling Edge

    #asm("sei&quot // Global enable interrupts

    delay_ms(1000);

    #asm("cli" // Global disable interrupts

    in_freq = timer0_ov * 256 + TCNT0;

    ftoa(in_freq,2,str);
    puts(str);

    delay_ms(1000);
    TCCR0=0x00; //Stopt Timer0
    timer0_ov=0; //Prepare for next count
    TCNT0=0; //Clear Timer0
    }
    // if (senddata==1)
    else
    {
    tf=read_adc(2);
    tf=(tf*5/1023);
    ftoa(tf,1,str1);
    puts(str1);
    }




    };
    }


    این برنامه دوتا کار باید بکند
    1-نمونه برداری از سیگنال ورودی که به adc(2) وصل شده و ارسال ان
    2- بدست اوردن فرکانس سیگنال
    با هر وقفه باید یکی از این کار ها را انجام دهد ولی وقتی می خواد از کار شماره 1 بیاد 2 چون سرعت کار زیاده وقفه انجام نمیشه نمی دونم چرا oo:

    (من خودم یه سیگنال با همین میکرو درست کردم(timer 2 ) و دادم به adc 2 )

    اگه از توضیحات من چیزی فهمیدید من را هم راهنمایی کنید

    ممنون
    قندیل، تندیس قطره هایی است که تسلیم جاذبه زمین نشدند. "چگوآرا"

    #2
    پاسخ : مشکل با وقفه ارتباط سریال

    سلام من با وقفه سریال با BAscom کار کرده ام جواب داد یه نگاه به این پست بنداز
    http://www.eca.ir/forum2/index.php?topic=61231.15
    معجزه این است که هرچه داشته هایت را بیشتر با دیگران سهیم شوی،داراتر می شوی (لئونارد نیموی)
    اگر مغزانسان،چنان ساده می بود که ما از آن سر در می آوردیم،هنوز چنان احمق بودیم که هیچ از آن سر در نمی آوردیم!
    آموزش Modelsim

    دیدگاه


      #3
      پاسخ : مشکل با وقفه ارتباط سریال

      نوشته اصلی توسط skiboy
      سلام من با وقفه سریال با BAscom کار کرده ام جواب داد یه نگاه به این پست بنداز
      http://www.eca.ir/forum2/index.php?topic=61231.15
      سلام
      من با بسکام کار نکردم نمی دونم چی میشه
      اگه ممکنه codevision را توضیح دهید
      ممنون
      قندیل، تندیس قطره هایی است که تسلیم جاذبه زمین نشدند. "چگوآرا"

      دیدگاه


        #4
        پاسخ : مشکل با وقفه ارتباط سریال

        سلام دادا.
        کار برنامت رو بگو ببینم قراره چیکار کنه
        تشکر لازم نیست!

        دیدگاه


          #5
          پاسخ : مشکل با وقفه ارتباط سریال

          به جای
          interrupt [USART_RXC] void uart_rx_isr(void)

          از
          interrupt [USART_RXC] void ReceiveIntHandler(void)
          استفاده کنید مشکلتون حل میشه

          دیدگاه


            #6
            پاسخ : مشکل با وقفه ارتباط سریال

            نوشته اصلی توسط داریوش عباسی
            به جای
            interrupt [USART_RXC] void uart_rx_isr(void)

            از
            interrupt [USART_RXC] void ReceiveIntHandler(void)
            استفاده کنید مشکلتون حل میشه
            سلام ممنون از راهنمایی تون
            مشکل از این بود.

            // Global enable interrupts
            #asm("sei&quot
            من توی حلقه اصلی می بستمش با #asm("cli&quot و می بایست دوباره بازش کنم که بلاخره درست شد
            ممنون از توجهتون :bye
            قندیل، تندیس قطره هایی است که تسلیم جاذبه زمین نشدند. "چگوآرا"

            دیدگاه

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