اطلاعیه

Collapse
No announcement yet.

Non-local Jump Functions === IN ==== CODE VISION

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

    Non-local Jump Functions === IN ==== CODE VISION

    سلام
    کسی از دوستان راجع به Non-local Jump Functions در کدویژن اطلاعی داره؟؟؟

    این دستور ها در فایل setjmp.h هستند و از دو تابع int setjmp(char *env)-1 و void longjmp(char *env, int retval)-2 تشکیل شده

    تو Help یه توضیحاتی داده بود اما درست متوجه نشدم

    من میخوام از این دستورات تو وقفه یه تایمر استفاده کنم که برنامه رو از یک توقف رها کنه

    پارامترهای این دستورات رو چطور باید تنظیم کرد که قابل بازگشت نباشه(یعنی نمیخوام پس از پرش دیگه به موقعیت قبل برگردم)

    موضوع اینه که در ارتباط Usart ، وقتی از دستور getchar استفاده میکنیم آنقدر مکث میکنه تا یه بایت از usart بخونه و اگه دیتایی نباشه برنامه رو متوقف میکنه

    من میخوام به این دستورها پس از مدت زمان مشخصی که دیتایی نیومد در وقفه تایمر ، برنامه رو به خط بعد از getchar بپرونم

    باید چکار کنم؟؟؟

    #2
    پاسخ : Non-local Jump Functions === IN ==== CODE VISION

    لطفا Help کدویژن رو یه نگاه بندازید؟؟؟

    دیدگاه


      #3
      پاسخ : Non-local Jump Functions === IN ==== CODE VISION

      سوال شد برا من
      شما چرا لقمه رو می پیچونید خوب اینتراپت ریسور usart رو فعال کنید بعد چک کنید پارامتر rx_counter رو تا ببینید چند تا کاراکتر تو بافر هست به همون تعداد getchar کنید

      دیدگاه


        #4
        پاسخ : Non-local Jump Functions === IN ==== CODE VISION

        همین کار رو کردم

        اما وقتی وقفه رو فعال میکنم و تابع روتین رو فراخوانی میکنم نمیدونم چرا بیشتر از 10 بایت رو نمیخونه

        در حالی که بافر رو 512 قرار دادم اما تنها 10 بایت ابتدای داده رو میخونه

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

        من با رجیستر اعلام دریافت داده جدید در یوزارت این کار رو کردم
        هر موقع این بیت ، یک میشد شروع به خوندن اطلاعات از یوزارت میکردم

        اما با rx_counter کار نکردم

        میشه یکم بیشتر راجع به این روش توضیح بدین؟
        به چه شیوه ای برنامه رو تو روتین وقفه دنبال کنم که حدال وقفه و مکث رو داشته باشم؟؟؟

        یک سوال کمی : این عددی که برای بافر ذکر میکنیم به بیت هست یا به بایت؟
        فکر کنم به بیت باشه

        درسته؟؟؟

        دیدگاه


          #5
          پاسخ : Non-local Jump Functions === IN ==== CODE VISION

          شما احتمالا منظورتون روتین تایمره
          اگه هدف از روتین تایمر پرش از getchar هست این روش مناسبی نیست
          شما برای این کار تایمر لازم ندارید
          یکم روتین اینترابت usart کدورژن رو مطالعه کنید ساده وخیلی کاربردی هست
          شما فقط لازمه گاهی وقت ها rx_counter رو چک کنید تا ببینید چنتا کاراکتر تو بافر باقی مونده
          اون عدد تعداد بایت آرایه بافر اینتراپت usart هست که در صورت ورود به ریجیستر rx به rx_buffer منتقل میشه و به rx_cunter یکی اضافه میشه و با هر بار اجرای getchar یکی ازش کم میشه

          دیدگاه


            #6
            پاسخ : Non-local Jump Functions === IN ==== CODE VISION

            یه مینیمم برنامه دارید به عنوان مثال برام بزارید تا ازش کمک بگیرم؟؟؟

            چون دارم بخش های مختلف برنامه رو بهم بچسبونم و فرصت زیادی ندارم

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

            راستی اگه اون اعدادی که تو code wizard برای بافر فرستنده و گیرنده Usart تعریف میکنیم ، بایت هستند پس چرا 8 تا 8 تا زیاد میشن؟؟؟

            و کد ویزارد یه نگاهی بندازین؟؟؟
            منظورم اون اعداد هستن


            راستی در مورد اولویت های اینتراپت ها در Mega 32 یا Mega 128 چیزی میدونید؟؟؟

            مثلا اگه دوتا اینتراپت همزمان بیان کدوم مورد اولویت داره؟؟؟

            تو PIC این اولویت ها قابل تنظیمه اما تو AVR چطور؟؟؟

            آخه الان حدود 8 تا انتراپت فعال دارم

            دیدگاه


              #7
              پاسخ : Non-local Jump Functions === IN ==== CODE VISION

              سلام دوباره
              اولویت دیفالتی هست که در هدر 32.h تنطیم میشه اشتباه نکنم
              تو یک ریجیستر که فردا باید شرکت نگاه کنم بهتون بگوم
              وقابل تغییر هست
              شما می تونید دستی هر تعداد بایت رو به بافر به اصطلاحfifo اخیصاص بدید
              این مثال رو نگاه کنید:

              /************************************************** ***
              This program was produced by the
              CodeWizardAVR V1.25.5 Standard
              Automatic Program Generator
              © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
              http://www.hpinfotech.com

              Project :
              Version :
              Date : 09/13/2009
              Author : F4CG
              Company : F4CG
              Comments:


              Chip type : ATmega32
              Program type : Application
              Clock frequency : 40.000000 MHz
              Memory model : Small
              External SRAM size : 0
              Data Stack size : 512
              ************************************************** ***/

              #include <mega32.h>

              #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 533
              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_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
              if (++rx_counter == RX_BUFFER_SIZE)
              {
              rx_counter=0;
              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_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>

              // Declare your global variables here
              char str[3];
              unsigned int i;
              void main(void)
              {
              // Declare your local variables here

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

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

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

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

              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: Timer 0 Stopped
              // Mode: Normal top=FFh
              // OC0 output: Disconnected
              TCCR0=0x00;
              TCNT0=0x00;
              OCR0=0x00;

              // Timer/Counter 1 initialization
              // Clock source: System Clock
              // Clock value: Timer 1 Stopped
              // Mode: Normal top=FFFFh
              // OC1A output: Discon.
              // OC1B output: Discon.
              // Noise Canceler: Off
              // Input Capture on Falling Edge
              // Timer 1 Overflow Interrupt: Off
              // Input Capture Interrupt: Off
              // Compare A Match Interrupt: Off
              // Compare B Match Interrupt: Off
              TCCR1A=0x00;
              TCCR1B=0x00;
              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: 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
              MCUCR=0x00;
              MCUCSR=0x00;

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

              // 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=0x01;
              UBRRL=0x03;

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

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

              while (1)
              {
              if (rx_counter>2)
              {for (i=0;i<3;i++)
              str[i]=getchar();
              }

              };
              }

              به


              ح

              دیدگاه


                #8
                پاسخ : Non-local Jump Functions === IN ==== CODE VISION

                بلد نیستم چپ نویسش کنم
                به حلقه while دقت کنید
                وبه define اولای کد کد که طول آرایه rx_buffer رو مشخص میکنه که ما تو code wizard ست کردیم تو حلقه while دستور if چک میکنه اگه تعداد کتراکتر های دریافت شده بیش از 2 بایت بود اون ها رو تو str ذخیره میکنه: if ( rx_counter>2)
                for( i=0;i<3;i++)
                str[i]=getchar() ; //ss
                فرضا هر فریم دیتایی که باید تحلیل کنیم سه کاراکتر هست

                به همین سادگی
                البته یک پارامتر هم برای تشخیص overflow شدن بافر واعلام خطا هست که اگه همچین احتمالی دارین اون رو هم تو شروط برنامه اعمال کنید

                دیدگاه


                  #9
                  پاسخ : Non-local Jump Functions === IN ==== CODE VISION

                  دوست عزیز هنوز منتظر روش تنظیم اولویت وقفه هایی که گفتی هستم

                  ممنون میشو اگه یه توضیحی راجع بهش بدی

                  دیدگاه

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