اطلاعیه

Collapse
No announcement yet.

کتابخانه uart برای avrstudio و چند سوال

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

    کتابخانه uart برای avrstudio و چند سوال

    با سلام خدمت دوستان عزیز.
    من چند تا کتابخونه uart دانلود کردم که بهترینش برای این سایت بود:
    http://jump.to/fleury
    حالا کسی کتابخونه بهتر سراغ داره؟؟
    سوال بعدی راجع به دستورات کار با ترمینال هست مثلا منظورم اینه که اگه دستور 'r\' رو بفرستیم به خط بعد میره و ...
    حالا من مثلا میخوام یه ساعت تو محیط ترمینال نمایش بدم باید از چه دستوری استفاده کنم که تمام رشته های ارسالی رو تو یه سطر و از ستون دلخواه شروع کنه؟؟

    #2
    پاسخ : کتابخانه uart برای avrstudio و چند سوال

    من خودن مدتهاست از کتابخونه Avrlib استفاده میکنم. ولی مزیت کتابخونهآ‌ای که شما لینک دادید اینه که بافر دریافتش بصورت Circular buffer پیادهآ‌سازی شده و این خیلی خوبه. حتما آزمایشش خواهم کرد، ممنون


    نوشته اصلی توسط M3R
    سوال بعدی راجع به دستورات کار با ترمینال هست مثلا منظورم اینه که اگه دستور 'r\' رو بفرستیم به خط بعد میره و ...
    حالا من مثلا میخوام یه ساعت تو محیط ترمینال نمایش بدم باید از چه دستوری استفاده کنم که تمام رشته های ارسالی رو تو یه سطر و از ستون دلخواه شروع کنه؟؟
    باید از دستورات کنترلی VT100 استفاده کنی. البته بشرط اینکه محیط ترمینالت هم از این دستورات پشتیبانی کنه (که در اکثر ترمینالآ‌های درست و حسابی پشتیبانی میشه)
    توی لینکی که از کتابخونه avrlib دادم فایلی بنام vt100.h و vt100.c هست که اگر به کدش نگاه کنی همه چی مشخصه.
    همچنین این لینک هم کمکت میکنه: http://www.termsys.demon.co.uk/vtansi.htm
    چگونه هوشمندانه بپرسیم

    دیدگاه


      #3
      پاسخ : کتابخانه uart برای avrstudio و چند سوال

      کد:
      /*------------------------------------------------*/
      /* UART functions                 */
      /*------------------------------------------------*/
      
      
      #include <avr/io.h>
      #include <avr/interrupt.h>
      
      void uart_init(void);		/* Initialize UART and Flush FIFOs */
      uint8_t uart_get (void);	/* Get a byte from UART Rx FIFO */
      uint8_t uart_test(void);	/* Check number of data in UART Rx FIFO */
      void uart_put (uint8_t);	/* Put a byte into UART Tx FIFO */
      
      #define	BAUD		9600
      #define Next_Line	0
      #define End_Line	1
      
      typedef struct {
      	uint8_t	wi, ri, ct;
      	uint8_t buff[64];
      } FIFO;
      static
      volatile FIFO TxFifo, RxFifo;
      
      
      
      
      void PRINTF(const char *str,char m)
      {
      	while (*str!=0x00)
      	{
      		uart_put(*str++);
      	}
      	if(m==End_Line) uart_put(13),uart_put(10);
      }
      
      void PRINTS(char *str,char m)
      {
      	while (*str!=0x00)
      	{
      		uart_put(*str++);
      	}
      	if(m==End_Line) uart_put(13),uart_put(10);
      }
      
      void PRINTV(int val,char m)
      {
      	volatile char *str="";
      	itoa(val,str,20);
      	while (*str!=0x00)
      	{
      		uart_put(*str++);
      	}
      	if(m==End_Line) uart_put(13),uart_put(10);
      }
      
      /* Initialize UART */
      
      void uart_init (void)
      {
      	UCSR0B = 0;
      
      	PORTE |= _BV(1); DDRE |= _BV(1);	/* Set TXD as output */
      	DDRE &= ~_BV(0); PORTE &= ~_BV(0); 	/* Set RXD as input */
      
      	RxFifo.ct = 0; RxFifo.ri = 0; RxFifo.wi = 0;
      	TxFifo.ct = 0; TxFifo.ri = 0; TxFifo.wi = 0;
      
      	UBRR0L = F_CPU / BAUD / 16 - 1;
      	UCSR0B = _BV(RXEN0) | _BV(RXCIE0) | _BV(TXEN0);
      }
      
      
      /* Get a received character */
      
      uint8_t uart_test (void)
      {
      	return RxFifo.ct;
      }
      
      
      uint8_t uart_get (void)
      {
      	uint8_t d, i;
      
      
      	while (RxFifo.ct == 0) ;
      	i = RxFifo.ri;
      	d = RxFifo.buff[i];
      	cli();
      	RxFifo.ct--;
      	sei();
      	RxFifo.ri = (i + 1) % sizeof RxFifo.buff;
      
      	return d;
      }
      
      
      /* Put a character to transmit */
      
      void uart_put (uint8_t d)
      {
      	uint8_t i;
      
      
      	while (TxFifo.ct >= sizeof TxFifo.buff) ;
      	i = TxFifo.wi;
      	TxFifo.buff[i] = d;
      	cli();
      	TxFifo.ct++;
      	UCSR0B = _BV(RXEN0) | _BV(RXCIE0) | _BV(TXEN0) | _BV(UDRIE0);
      	sei();
      	TxFifo.wi = (i + 1) % sizeof TxFifo.buff;
      }
      
      
      /* UART RXC interrupt */
      
      ISR(USART0_RX_vect)
      {
      	uint8_t d, n, i;
      
      
      	d = UDR0;
      	n = RxFifo.ct;
      	if (n < sizeof RxFifo.buff) {
      		RxFifo.ct = ++n;
      		i = RxFifo.wi;
      		RxFifo.buff[i] = d;
      		RxFifo.wi = (i + 1) % sizeof RxFifo.buff;
      	}
      }
      
      
      /* UART UDRE interrupt */
      
      ISR(USART0_UDRE_vect)
      {
      	uint8_t n, i;
      
      
      	n = TxFifo.ct;
      	if (n) {
      		TxFifo.ct = --n;
      		i = TxFifo.ri;
      		UDR0 = TxFifo.buff[i];
      		TxFifo.ri = (i + 1) % sizeof TxFifo.buff;
      	}
      	if (n == 0) UCSR0B = _BV(RXEN0) | _BV(RXCIE0) | _BV(TXEN0);
      }

      دوست من این یه کتابخونه خیلی خوبه که خودم دستکاریش کردم
      سه تا تابع داره
      PRINTF(String,MODE)
      PRINTF(String,MODE)
      PRINTF(Number,MODE)

      اگر بجای MODE بنویسی Next_Line نمیره خط بعد و جلوی همون مینویسه
      و اگر بنویسی End_Line میره خط بعد
      فقط این 3 تابع رو من اضافه کردم
      امیدوارم به دردتون بخوره

      البته با AVR Studio هست
      دلا خو کن به تنهایی که از تنها بلا خیزد

      دیدگاه


        #4
        پاسخ : کتابخانه uart برای avrstudio و چند سوال

        سلام
        بافر دریافتش بصورت Circular buffer پیادهآ‌سازی شده
        میشه یکم در مورد این Circular buffer توضیح بدید؟؟
        من این کتابخونه رو تو avrfreaks پیدا کردم اونجا خیلی ازش تعریف کرده بودن!!

        دیدگاه


          #5
          پاسخ : کتابخانه uart برای avrstudio و چند سوال

          به بیان ساده یک بافر حلقوی هست که انتهای بافر به ابتداش متصل میشه و مثل یک دایره میمونه. اگر آخرین خونهٔ بافر پر بشه، اطلاعات دوباره از ابتدای بافر شروع به پر شدن میکنند. این باعث میشه که اگر بافر به انتها رسید و اطلاعات جدیدی هم از راه رسید، این داده های جدید روی قدیمیآ‌ترین دادهآ‌ها نوشته بشن.

          توضیح کامل و دقیقی ازش رو در لینک زیر بخونید:
          http://en.wikipedia.org/wiki/Circular_buffer
          چگونه هوشمندانه بپرسیم

          دیدگاه


            #6
            پاسخ : کتابخانه uart برای avrstudio و چند سوال

            نوشته اصلی توسط Navid_Micro
            کد:
            /*------------------------------------------------*/
            /* UART functions                 */
            /*------------------------------------------------*/
            
            
            #include <avr/io.h>
            #include <avr/interrupt.h>
            
            void uart_init(void);		/* Initialize UART and Flush FIFOs */
            uint8_t uart_get (void);	/* Get a byte from UART Rx FIFO */
            uint8_t uart_test(void);	/* Check number of data in UART Rx FIFO */
            void uart_put (uint8_t);	/* Put a byte into UART Tx FIFO */
            
            #define	BAUD		9600
            #define Next_Line	0
            #define End_Line	1
            
            typedef struct {
            	uint8_t	wi, ri, ct;
            	uint8_t buff[64];
            } FIFO;
            static
            volatile FIFO TxFifo, RxFifo;
            
            
            
            
            void PRINTF(const char *str,char m)
            {
            	while (*str!=0x00)
            	{
            		uart_put(*str++);
            	}
            	if(m==End_Line) uart_put(13),uart_put(10);
            }
            
            void PRINTS(char *str,char m)
            {
            	while (*str!=0x00)
            	{
            		uart_put(*str++);
            	}
            	if(m==End_Line) uart_put(13),uart_put(10);
            }
            
            void PRINTV(int val,char m)
            {
            	volatile char *str="";
            	itoa(val,str,20);
            	while (*str!=0x00)
            	{
            		uart_put(*str++);
            	}
            	if(m==End_Line) uart_put(13),uart_put(10);
            }
            
            /* Initialize UART */
            
            void uart_init (void)
            {
            	UCSR0B = 0;
            
            	PORTE |= _BV(1); DDRE |= _BV(1);	/* Set TXD as output */
            	DDRE &= ~_BV(0); PORTE &= ~_BV(0); 	/* Set RXD as input */
            
            	RxFifo.ct = 0; RxFifo.ri = 0; RxFifo.wi = 0;
            	TxFifo.ct = 0; TxFifo.ri = 0; TxFifo.wi = 0;
            
            	UBRR0L = F_CPU / BAUD / 16 - 1;
            	UCSR0B = _BV(RXEN0) | _BV(RXCIE0) | _BV(TXEN0);
            }
            
            
            /* Get a received character */
            
            uint8_t uart_test (void)
            {
            	return RxFifo.ct;
            }
            
            
            uint8_t uart_get (void)
            {
            	uint8_t d, i;
            
            
            	while (RxFifo.ct == 0) ;
            	i = RxFifo.ri;
            	d = RxFifo.buff[i];
            	cli();
            	RxFifo.ct--;
            	sei();
            	RxFifo.ri = (i + 1) % sizeof RxFifo.buff;
            
            	return d;
            }
            
            
            /* Put a character to transmit */
            
            void uart_put (uint8_t d)
            {
            	uint8_t i;
            
            
            	while (TxFifo.ct >= sizeof TxFifo.buff) ;
            	i = TxFifo.wi;
            	TxFifo.buff[i] = d;
            	cli();
            	TxFifo.ct++;
            	UCSR0B = _BV(RXEN0) | _BV(RXCIE0) | _BV(TXEN0) | _BV(UDRIE0);
            	sei();
            	TxFifo.wi = (i + 1) % sizeof TxFifo.buff;
            }
            
            
            /* UART RXC interrupt */
            
            ISR(USART0_RX_vect)
            {
            	uint8_t d, n, i;
            
            
            	d = UDR0;
            	n = RxFifo.ct;
            	if (n < sizeof RxFifo.buff) {
            		RxFifo.ct = ++n;
            		i = RxFifo.wi;
            		RxFifo.buff[i] = d;
            		RxFifo.wi = (i + 1) % sizeof RxFifo.buff;
            	}
            }
            
            
            /* UART UDRE interrupt */
            
            ISR(USART0_UDRE_vect)
            {
            	uint8_t n, i;
            
            
            	n = TxFifo.ct;
            	if (n) {
            		TxFifo.ct = --n;
            		i = TxFifo.ri;
            		UDR0 = TxFifo.buff[i];
            		TxFifo.ri = (i + 1) % sizeof TxFifo.buff;
            	}
            	if (n == 0) UCSR0B = _BV(RXEN0) | _BV(RXCIE0) | _BV(TXEN0);
            }

            دوست من این یه کتابخونه خیلی خوبه که خودم دستکاریش کردم
            سه تا تابع داره
            PRINTF(String,MODE)
            PRINTF(String,MODE)
            PRINTF(Number,MODE)

            اگر بجای MODE بنویسی Next_Line نمیره خط بعد و جلوی همون مینویسه
            و اگر بنویسی End_Line میره خط بعد
            فقط این 3 تابع رو من اضافه کردم
            امیدوارم به دردتون بخوره

            البته با AVR Studio هست
            انگار کسی استقبال نکرد ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
            دلا خو کن به تنهایی که از تنها بلا خیزد

            دیدگاه


              #7
              پاسخ : کتابخانه uart برای avrstudio و چند سوال

              سلام
              ممنون از راهنمایتون جناب رستمی و آقا نوید
              یه سوال دیگه
              من میخوام یه برنامه بنویسم مثلا بگم اگه مقدار ورودی که از uart میاد برایر "hello" بود فلان کار رو انجام بده.
              چطور باید این کار رو بکنم.
              یه سوال دیگه:
              حجم برنامه به نظرم یکم زیاد شده!!
              یه برنامه ساده نوشتم به نظرم حجمش یکم زیاده نسبت به بسکام که کار میکردم(اپتیمایز هم روی حالت Os قرار داره) :eek:
              اگه از دستور sprintf استفاده کنم که دیگه واویلا میشه!!
              یه برنامه ساده نوشتم که به یه متغیر اضافه کنه و بعد با دستور itoa تبدیل به رشته کردم فرستادم برای uart نتیجش این شد:
              کد:
              Device: atmega16
              		Program:   692 bytes (4.2% Full)
              		(.text + .data + .bootloader)
              		Data:     69 bytes (6.7% Full)
              		(.data + .bss + .noinit)

              دیدگاه


                #8
                پاسخ : کتابخانه uart برای avrstudio و چند سوال

                نوشته اصلی توسط M3R
                سلام
                ممنون از راهنمایتون جناب رستمی و آقا نوید
                یه سوال دیگه
                من میخوام یه برنامه بنویسم مثلا بگم اگه مقدار ورودی که از uart میاد برایر "hello" بود فلان کار رو انجام بده.
                چطور باید این کار رو بکنم.
                روش خود من به اینصورت هست که همیشه یک تابع به اسم uart_readline دارم که کارش خواندن یک خط از بافر دریافت پورت سریال هست. (همونطور که میدونید همیشه یک خط به n\ یا r\ ختم میشه)
                بعدش خط به خط از پورت سریال اطلاعات رو میخونم و کارهای مقایسه‌ای روش انجام میدم.

                ایدهٔ کلی شبیه همچین چیزی :
                کد PHP:
                char line[200];

                while(
                1){
                 if( 
                uart_readline(linesizeof(line)) == TRUE ){
                  if( 
                strstr(response, "hello") != NULL ){
                   
                // place your code here
                  
                }else if( strstr(response, "goodbye") != NULL ){
                   
                // place your code here
                  
                }
                 }



                و کد readline ی که من استفاده میکنم به اینصورت هست :
                کد PHP:
                int uart_readlinechar *strint lenght ){
                    
                unsigned int i;
                    
                int count=0;
                    
                // make a backup from str pointer
                    
                char *str;
                    
                    
                // Terminate string with null
                    
                *str 0;
                    
                    while(
                1){
                        
                // Read serial input buffer
                        
                uart_getc();
                        
                // break from while if no byte available
                        
                if( &ampUART_NO_DATA ) break;
                        
                        
                &= 0x00FF;
                        
                // check for ascii characters
                        
                if( >= 0x20 &&amp<= 0x7F ){
                            if( 
                count &ltlenght ){
                                
                lcd_putchar(i);
                                *
                str i;
                                
                str++; count++;
                                *
                str 0;
                            }
                        
                // check carriage return and line feed characters
                        
                }else if( == '\n' || i == '\r' ){
                            
                break;
                        }
                    }
                    
                    
                // Recover str pointer for check lenght of recieved line
                    
                str p;
                    if( 
                strlen(str) &gt)
                        return 
                TRUE;
                    else
                        return 
                FALSE;



                راه دوم هم که خیلی تمیزتزه استفاده از کتابخونهٔ cmdline موجود در avrlib هست.
                شکل کلی استفادش هم بصورت زیر هست (مثال کاملش در فایلهای avrlib موجود هست)
                کد PHP:
                int main(void){
                 
                // initialize cmdline system
                 
                cmdlineInit();

                 
                // direct cmdline output to uart (serial port)
                 
                cmdlineSetOutputFunc(uart_putc);

                 
                // add commands to the command database
                 
                cmdlineAddCommand("hello",        hello_function);
                 
                cmdlineAddCommand("goodbye",         goodbye_function);
                 
                // etc...

                 
                while(1){
                  
                // run the cmdline execution functions
                  
                cmdlineMainLoop();
                 }
                }

                //-----------------------
                void hello_function(void){
                 
                // Place your code here
                }

                //-----------------------
                void goodbye_function(void){
                 
                // Place your code here



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

                دیدگاه

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