اطلاعیه

Collapse
No announcement yet.

حتما باید این کد ها باشند ؟

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

    حتما باید این کد ها باشند ؟

    سلام دوستان
    آیا برای استفاده از وقفه سریال در کد ویژن حتما باید این کد ها باشند ؟ oo:
    کد:
    #ifndef RXB8
    #define RXB8 1
    #endif
    
    #ifndef TXB8
    #define TXB8 0
    #endif
    
    #ifndef UPE
    #define UPE 2
    #endif
    
    #ifndef DOR
    #define DOR 3
    #endif
    
    #ifndef FE
    #define FE 4
    #endif
    
    #ifndef UDRE
    #define UDRE 5
    #endif
    
    #ifndef RXC
    #define RXC 7
    #endif
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)
    #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];
    
    #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_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

    #2
    پاسخ : حتما باید ای کد ها باشند ؟

    حتما خیر اما باشه بهتره چون واسه خطا هاست
    فقط اینقدش کافیه

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;

    }
    Don't hesitate to ask any question ..

    دیدگاه


      #3
      پاسخ : حتما باید ای کد ها باشند ؟

      ممنون که جواب دادی .
      خب اگه نوشته نشن چه مشکلی ممکنه پیش بیاد ؟
      من کد زیر رو نوشتم اما فقط عدد 10 روی lcd نشون داده میشه . ( از یه میکرو دیگه کاراکتر a ارسال میشه.)
      کد:
      interrupt [USART_RXC] void usart_rx_isr(void)
      {
       unsigned char a[];
      char status,data;
      status=UCSRA;
      data=UDR;
      itoa(data,a);
      lcd_clear();
      lcd_puts(a);
      }

      دیدگاه


        #4
        پاسخ : حتما باید این کد ها باشند ؟

        سلام

        این یه مثال برای وقفه ی دریافت فقط تنظیمات پایه های lcd را انجام بده .

        کد:
        #include <mega16.h>
        #include <alcd.h>
        #include <stdio.h>
        
        char DATA[];
        
        interrupt [USART_RXC] void usart_rx_isr(void)
        {
        DATA[0]=UDR;
        }
        
        void main(void)
        {
        
        UCSRA=0x00;
        UCSRB=0x98;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x33;
        
        lcd_init(16);
        
        #asm("sei")
        
        while (1)
           {
        
           lcd_puts(DATA);
           lcd_gotoxy(0,0);
        
           }
        }
        باد می وزد ...
        میتوانی در مقابلش هم دیوار بسازی ، هم آسیاب بادی
        تصمیم با تو است ...

        دیدگاه


          #5
          پاسخ : حتما باید این کد ها باشند ؟

          آقا واقعا ممنون
          فقط اگه من بخوام یه عدد پنج رقمی مثل 12345 بفرستم 5 بار وارد وقفه میشه ؟ و هر بار یک عدد توی UDR ریخته میشه؟

          دیدگاه


            #6
            پاسخ : حتما باید این کد ها باشند ؟

            بله دقیقا
            شما یک آرایه داخل اینتراپتش بذار
            بعدindex آرایه رو هر بار یکی زیاد کن
            Don't hesitate to ask any question ..

            دیدگاه


              #7
              پاسخ : حتما باید این کد ها باشند ؟

              بازم ممنون .
              ولی برنامه بالا رو کامپایل و اجرا کردم ولی روی lcd چیزی نمیاد.

              دیدگاه


                #8
                پاسخ : حتما باید این کد ها باشند ؟

                برنامه دوستمون یک برنامه نمونه هست
                اولا نرخ ارسال رو چک کنید
                دوما پایه های lcd رو توی قسمت configure پروژه تعیین کنید
                قبل شروع حلقه یک پیام ثابت بنویسید ببینید اصلا نشون میده ؟
                Don't hesitate to ask any question ..

                دیدگاه


                  #9
                  پاسخ : حتما باید این کد ها باشند ؟

                  نوشته اصلی توسط m e h r d a d
                  بازم ممنون .
                  ولی برنامه بالا رو کامپایل و اجرا کردم ولی روی lcd چیزی نمیاد.
                  سلام کل برنامه و تنظیمات صحیح است و برای کریستال 8 و بادریت 9600 هست فقط پایه های lcd را در این قسمت انتخاب کن .

                  http://www.uploadax.com/images/89445476282330093430.png
                  باد می وزد ...
                  میتوانی در مقابلش هم دیوار بسازی ، هم آسیاب بادی
                  تصمیم با تو است ...

                  دیدگاه


                    #10
                    پاسخ : حتما باید این کد ها باشند ؟

                    تشکر.تشکر :wow: :wow:
                    ممنون
                    okشد.

                    دیدگاه


                      #11
                      پاسخ : حتما باید این کد ها باشند ؟

                      سلام .
                      دوستان چرا این کد کار نمیکنه ؟
                      کد:
                      interrupt [USART_RXC] void usart_rx_isr(void)
                      {
                      
                      s=UDR;
                      
                      
                      if(s=="AٍٍE"){
                      PORTC.0=1;
                      }
                      
                      if(s=="BC"){
                      PORTC.0=0;
                      }
                      UDR=s;
                      }

                      میخوام اگه از پورت سریال A دریافت شد یه LED روشن و اگه B دریافت شد خاموش بشه .

                      ممنون.

                      دیدگاه


                        #12
                        پاسخ : حتما باید این کد ها باشند ؟

                        متغیر s چیه ؟ کاراکتره ؟
                        اگه کاراکتره
                        if(s=="AٍٍE&quot{
                        یعنی چی ؟
                        Don't hesitate to ask any question ..

                        دیدگاه


                          #13
                          پاسخ : حتما باید این کد ها باشند ؟

                          بله مهندس کاراکتره ولی نتونستم با آرایه که شما فرمودید کار کنم . :cry2:

                          کد زیر رو نوشتم(برای تبدیل کاراکتر ها به رشته) ولی موقع ارسال اصلا معلوم نیست که چی ارسال میکنه !
                          کد:
                          interrupt [USART_RXC] void usart_rx_isr(void)
                          {
                          m++;
                          s=getchar();
                          k[m]=s;
                          if(m==2){
                          m=0;
                          puts(k);
                          
                          
                          }

                          وقتی کد زیر رو هم می نویسم موقع کامپایل ارور می گیره :
                          کد:
                          interrupt [USART_RXC] void usart_rx_isr(void)
                          {
                          m++;
                          s=UDR;
                          k[m]=s;
                          
                          
                          if(k=="AE"){
                          PORTC.0=1;
                          }
                          
                          
                          if(k=="BC"){
                          PORTC.0=0;
                          }
                          
                          
                          if(m==4){
                          for(m=0;m<4;m++){
                          s=k[m];
                          UDR=s;
                          }
                          
                          m=0;
                          
                          }
                          
                          }


                          متن ارور :
                          کد:
                          Error: D:\avr_prj\595\relay.c(52): operand types 'unsigned char [1]' and 'flash unsigned char [3]' are incompatible with the '==' operator

                          دیدگاه


                            #14
                            پاسخ : حتما باید این کد ها باشند ؟

                            شما نمیتونید یک رشته رو با علامت متساوی مقایسه کنید
                            یا باید تک تک بایت ها رو مقایسه کنید یا باید از تابع strcmp استفاده کنید
                            دوما شما توی زیر برنامه وقفه سریال که نباید getchar () بذارید !!!
                            اگه دقت کرده باشید باید رجیستر UDR رو به متغیر نسبت بدید
                            Don't hesitate to ask any question ..

                            دیدگاه


                              #15
                              پاسخ : حتما باید این کد ها باشند ؟

                              شما نمیتونید یک رشته رو با علامت متساوی مقایسه کنید
                              یا باید تک تک بایت ها رو مقایسه کنید یا باید از تابع strcmp استفاده کنید
                              دوما شما توی زیر برنامه وقفه سریال که نباید getchar () بذارید !!!
                              اگه دقت کرده باشید باید رجیستر UDR رو به متغیر نسبت بدید
                              خیلی ممنون
                              خب برنامه دوم از getchar() استفاده نکرده و در قسمتی که برای ارسال هست (در برنامه دوم ) رشته k به صورت بایت به بایت ارسال میشه ولی در خروجی چیزهای عجیب و غریب میاد : "!@$^

                              دیدگاه

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