اطلاعیه

Collapse
No announcement yet.

راه اندازی ATmega8A با کریستال خارجی برای UART

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

    پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART

    نوشته اصلی توسط punisher.x64
    مثلا واسه رشته های 8تایی که فرقی نداره...درست میگم؟

    حالا اگه بخوایم با وقفه ارسال کنیم باید از وقفه UDRE استفاده کنیم دیگه...درسته؟
    فقط تنها مشکلی که دارم اینه که از تابع Puts که شما تعریف کردید استفاده کنم و اشاره گر به ورودی تابهه رو بفرستم به زیرروال وقفه....
    به نظرتون چطور اینکارو بکنم؟
    وقفه UDRE موقعی ایجاد میشه که UART آماده ارسال هست (بجای استفاده از while در تابع putchar)
    حالا ارسالش را میتونی با اشاره گر بنویسی و هم با بافر، هرجور دوست داری
    ولی برای 8 بایت به این کارها نیازی نیست ارسالش اینقدر طول نمیکشه.


    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

    دیدگاه


      پاسخ : پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART

      نوشته اصلی توسط Abbas Sarami
      وقفه UDRE موقعی ایجاد میشه که UART آماده ارسال هست (بجای استفاده از while در تابع putchar)
      حالا ارسالش را میتونی با اشاره گر بنویسی و هم با بافر، هرجور دوست داری
      ولی برای 8 بایت به این کارها نیازی نیست ارسالش اینقدر طول نمیکشه.
      بله متوجه شدم...سپاس فراوان...
      فقط یه مسئله دیگه :
      اگه بخوام از تابع _Puts() استفاده کنم چطور میتونم اشاره گر که وارد اون میشه رو به زیر روال وقفه بفرستم؟
      یعنی توی
      کد:
      if (!(_UART_BUFFER[_UART_COUNTER]))
      به جای _UART_BUFFER از اون اشاره گر که ورودی تابع _Puts هست استفاده کنم...
      میشه همچین کاری کرد؟
      تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

      www.intelart.ir


      ساخت کنترلر دما PID فازي با AVR [آموزشی]

      دیدگاه


        پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART

        کپی از این آموزش ها با ذکر منبع مجاز است
        بهتر نبود توی یک تاپیک دیگه مینوشتی که دسترسی کاربران راحت تر باشه؟؟؟

        کد:
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <util/delay.h>
        #include <string.h> /*For memcpy*/
        
        #define BaudRate(x) {UBRRH=(unsigned char)(((F_CPU/(16UL*(x)))-1)>>8); UBRRL = (unsigned char)(F_CPU/(16UL*(x)))-1;}
        
        char RX_buff[10];
        char TX_buff[10];
        volatile unsigned char RX_index=0 , TX_index=0;
        
        ISR(USART_TXC_vect)
        {
        if(TX_index < sizeof(TX_buff))	UDR=TX_buff[TX_index++];
        }
        
        ISR(USART_RXC_vect)
        {
        char st,dt;
        st=UCSRA;
        dt=UDR;
        if(!(st & (_BV(FE) | _BV(PE) | _BV(DOR)))) // Check data
        {
        RX_buff[RX_index++] = dt;
        }
        }
        
        void Start_Send(void)
        {
        TX_index=0;
        UDR = TX_buff[TX_index++];
        }
        
        void _putchar(char c)
        {
        while ((UCSRA & _BV(UDRE))==0);
        UDR=c;
        }
        
        void _puts(char *str)
        {
        while(*str) _putchar(*str++);
        }
        
        int main(void)
        {
        
        	UCSRA=0;
        	UCSRB=_BV(RXEN) |_BV(RXCIE) | _BV(TXEN) | _BV(TXCIE); // TX and RX = enable and RX and TX ISR = enable
        	UCSRC=_BV(URSEL)|_BV(UCSZ1) | _BV(UCSZ0); // 8bit Mode
        	BaudRate(2400UL);
        
        	RX_index=0;
        	sei();
        	
        	TX_buff[0]='T';TX_buff[1]='E';TX_buff[2]='S';TX_buff[3]='T';TX_buff[4]='\r';
        	Start_Send();
        		
          while(1)
          {
        
        	if(RX_index == sizeof(RX_buff))
        	{
        		RX_index =0;
        		memcpy(&TX_buff,&RX_buff,sizeof(TX_buff));// Copy from Rx_buff to TX_buff
        		Start_Send();
        	}
         
          }
        }
        [glow=red,2,300]اگه همزمان از وقفه ارسال دریافت استفاده میکنی از وقفه UDRE استفاده نکن [/glow]
        مثال بالا کاملاً واضحه مثل همون مثال قبلی هست
        اگه سوال داشتی بپرس

        موفق باشید
        امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

        دیدگاه


          پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART

          نوشته اصلی توسط Abbas Sarami
          کپی از این آموزش ها با ذکر منبع مجاز است
          بهتر نبود توی یک تاپیک دیگه مینوشتی که دسترسی کاربران راحت تر باشه؟؟؟

          کد:
          #include <avr/io.h>
          #include <avr/interrupt.h>
          #include <util/delay.h>
          #include <string.h> /*For memcpy*/
          
          #define BaudRate(x) {UBRRH=(unsigned char)(((F_CPU/(16UL*(x)))-1)>>8); UBRRL = (unsigned char)(F_CPU/(16UL*(x)))-1;}
          
          char RX_buff[10];
          char TX_buff[10];
          volatile unsigned char RX_index=0 , TX_index=0;
          
          ISR(USART_TXC_vect)
          {
          if(TX_index < sizeof(TX_buff))	UDR=TX_buff[TX_index++];
          }
          
          ISR(USART_RXC_vect)
          {
          char st,dt;
          st=UCSRA;
          dt=UDR;
          if(!(st & (_BV(FE) | _BV(PE) | _BV(DOR)))) // Check data
          {
          RX_buff[RX_index++] = dt;
          }
          }
          
          void Start_Send(void)
          {
          TX_index=0;
          UDR = TX_buff[TX_index++];
          }
          
          void _putchar(char c)
          {
          while ((UCSRA & _BV(UDRE))==0);
          UDR=c;
          }
          
          void _puts(char *str)
          {
          while(*str) _putchar(*str++);
          }
          
          int main(void)
          {
          
          	UCSRA=0;
          	UCSRB=_BV(RXEN) |_BV(RXCIE) | _BV(TXEN) | _BV(TXCIE); // TX and RX = enable and RX and TX ISR = enable
          	UCSRC=_BV(URSEL)|_BV(UCSZ1) | _BV(UCSZ0); // 8bit Mode
          	BaudRate(2400UL);
          
          	RX_index=0;
          	sei();
          	
          	TX_buff[0]='T';TX_buff[1]='E';TX_buff[2]='S';TX_buff[3]='T';TX_buff[4]='\r';
          	Start_Send();
          		
            while(1)
            {
          
          	if(RX_index == sizeof(RX_buff))
          	{
          		RX_index =0;
          		memcpy(&TX_buff,&RX_buff,sizeof(TX_buff));// Copy from Rx_buff to TX_buff
          		Start_Send();
          	}
           
            }
          }
          [glow=red,2,300]اگه همزمان از وقفه ارسال دریافت استفاده میکنی از وقفه UDRE استفاده نکن [/glow]
          مثال بالا کاملاً واضحه مثل همون مثال قبلی هست
          اگه سوال داشتی بپرس

          موفق باشید
          آمدی جانم به قربانت ولی حالا چرا؟
          نشستم خودم یه کتابخونه نوشتم! :angry:
          کلا با اینتراپت کار میکنه میتونه یه رشته از فلش هم بخونه و نشون بده که البته خوندن از فلش رو با سرکشی انجام میده....(دیگه حوصله کار کردن با اینتراپتش رو نداشتم!)
          از وقفه خالی بودن و دریافت استفاده کردم و میتونه واسه ارسال کننده در دو مد بافر دار و بدون بافر کار کنه...در حالتی که بافر داره اگه در هنگام ارسال رشته دوباره یک یا چند کاراکتر دیگه فرستاده بشه اون ها رو داخل یه بافر که اندازه ش رو هم کاربر تعیین میکنه نگه میداره تا وقتی که کار ارسال رشته فعلی تموم بشه و بعدش اون کاراکتر ها رو یکی یکی ارسال میکنه...
          به نظرم بدک نیست ولی هنوز جای کار داره...
          تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

          www.intelart.ir


          ساخت کنترلر دما PID فازي با AVR [آموزشی]

          دیدگاه


            پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART

            عرض سلام خدمت دوستان بنده یه ماژول 4 رله سیم 900 دارم که طراحی بردش قدیمی هستش . شرکت سازنده نداره و یکی از دوستان برای یه کاری اینو طراحی کرده بودش فقط خود برد ماژول مال eca هستش . روی این برد یه میکرو mega8hv کنار ای سی ترمینالی داریم که به پایه های 23/28 متصل هستش . اینطور که دوستان و داخل سایت ها اشاره کردن این برد باید به کامپیوتر متصل بشه از طریق آر اس 232 یا برد تی تی ال بعد با هایپر ترمینال یا نرم افزار دیگه میکرو پروگرام بشه ! از اونجایی که بنده آشنایی در زمینه کد و ای وی آر ندارم سوالم این بود که آیا این ترمینال مربوط به اتصال میکرو به کامپیوتر هستش یا نه و این که چطور میتونم یه اصلاحی داخل این میکرو انجام بدم . شماره موبایل و رمز عبور برای خاموش روشن کردن رله ها رو باید عوض کنم . ممنون از توجه عزیزان

            دیدگاه


              پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART

              دوست عزیز احتمالا براتون اشتباه توضیح دادن ، یا اشتباه برداشت کردید

              سیم ۹۰۰ و کلا جی اس ام مودمها با پروتکل سریال ارتباط برقرار میکنن ...
              بوسیله at command هم تنظیم میشن و غیره ( استاندارد تمام مودمهاست )

              مشکل شما ترمینال و uart و پروگرام کردن میکرو نیست ( میکروهای avr اصلا ساپورت پروگرام با پورت سریال فابریک ندارن ) هرچند مثلا میکرو بوتلودر سریال هم داشت باز ارتباطی به مشکل نمیتونست داشته باشه .

              شما یک فریمور روی این میکرو داری که توسط شخص یا شرکت خاصی برای کاربرد مشخصی برنامه ریزی شده .

              اگر دسترسی به منبعی که این برنامه رو نوشته نداری استفاده از این سیستم غیر ممکنه
              میکروکنترلر یک کامپیوتر کوچک جنرال هستش ... فریمور مشابه سیستم عامل و نرم افزارهای اجرایی این کامپیوتره .

              شما فایل فریمور رو هم میداشتید و با یک پروگرامر عادی avr به سادگی میتونستید این میکرو یا تعداد زیادی از این میکرو رو مطابق اون فریمور پروگرام می کردید مجددا سیستم پروگرام سده اتون میرسید به همین نقطه ای که الان هست .

              شما میخواهید شماره موبایل و پسوردی که توی فریمور اصلی نوشتن رو تغییر بدید .
              یا باید سورسهای کسی که فریمور رو نوشته داشته باشید .
              یا باید پروتکلی که طراح سیستم برای تغییر شماره موبایل و پسورد برای سیستم در نظر گرفته ( اگر چنین قابلیتی در نظر گرفته باشه ) رو بدونید .
              یا اینکه با مهندسی معکوس هگز فریمور رو توش بگردید رشته کاراکترهای مرتبط با شماره موبایل و پسورد و غیره رو پیدا کنید و تغییر بدید و مجددا میکرو رو پروگرام کنید ( اگر فایل هگزش رو دارید یا طراح سیستم امکان خوندن فلش میکرو رو باز گذاشته باشه که معمولا بعیده در تجهیزات امنیتی چنین اشتباهی بکنن )

              اگر طبق گفته خودتون آشنایی عمومی با میکرو ندارید انجام روند فوق براتون ممکن نیست .

              دیدگاه

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