اطلاعیه

Collapse
No announcement yet.

آموزش زبان سی

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

    پاسخ : آموزش زبان سی

    interrupt [10] void timer0_ovf_isr(void)
    این عدد 10 داخل کروشه که به جای TIM0_OVF قرار دادین نقشش چیه.

    اگر شاد بودی آرام بخند تا غم بیدار نشود

    دیدگاه


      پاسخ : آموزش زبان سی

      نوشته اصلی توسط Ghasede del
      این عدد 10 داخل کروشه که به جای TIM0_OVF قرار دادین نقشش چیه.
      اون شماره ی بردار وقفه است که میتوان به جایش اسم بردار وقفه را نیز نوشت
      مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

      دیدگاه


        پاسخ : آموزش زبان سی

        نوشته اصلی توسط حامد پور آزاد
        دستورا رو کجای کد نوشتی؟
        بعد includ ها
        مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

        دیدگاه


          پاسخ : آموزش زبان سی

          اون شماره ی بردار وقفه است که میتوان به جایش اسم بردار وقفه را نیز نوشت
          کارکر خاصی داره؟
          مثلآ بعد از دهمین وقفه تایمر صفر بردار وقفه اجرا میشه؟
          یا اینکه برای تایمر صفر چندین بردار میشه تعریف کرد با شماره های مختلف؟
          میشه یکم توضیح بدین.
          ممنون

          اگر شاد بودی آرام بخند تا غم بیدار نشود

          دیدگاه


            پاسخ : آموزش زبان سی

            نوشته اصلی توسط Ghasede del
            کارکر خاصی داره؟
            مثلآ بعد از دهمین وقفه تایمر صفر بردار وقفه اجرا میشه؟
            یا اینکه برای تایمر صفر چندین بردار میشه تعریف کرد با شماره های مختلف؟
            میشه یکم توضیح بدین.
            ممنون
            فکر نکنم کارکرد خاصی داشته باشه
            چون که بخشی از تعریف روتین وقفه است که به شکل زیر است
            روتین سرویس وقفه ها در کدویژن به صورت زیر تعریف میشود که خود شما از من هم بهتر میدانید
            (void) نام سرویس وقفه void [شماره ی بردار وقفه ] Interrupt
            }
            برنامه سرویس وقفه
            {

            شماره بردار وقفه بر اساس جدول بردار وقفه بدست می آید و حالا شما می توانید به جای ان از اسم بردار وقفه نیز استفاده کرد :مثال :شماره وقفه صفر 2 است یا می توان آنرا بصورت EXT_INT0 نوشت
            به همین راحتی
            پس فکر نکنم کارکرد خاصی داشته باشد فقط نوع تعرف تغییر کرده است
            مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

            دیدگاه


              پاسخ : آموزش زبان سی

              طریقه نوشتن کتابخونه تو کد ویژنم میگید
              خیلی گیریم

              دیدگاه


                پاسخ : آموزش زبان سی

                نوشته اصلی توسط Nakh0d4
                طریقه نوشتن کتابخونه تو کد ویژنم میگید
                خیلی گیریم
                آخ که اگه اینو دوستان زحمتشو بکشند ما هم یاد بگیریم خیلی عالی میشه :applause:
                بالاخره دوستان متوجه مشکل مدار من نشدند خیلی روش فکر کردم به نتیجه نرسسیدم
                مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

                دیدگاه


                  پاسخ : آموزش زبان سی

                  من برای تست از کد ویزارد استفاده کردم وقه تایمر 0 رو تنظیم کردم و در بردار وقفه یک پین از پورت رو تاگل کردم
                  بخوبی جواب داد تنظیمات رو شما دستی انجام دادین؟

                  اگر شاد بودی آرام بخند تا غم بیدار نشود

                  دیدگاه


                    پاسخ : آموزش زبان سی

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

                    خوب کتابخونه ها به دو صورت هستند ، سورس باز و بسته ، سورس باز مثله چیزی که مورد بحث ماست و سورس بسته مثل کتابخونه هایی که همراه کدویژن ارائه میشن ، مثل کتابخونه LCD کاراکتری و گرافیکی ، SPI , MMC ,... این کتابخونه ها فقط قابل استفاده تو کامپایلر خودشون هستن چون فایل سورسشون در دسترس نیست و برای استفاده از اون ها هم باید در ابتدای برنامه فایل هدرشون به برنامه با دستور INCLUDE الصاق بشه .

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

                    خوب حالا چیزی که تو فایل سورس نوشته میشه ، تو فایل سورس تمام توابعی و ماکرو ها که میخاییم به صورت یه کتابخونه جمع آوری کنیم نوشته میشن .

                    فایل هدر ، تو این فایل پروتوتایپ تمام توابعی که تو فایل سورس نوشته شدن رو مینویسیم . بعلاوه یکسری دیفاین هایی که احتمالا تو فایل سورس به صورت ماکرو استفاده شدند و باید متناسب با نوع کار و یا مقصد و یا میکرویی که باهاش کار میکنیم تعریف بشن .


                    پس باید دو تا فایل ایجاد کنید ،و با یک اسم و با دو پسوند یکی c. و اون یکی رو با پسوند h. ذخیره کنید .

                    به عناون مثال modbus.c , modbus.h .

                    خوب اول باید توابع و ماکرو ها مون رو تو فایل سورس بنویسیم و البته در ابتدای اون باید فایل هدر رو هم اینکلود کنیم ، به عنوان مثال این فایل سورس کتابخنوه modbus هست که جناب رستمی نوشتند :

                    کد:
                    //*****************************************************************************
                    //
                    // File Name	: 'modbus.c'
                    // Title		: modbus over serial line
                    // Author		: Hamid Rostami
                    //
                    // This code is distributed under the GNU Public License
                    //		which can be found at http://www.gnu.org/licenses/gpl.txt
                    
                    #include "modbus.h"
                    
                    const unsigned int POLYNUMERIC = 0xA001;
                    
                    void modbusInit(unsigned int baudrate){
                    	uartInit();
                    	uartSetBaudRate(baudrate);
                    
                    	MODBUS_DIRECTION_DDR |= 1 << MODBUS_DIRECTION_BIT;
                    }
                    
                    
                    int modbus_WriteSingleRegister(unsigned int slaveAddr, unsigned int registerAddr, unsigned int value){
                    	unsigned char PDU[7];
                    	unsigned int CRC = 0xFFFF;
                    	int i, j;
                    	
                    	PDU[0] = slaveAddr;							// Slave Address
                    	PDU[1] = 0x06;								// Function Code
                    	
                    	PDU[2] = (registerAddr & 0xFF00) >> 8;		// Register Address High Byte
                    	PDU[3] = registerAddr & 0x00FF;				// Register Address Low Byte
                    	
                    	PDU[4] = (value & 0xFF00) >> 8;				// Value High Byte
                    	PDU[5] = value & 0x00FF;					// Value Low Byte
                    	
                    	// Generate CRC16
                    	for(i=0; i<=5; i++){
                    		CRC ^= PDU[i];
                    		for( j=0; j<=7; j++){
                    			if( CRC & 1 ){
                    				CRC >>= 1;
                    				CRC ^= POLYNUMERIC;
                    			}else{
                    				CRC >>= 1;
                    			}
                    		}
                    	}
                    	
                    	PDU[6] = CRC & 0x00FF;						// CRC Low Byte
                    	PDU[7] = (CRC & 0xFF00) >> 8;				// CRC High Byte
                    	
                    	// Send PDU
                    	MODBUS_SEND_ENABLE;
                    	
                    	
                    	
                    	for(i=0; i<=7; i++){
                    		uartSendByte(PDU[i]);
                    	}
                    	return 0;
                    	
                    	/*
                    	// Recieve PDU
                    	PDU[0] = uartGetByte();
                    	
                    	if( PDU[0] != 
                    	for(i=0; i<=7; i++){
                    	
                    	}
                    	*/
                    	return 0;
                    }
                    
                    int modbus_ReadSingleRegister(unsigned int slaveAddr, unsigned int registerAddr, unsigned int *buff, unsigned int count){
                    	unsigned int PDU[7];
                    	unsigned int CRC=0xFFFF;
                    	int i, j;
                    	
                    	PDU[0] = slaveAddr;							// Slave Address
                    	PDU[1] = 0x04;								// Function Code
                    	PDU[2] = registerAddr & 0x00FF;				// Register Address High Byte
                    	PDU[3] = (registerAddr & 0xFF00) >> 8;		// Register Address Low Byte
                    	PDU[4] = count & 0x00FF;					// Value High Byte
                    	PDU[5] = count & 0x00FF;					// Value Low Byte
                    	
                    	// Generate CRC16
                    	for(i=0; i<=5; i++){
                    		CRC ^= PDU[i];
                    		for( j=0; j<=7; j++){
                    			if( CRC & 1 ){
                    				CRC >>= 1;
                    				CRC ^= POLYNUMERIC;
                    			}else{
                    				CRC >>= 1;
                    			}
                    		}
                    	}
                    	
                    	//CRC16 = crc16(PDU, 6);
                    	PDU[6] = CRC & 0x00FF;					// CRC High Byte
                    	PDU[7] = CRC & 0x00FF;					// CRC Low Byte
                    	
                    	// Send PDU
                    	MODBUS_SEND_ENABLE;
                    	for(i=0; i<=7; i++){
                    		uartSendByte(PDU[i]);
                    	}
                    	
                    	return TRUE;
                    }


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

                    نقل قول از استاد کی نژاد :
                    با توجه به امکان چند بار include شدن یک فایل header، از طریق نوشتن ifndef# در ابتدای فایل، در پروسه کامپایل و لینک فقط یکبار این فایل در مجموعه کدها لحاظ می شود. عبارتی هم که تعریف آن مورد بررسی قرار می گیرد می تواند هر اسم دلخواه را داشته باشد که در نامگذاری های فایل های کامپایلر، از نام های خاصی استفاده می شود که برای کامپایلر شناخته شده و دارای معنای مشخص هستند و این اسامی در بسیاری مواقع مطابق تعاریف کامپایلر بین __ __ قرار داده می شوند.
                    اما اگر خود شما قصد ساخت یک کتابخانه را دارید می توانید از نام مورد نظر خود (که بهتر است با حروف بزرگ و هم نام با فایل header باشد) استفاده کنید. مثلا:
                    #ifndef MY_HEADER_H
                    #define MY_HEADER_H
                    header بدنه فایل
                    #endif

                    در هنگام کامپایل اگر برای اولین بار باشد که این فایل include شده باشد، هنوز MY_HEADER_H تعریف نشده است. بنابراین وارد بدنه فایل می شود. اما اگر این فایل در فایل های دیگر include شده باشد، در ادامه کار کامپایل و لینک و بارهای بعدی به دلیل اینکه این عبارت یکبار تعریف شده، وارد کامپایل محتویات فایل نمی شود.

                    اتمام نقل قول .

                    پس به عنوان مثال میاییم در ابتدای فایل هدر کتابخونه modbus این مورد رو لحاظ و بعد از اون احتمالا اگه برای اینکه سورمون بتونه کامپایل بشه نیاز به کتابخونه های دیگه داشته باشه میاییم هدر اون ها رو در ابتدای برنامه اینکلود میکنیم و بعد دیفاین ها و بعد هم پروتوتایپ ها رو مینویسیم به این شکل :


                    کد:
                    ///*****************************************************************************
                    //
                    // File Name	: 'modbus.h'
                    // Title		: modbus over serial line
                    // Author		: Hamid Rostami
                    //
                    // This code is distributed under the GNU Public License
                    //		which can be found at http://www.gnu.org/licenses/gpl.txt
                    
                    #ifndef MODBUS
                    #define MODBUS
                    
                    #include "uart.h"
                    #include <avr/io.h>
                    
                    // Not used yet ----------------------------
                    #define MODBUS_DIRECTION_PORT		 	PORTA
                    #define MODBUS_DIRECTION_DDR 			DDRA
                    #define MODBUS_DIRECTION_BIT 			3
                    
                    #define MODBUS_SEND_ENABLE 				MODBUS_DIRECTION_PORT |= 1<<MODBUS_DIRECTION_BIT
                    #define MODBUS_RECIEVE_ENABLE 			MODBUS_DIRECTION_PORT &= ~(1<<MODBUS_DIRECTION_BIT)
                    // -----------------------------------------
                    
                    // Initial modbus
                    void modbusInit(unsigned int baudrate);
                    
                    // Write single register
                    int modbus_WriteSingleRegister(unsigned int slaveAddr, unsigned int registerAddr, unsigned int value);
                    
                    // Read single Register (not work yet !)
                    int modbus_ReadSingleRegister(unsigned int slaveAddr, unsigned int registerAddr, unsigned int *buff, unsigned int count);
                    
                    
                    #endif


                    خوب یه چیزی که تو همین دو تا فایل به چشم میاد اینه که بعضی فایل ها داخل <> و بعضی فایل ها داخل " " اینکلود شدن .

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

                    مورد دوم رو زمانی استفاده میکنیم که میخواهیم فایل هدر رو از دایرکتوری و یا ساب دایرکتوری پروژه جاری مون اینکلود کنیم .

                    و یه مورد دیگه این کتابخونه که الان فایل هاش رو گزاشتم برای کامپایلر winavr نوشته شده اما چون سینتکس منحصر بفردی توش استفاده نشده میشه اون رو تو کدویژن هم استفاده کرد ، فقط باید در اتدای فایل هدر بجای اینکلود کردن :

                    کد:
                    #include <avr/io.h>


                    باید فایل هدر مربوط به رجیستر های i/o مختص کامپایلر کدویژن و میکرو مورد نظر اینکلود بشن ، مثلا mega2561 :


                    کد:
                    #include <mega2561.h>


                    خوب حالا برای اینکه بتونیم از این کتابونه تو پرژمون استفاده کنیم باید ابتدا این دو فایل سورس و هدری که ساختیم رو تو دایرکتوری پروژه امون به صورت مستقیم یا ساب دایرکتوری کپی کنیم ، فرض کنید که فعلا به صورت مستقیم تو همون دایرکتوری جاری پروژه کپی کردیم .

                    حالا باید به ترتیب زیر فایل سورس رو به فایل های پروژه امون اضافه کنیم تا کامپایلر موقع کامپایل بتونه سورس کتابخونه رو پیدا کنه و اون رو کامپایل و به برنامه اصلی لینک کنه .

                    pic2

                    pic3

                    pic4


                    و بعد باید فایل هدر این کتابخونه رو در ابتدای فایل سورس اصلی پرژه اینکلود کنیم به این شکل :


                    کد:
                    #include "modbus.h"


                    البته چون خود کتابخونه modbus نیاز به یه کتابخونه دیگه یعنی کتابخونه uart ، هنوز نمیشه از این کتابخونه استفاده کرد و باید فایل های سورس و هدر مربوط به کتابخونه uart هم به پروژه اضافه و اینکلود بشن ، این رو فقط به جهت مثال گفتم تا بهتر متوجه بشید .

                    دیدگاه


                      پاسخ : آموزش زبان سی

                      نوشته اصلی توسط Ghasede del
                      من برای تست از کد ویزارد استفاده کردم وقه تایمر 0 رو تنظیم کردم و در بردار وقفه یک پین از پورت رو تاگل کردم
                      بخوبی جواب داد تنظیمات رو شما دستی انجام دادین؟
                      من چیزی از تنظیمات کدویژن نمیدونم تنظیمات خاصی هم انجام نداده ام فقط فقط فرکانس و آی سیشو درست کردم . هنوز تازه دارم کار می کنم نمیشه برنامه ای رو که شما جواب گرفتین اینجا بزارید
                      مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

                      دیدگاه


                        پاسخ : آموزش زبان سی

                        من چیزی از تنظیمات کدویژن نمیدونم تنظیمات خاصی هم انجام نداده ام فقط فقط فرکانس و آی سیشو درست کردم . هنوز تازه دارم کار می کنم نمیشه برنامه ای رو که شما جواب گرفتین اینجا بزارید
                        منم اولین بارم بود اینکارو کردم خیلی کار باهاش راحته.
                        برنامه رو کلی بال و پر بهش دادم یکم پیچیده شد
                        الان دوباره انجام میدم میزارم

                        اگر شاد بودی آرام بخند تا غم بیدار نشود

                        دیدگاه


                          پاسخ : آموزش زبان سی

                          http://uploadkon.ir/uploads/7ec230319ce4f332be317bcd532bd2b4.rar

                          اگر شاد بودی آرام بخند تا غم بیدار نشود

                          دیدگاه


                            پاسخ : آموزش زبان سی

                            نوشته اصلی توسط Ghasede del
                            http://uploadkon.ir/uploads/7ec230319ce4f332be317bcd532bd2b4.rar
                            با سپاس از زحمتتون
                            ولی این برنامه دیگه نمیدونم چرا حتی توی پروتئوس هم خطا میده
                            مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

                            دیدگاه


                              پاسخ : آموزش زبان سی

                              با سپاس از زحمتتون
                              ولی این برنامه دیگه نمیدونم چرا حتی توی پروتئوس هم خطا میده
                              DDRC رو برابر 0x30 قرار بدین الان تستش کردم داره کار میکنه.

                              اگر شاد بودی آرام بخند تا غم بیدار نشود

                              دیدگاه


                                پاسخ : آموزش زبان سی

                                نوشته اصلی توسط Ghasede del
                                DDRC رو برابر 0x30 قرار بدین الان تستش کردم داره کار میکنه.
                                سلام
                                برنامه ی من زمان یک ثانیه رو تنظیم کرده ام که هر یک ثانیه وقفه رخ دهد ولی کار نمی کند و توی برنامه پورت سی نداریم پس چرا باید اونو برابر با 30 کنم :question:

                                توی برنامه ی شما تغییر دادم ولی کار نکرد و برنامه ی شما با برنامه ی من کلی تغییر کرده
                                والا دیگه نمیدونم چیکار کنم اصلا بیخیال :biggrin:
                                مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

                                دیدگاه

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