امتیاز موضوع:
  • 5 رأی - میانگین امتیازات: 4.2
  • 1
  • 2
  • 3
  • 4
  • 5
شروعی دوباره برای میکروهای arm
نویسنده پیام
omid_phoenix آفلاین
مدیر بخش
*****

ارسال‌ها: 2,238
موضوع‌ها: 108
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 12682
( 15433 تشکر در 4574 ارسال )
ارسال: #12
RE: شروعی دوباره برای میکروهای arm
برنامه درست نیست، این و امتحان کنWink

کد:
#include "AT91SAM7X256.h"
#include "lib_AT91SAM7X256.h"
int main (){
int a ;
AT91F_PIO_CfgOutput( AT91C_BASE_PIOB, AT91C_PIO_PB19);
AT91F_PIO_GetInput ( AT91C_BASE_PIOB, AT91C_PIO_PB27);
AT91F_PIO_ClearOutput ( AT91C_BASE_PIOB, AT91C_PIO_PB19);
if (( AT91C_PIO_PB27) == 0)
{
AT91F_PIO_SetOutput ( AT91C_BASE_PIOB, AT91C_PIO_PB19);
}
}

۱۰-بهمن-۱۳۹۱, ۰۱:۲۲:۵۴
ارسال‌ها
پاسخ
تشکر شده توسط : hadikh73
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #13
RE: شروعی دوباره برای میکروهای arm
اين همون كدي هست كه اميد زده ، منتها در سطح ريجستر. امشب حس كاري نبود ، گفتم اينا رو بذارم ، شايد مفيد باشه.
كدها رو كامپايل نكردم ، اما بايد درست باشن Biggrin ( يه تستي بزنيد )
در خود كدها كمي توضيحات داده شده ، كه با توجه به توضيحات قبلي و توضيحات اميد نبايد مشكلي باشه.
و يه توضيح در مورد ريجسترهاي PIO براي sam7 :
در AVR يه ريجستر 8 بيتي داريم كه اگر هر كدوم از بيت هاش رو 0 و يا 1 كنيم ، به ترتيب پايه ي مربوطه كه جزء اون پورت مي شه 0 و يا 1 مي شه. اما در ARM اينطوري نيست!
يك ريجستر 32 بيتي به نام SODR هست ، كه هر كدوم از بيت هاش رو 1 كني ،‌ پايه ي مربوطه 1 مي شه. حالا اگر همون بيت رو 0 كني چي مي شه؟! جواب اينه : هيچي نمي شه ! و اون پايه همچنان 1 مي مونه!
حالا براي 0 كردن پايه بايد چكار كنيم ؟
يه ريجستر 32 بيتي ديگه هست به نام CODR ، بيت مربوط به پايه اي كه مي خواهيم 0 اش كنيم رو در اين ريجستر 1 مي كنيم!
جالبه، نه؟!
معمولا ريجسترهاي ARM ، سه تايي هستن. يه ريجستر 32 بيتي براي set كردن + يك ريجستر 32 بيتي براي Clear كردن كه هم اين و هم قبلي Write only هستند + يك ريجستر 32 بيتي كه وضعيت 0 و 1 بودن پايه ها رو نشون مي ده و Read only هست.
از اين ريجسترها براي PIO كلي دارهه ... ، كه 2تاي ديگه رو هم در ادامه مي گم.
كد اولي به روش بالاست.

همينطور كه ديديد مقدار دهيه اينطوري به ريجسترهاي PIO براي بعضي كاربردها اذيت مي كنه...
چه كنيم كه با 0 كردن بيت ، پايه ي مربوطه 0 و با 1 كردن اون بيت در همون ريجستر ، بيت مربوطه 1 بشه ؟
كافيه ريجستر OWER رو براي پايه هاي مورد نظر فعال كنيم. با اين كار اجازه ي همچين كاري رو داريم!
حالا با 0 و 1 كردن هر پايه در ريجستر ODSR ، پايه هاي مربوطه رو مي تونيم مستقيم 0 و 1 كنيم.
كد دوم هم به اين روش زده شدهه.

اسم ريجسترها خيلي خوب انتخاب شده و راحت مي شه يادشون گرفت :

SODR : Set Output Data Register
CODR : Clear Output Data Rigester
OWER : Output Write Enable Register
ODSR : Output Data Status Register

براي مقدار دهي ريجسترهاي واحد PMC از الگوي زير استفاده مي كنيم ، كه با اين كار داريم به آدرس مورد نظر از اين واحد اشاره مي كنيم.
کد php:
AT91C_BASE_PMC->PMC_XXX=0Xyy
اسم ريجستر مربوطه رو جاي XXX مي نويسيم.

براي مقدار دهي به PIO ها از الگوي زير استفاده مي كنيم، باز داريم اشاره مي كنيم. اين علامت " <- " كار اشاره رو انجام مي دهه ...
کد php:
AT91C_BASE_PIOA->PIO_XXX=0Xyy;
AT91C_BASE_PIOB->PIO_XXX=0Xyy
اسم ريجستر مربوطه رو جاي XXX مي نويسيم.

در كدهاي پايين به نحوه ي مقدار دهيه ريجستر ها كه به اين سبك هست دقت كنيد " x<<y " كه بسيار معروف و پر كاربرد هست. دقيقا بيت مورد نظر رو 0 يا 1 مي كنه و نيازي به MASK كردن بين هاي اون ريجستر و and و ... هم نيست !
در برنامه هاي واقعي و درست و حسابي قدرش رو خواهيد فهميد.

اين الگو ، x رو به تعداد y بار به سمت چپ شيفت مي ده ... .

اين كد1:
کد php:
#include <Atmel/ioat91sam7x256.h> 
#include <delay.h>

  // configuration as output
    
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PIOB); /* Enable Clk for PIOB
    PCER : Pio Clock Enable Register */
    // config following pins as PIO ; PER : Pio Enable Register
    
AT91C_BASE_PIOB->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
    
// Config following pins as output ; OER : Otput Enable Register
    
AT91C_BASE_PIOB->PIO_OER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
  
// End of configuration

  
int main(void)
 {
    while(
1)  // Infinite loop
    
{
      
AT91C_BASE_PIOB->PIO_CODR=0xaa// CODR : Clear Output Data Rigester
      
delay_ms(50);
      
AT91C_BASE_PIOB->PIO_SODR=0xaa// SODR : Set Output Data Register
      
delay_ms(50);
      
AT91C_BASE_PIOB->PIO_CODR=0x55;
      
delay_ms(50);
      
AT91C_BASE_PIOB->PIO_SODR=0x55;
      
delay_ms(50);
    }
 } 

اين كد2:
کد php:
#include <Atmel/ioat91sam7x256.h> 
#include <delay.h>
  
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PIOB);
  
AT91C_BASE_PIOB->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
  
AT91C_BASE_PIOB->PIO_OER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
    
// OWER : Output Write Enable Register
  
AT91C_BASE_PIOB->PIO_OWER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
  
int main(void)
 {
    while(
1)
    {
      
AT91C_BASE_PIOB->PIO_ODSR=0xaa// ODSR : Output Data Status Register
      
delay_ms(50);
      
AT91C_BASE_PIOB->PIO_ODSR=0x00// 0 -> 0  &  1 -> 1
      
delay_ms(50);
      
AT91C_BASE_PIOB->PIO_ODSR=0x55;
      
delay_ms(50);
      
AT91C_BASE_PIOB->PIO_ODSR=0x00;
      
delay_ms(50);
    }
 } 

اميدوارم با اين توضيحات تونسته باشم BackGround مناسبي براي ادامه بهتون داده باشم.

موفق باشيد.

۱۰-بهمن-۱۳۹۱, ۰۱:۳۲:۲۸
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, hadikh73, omid_phoenix
hadikh73 آفلاین
مدیــر کـل سایـت
*******

ارسال‌ها: 1,219
موضوع‌ها: 43
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 13641
( 14739 تشکر در 4686 ارسال )
ارسال: #14
RE: شروعی دوباره برای میکروهای arm
آقا مرتضی
نقل قول: معمولا ريجسترهاي ARM ، سه تايي هستن. يه ريجستر 32 بيتي براي set كردن + يك ريجستر 32 بيتي براي Clear كردن كه هم اين و هم قبلي Write only هستند + يك ريجستر 32 بيتي كه وضعيت 0 و 1 بودن پايه ها رو نشون مي ده و Read only هست.
اینجا اگر SODR رو یک کنیم پایه یک میشه درسته و بعدش CODR رو یک کنیم پایه صفر میشه رجیستر SODR رو هم باید صفر کنیم یا خودش میشه

نقل قول: SODR : Set Output Data Register
CODR : Clear Output Data Rigester
OWER : Output Write Enable Register
ODSR : Output Data Status Register
مگه نگفتین PIO سه تایین پس چرا شدن چهارتا

نقل قول: براي مقدار دهي ريجسترهاي واحد PMC از الگوي زير استفاده مي كنيم
PMC رو توضیح ندادین یکم توضیح بدین

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

اگر اشتباه نگفته باشم این (0>>1) یعنی پایه b.0 درسته

اینجا چطوری میشه یه پایه رو پول آپ کرد

(آخرین ویرایش در این ارسال: ۱۰-بهمن-۱۳۹۱, ۰۲:۱۴:۴۳، توسط hadikh73.)
۱۰-بهمن-۱۳۹۱, ۰۲:۱۲:۴۱
ارسال‌ها
پاسخ
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #15
RE: شروعی دوباره برای میکروهای arm
راستش یکم خجالت کشیدم همینطوری بشینم و کمکی نکنم.Shy

نقل قول: اینجا اگر SODR رو یک کنیم پایه یک میشه درسته و بعدش CODR رو یک کنیم پایه صفر میشه رجیستر SODR رو هم باید صفر کنیم یا خودش میشه
این یه مکانیزمی هست که در ادامه توضیح دادم....

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


نقل قول: مگه نگفتین PIO سه تایین پس چرا شدن چهارتا
sodr & codr & odsr این سه تا رو میشه عضو یه گروه در نظر گرفت

ower رو من برای اولین باره که دیدم....

نقل قول: PMC رو توضیح ندادین یکم توضیح بدین
ببینید...
میکرو اجزای زیادی که داره... در حالت عادی به این اجزا کلاک نمیره...
برای استفاده از هر قسمت مثل spi,twi,usb,PIO,... اول باید کلاک اون قسمت رو فعال کنید....

هر peripheral یه ID مشخص داره که دیتاشیت میکرو نوشته...(فکر کنم قسمت pmc هستش) البته این id ها رو هم میتونید از فایل هدر رجیستر های هر میکرو ( مثلا at91sam7s256.h ) بفهمید....
کد php:
PMC_PCER
// Peripheral Clock Enable Register


 
PMC_PCDR
// Peripheral Clock Disable Register


 
PMC_PCSR
// Peripheral Clock Status Register 


باز همونطور که میبینید این گروه هم 3 تایی هستش!!! disable, enable,status

مثلا اگر id رو داریم برای فعال کردن کلاک اینطوری مینویسیم:

کد php:
AT91C_BASE_PMC->PMC_PCER=1<<ID

دیگه نمی نویسیم :
کد php:
AT91C_BASE_PMC->PMC_PCER AT91C_BASE_PMC->PMC_PCER 1<<ID


چون 0 شدن بقیه ی بیت ها در رجیستر های ENABLE هیچ تاثیری نداره....
و اینجا می فهمیم که دیتاشیت واقعا راست میگه... 3 تایی بودن رجیستر ها کار برنامه نویس ها رو آسون کرده و همچنین سرعت برنامه رو بالا برده!!!


نقل قول: یه سوال دیگه برای استفاده از هر پایه باید کلاکش رو وصل کنیم چطوری

ببینید این ID ها مال SAM7X هه: (x512)

کد:
0 AIC Advanced Interrupt Controller FIQ
1 SYSC(1) System Controller
2 PIOA Parallel I/O Controller A
3 PIOB Parallel I/O Controller B
4 SPI0 Serial Peripheral Interface 0
5 SPI1 Serial Peripheral Interface 1
6 US0 USART 0
7 US1 USART 1
8 SSC Synchronous Serial Controller
9 TWI Two-wire Interface
10 PWMC Pulse Width Modulation Controller
11 UDP USB Device Port
12 TC0 Timer/Counter 0
13 TC1 Timer/Counter 1
14 TC2 Timer/Counter 2
15 CAN CAN Controller
16 EMAC Ethernet MAC
17 ADC(1) Analog-to Digital Converter
18 - 29 Reserved
30 AIC Advanced Interrupt Controller IRQ0
31 AIC Advanced Interrupt Controller IRQ1

اگر شما پایه ای از PIOB رو لازم دارید باید اول PMC اونو یعنی piob رو فعال کنید: ( پین ای که شما در نظر داری عضو pioa یا b هست... باید اول کلاک اون pioa یا b رو فعال کنی تا بتونی به اون پین دسترسی داشته باشی!! ...)

PCER = 1<<3

بعدا هر کاری که دوس داشتید با اون پایه انجام بدید....

هر پایه میتونه خروجی باشه... ورودی باشه .... یا به یه peripheral داخلی وصل شده باشه که ممکنه با peripheral هه دیگه ای مالتی پلکس شده باشه....

اونا رو هم فردا میگیم(البته اگر لازم بود‌:)‌ )

نقل قول: اگر اشتباه نگفته باشم این (0>>1) یعنی پایه b.0 درسته

آره درسته!

نقل قول: اینجا چطوری میشه یه پایه رو پول آپ کرد
ببینید هر چیزی به ذهنتون رسید... سعی کنید از منابعی که دارید جوابشو پیدا کنید....
همه ی رجیستر ها با comment اشون در فایل هدر هر میکرو هست...
مثلا اگه اونجا pull up یا pullup یا pull یا pull-up رو سرچ کنید... :

کد:
PIOA_PPUDR; // Pull-up Disable Register

PIOA_PPUER; // Pull-up Enable Register

PIOA_PPUSR; // Pull-up Status Register
میبینید که باز pullup سه تایی هست و برای هر pio یه رجیستر تعریف شده...
یعنی دقیقا همین 3 تا برای piob هم هست...
هر پایه ای که دوست دارید رو میتونید با enbale پول آپ کنید‍‍!!!
(آخرین ویرایش در این ارسال: ۱۰-بهمن-۱۳۹۱, ۰۳:۳۲:۴۱، توسط salehjg.)
۱۰-بهمن-۱۳۹۱, ۰۳:۲۶:۱۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hadikh73, sharin, omid_phoenix
hadikh73 آفلاین
مدیــر کـل سایـت
*******

ارسال‌ها: 1,219
موضوع‌ها: 43
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 13641
( 14739 تشکر در 4686 ارسال )
ارسال: #16
RE: شروعی دوباره برای میکروهای arm
ممنونClap
فقط اینجا گیجم کرد
(۰۴-بهمن-۱۳۹۱, ۲۱:۰۲:۴۷)sharin نوشته است:
کد php:
AT91C_BASE_PIOA->PIO_PER=(1<<0); 
پايه ي A.0 رو به صورت I/O تعريف مي كني.
(۱۰-بهمن-۱۳۹۱, ۰۳:۲۶:۱۷)salehjg نوشته است:
نقل قول: اگر اشتباه نگفته باشم این (0>>1) یعنی پایه b.0 درسته
آره درسته!
آقا مرتضی گفت (0>>1) یعنی A.0 آقا صالح گفت b.0
اصلا این عددا کجا پیدا میشن (تو دیتا شیتن یا نه
کد های ID آی سی x512 باx256 فرق دارن Whistle

۱۰-بهمن-۱۳۹۱, ۱۲:۱۰:۵۰
ارسال‌ها
پاسخ
omid_phoenix آفلاین
مدیر بخش
*****

ارسال‌ها: 2,238
موضوع‌ها: 108
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 12682
( 15433 تشکر در 4574 ارسال )
ارسال: #17
RE: شروعی دوباره برای میکروهای arm
مرتضی جون صالح جون ممنون
این رجیسترها واسه محیط iar ایجاد شدنSad
ما الان داریم با keil کار می کنیم که متاسفانه هیچ منبعی واسش پیدا نکردم
فقط یه کتاب گرفتم که اونم تو محیط iar کد زده
الان یه سوال؛
همین رجیسترها واسه keil هم است و با یه سری تغییر میشه تو keil به کار برد؟

کد:
AT91C_BASE_PIOA->PIO_PER=(1<<0);
میشه a.0 چون pioa تعریف کردیم

(آخرین ویرایش در این ارسال: ۱۰-بهمن-۱۳۹۱, ۱۲:۱۵:۵۴، توسط omid_phoenix.)
۱۰-بهمن-۱۳۹۱, ۱۲:۱۳:۳۳
ارسال‌ها
پاسخ
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #18
RE: شروعی دوباره برای میکروهای arm
خواهش

نقل قول: آقا مرتضی گفت (0>>1) یعنی A.0 آقا صالح گفت b.0
اصلا این عددا کجا پیدا میشن (تو دیتا شیتن یا نه
کد های ID آی سی x512 باx256 فرق دارن
ببینید 0>>1 هیچ ربطی به pioa بودن یا piob بودن نداره....
این یه عمل بیتی هست(شیفت به چپ) و جوابش به عدده...

اینکه pioa باشه یا piob بستگی به این داره که آدرس base کدوم pio رو انتخاب کردید....

AT91C_BASE_PIOA->PIO_PER=(1<<0);

بالایی یعنی پین اول یا pioA.0 از pioA

AT91C_BASE_PIOB->PIO_PER=(1<<0);
ولی این یعنی pioB.0

میبینید که تفاوت ها در اینجا فقط به آدرس بیس مربوطه!!



نقل قول: اصلا این عددا کجا پیدا میشن (تو دیتا شیتن یا نه
کد های ID آی سی x512 باx256 فرق دارن
id هیچ ربطی به شماره ی پین ها که با شیفت درست میکنیم، نداره!!!
کل pioa یا کل piob هر کدوم به صورت مجزا یه مجموعه هستن که یه ID به بخصوص دارن که میتونید از دیتاشیت یا فایل هدر اونا رو پیدا کنید!!


نقل قول: مرتضی جون صالح جون ممنون
این رجیسترها واسه محیط iar ایجاد شدن
ما الان داریم با keil کار می کنیم که متاسفانه هیچ منبعی واسش پیدا نکردم
فقط یه کتاب گرفتم که اونم تو محیط iar کد زده

من تاحالا با IAR کار نکردم... چون کرک و... دردسر داشت...

ولی تاجایی که شنیدم، انگار هدر فایل اصلی رجیستر ها در هر دو تاشون یکسانه!!!

لا اقل اسم رجیستر ها باید یکسان باشه !!
پس فرقی نمیکنه که کتاب شما برای iar کد زده باشه یا keil.....

کد php:
AT91C_BASE_PIOA->PIO_PER=(1<<0); 
همین کد بالا، چه تو iar (که تجربه ای ندارم) و چه تو keil (که من باهاش کار کردم) ، اصولا باید بدون مشکل کامپایل بشه!
(آخرین ویرایش در این ارسال: ۱۰-بهمن-۱۳۹۱, ۱۲:۳۸:۰۹، توسط salehjg.)
۱۰-بهمن-۱۳۹۱, ۱۲:۳۶:۴۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : omid_phoenix, hadikh73, sharin
hadikh73 آفلاین
مدیــر کـل سایـت
*******

ارسال‌ها: 1,219
موضوع‌ها: 43
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 13641
( 14739 تشکر در 4686 ارسال )
ارسال: #19
RE: شروعی دوباره برای میکروهای arm
نقل قول: مرتضی جون صالح جون ممنون
این رجیسترها واسه محیط iar ایجاد شدنSad
اگر مثل avr باشه فک کنم فرقی ندارن چون رجیستر ها یکسانن


یه برنامه نوشتم
کد:
#include <AT91SAM7X256.H>
#include <delay.h>
int main(void)
{
AT91C_BASE_PMC->PMC_PCER=2<<ID;
AT91C_BASE_PIOB->PIO_PER=(1<<19);
AT91C_BASE_PIOB->PIO_OER=(1<<19);
while(1){
AT91C_BASE_PIOB->PIO_CODR=(1<<19);
delay_s(1);
AT91C_BASE_PIOB->PIO_SODR=(1<<19);
delay_s(1);
};
}
ولی ارور میده تو خط 5 منم به جای
کد:
AT91C_BASE_PMC->PMC_PCER=2<<ID;
نوشتم
کد:
AT91C_BASE_PMC->PMC_PCER=(2<<AT91C_ID_PIOB);
ارور نداد و اجرا شد و کار کرد
با خط بالا که صالح جون گفت می خواستم کلاک رو به piob وصل کنم که نشد با خط پایی که مرتضی جون گفت کلاک وصل کردم شد
فک کنم یه چیزی فهمیدمLaugh
متن کامل برنامش اینطوریه
کد:
#include <AT91SAM7X256.H>
#include <delay.h>
int main(void)
{
تا به اینجاش که مثل قبل
کد:
AT91C_BASE_PMC->PMC_PCER=(2<<AT91C_ID_PIOB);
کلاک piob رو وصل کردم
کد:
AT91C_BASE_PIOB->PIO_PER=(1<<19);
پایه b.19 رو به صورت i/o تعریف کردم
کد:
AT91C_BASE_PIOB->PIO_OER=(1<<19);
پایه b.19 رو خروجی تعریف کردم
کد:
while(1){
شروع حلقه
کد:
AT91C_BASE_PIOB->PIO_CODR=(1<<19);
پایه رو صفر کردم
delay_s(1);
تاخیر
کد:
AT91C_BASE_PIOB->PIO_SODR=(1<<19);
پایه رو یک کردم
کد:
delay_s(1);
تاخیر
};
}
توی این خط
کد:
AT91C_BASE_PIOB->PIO_PER=(1<<19);
اگر بخوام چندتا پایه رو خروجی تعریف کنیم باید چکار کنیم

(آخرین ویرایش در این ارسال: ۱۰-بهمن-۱۳۹۱, ۱۳:۱۹:۳۹، توسط hadikh73.)
۱۰-بهمن-۱۳۹۱, ۱۲:۵۴:۰۵
ارسال‌ها
پاسخ
تشکر شده توسط : omid_phoenix
omid_phoenix آفلاین
مدیر بخش
*****

ارسال‌ها: 2,238
موضوع‌ها: 108
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 12682
( 15433 تشکر در 4574 ارسال )
ارسال: #20
RE: شروعی دوباره برای میکروهای arm
(۱۰-بهمن-۱۳۹۱, ۱۲:۱۳:۳۳)r0b0 نوشته است:
کد:
AT91C_BASE_PIOA->PIO_PER=(1<<0);
میشه a.0 چون pioa تعریف کردیم
نقل قول: بینید 0>>1 هیچ ربطی به pioa بودن یا piob بودن نداره....
این یه عمل بیتی هست(شیفت به چپ) و جوابش به عدده...

اینکه pioa باشه یا piob بستگی به این داره که آدرس base کدوم pio رو انتخاب کردید....

AT91C_BASE_PIOA->PIO_PER=(1<<0);

بالایی یعنی پین اول یا pioA.0 از pioA

AT91C_BASE_PIOB->PIO_PER=(1<<0);
ولی این یعنی pioB.0

میبینید که تفاوت ها در اینجا فقط به آدرس بیس مربوطه!!
صالح جون منم همین گفتم دیگهBiggrin
نقل قول: همین کد بالا، چه تو iar (که تجربه ای ندارم) و چه تو keil (که من باهاش کار کردم) ، اصولا باید بدون مشکل کامپایل بشه!
بله موردی نداشت
فقط چون ما الان تازه شروع می کنیم کمی گفته های بالا واسه رجیسترها گنگ بود به نظرم فعلا نباید سراغ رجیسترها بریم تا قبلش دستورات رو کامل یاد بگیریم

نقل قول: اگر بخوام چندتا پایه رو خروجی تعریف کنیم باید چکار کنیم

کد:
AT91C_BASE_PIOB->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);

(آخرین ویرایش در این ارسال: ۱۰-بهمن-۱۳۹۱, ۱۳:۰۷:۲۰، توسط omid_phoenix.)
۱۰-بهمن-۱۳۹۱, ۱۳:۰۱:۱۱
ارسال‌ها
پاسخ
تشکر شده توسط : hadikh73, salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #21
RE: شروعی دوباره برای میکروهای arm
نقل قول: ارور نداد و اجرا شد و کار کرد
با خط بالا که صالح جون گفت می خواستم کلاک رو به piob وصل کنم که نشد با خط پایی که مرتضی جون گفت کلاک وصل کردم شد
فک کنم یه چیزی فهمیدم

ایول فقط کامپایل شد یا روی میکرو کار هم کرد؟

چون این کد
کد php:
=(2<<AT91C_ID_PIOB); 
غلطه

این کد
کد php:
=(1<<AT91C_ID_PIOB); 

درسته....

بعدشم اون ID که نوشته بودم رو خودتون باید از دیتاشیت شماره شو میخونید و جایگزینش میکردید....

در ضمن آقا مرتضی هم از فایل هدر برای پیدا کردن ID ها استفاده کرده....

کلا اصول یکی هستش....
۱۰-بهمن-۱۳۹۱, ۱۳:۳۶:۰۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : omid_phoenix, sharin
hadikh73 آفلاین
مدیــر کـل سایـت
*******

ارسال‌ها: 1,219
موضوع‌ها: 43
تاریخ عضویت: شهریور ۱۳۹۱

تشکرها : 13641
( 14739 تشکر در 4686 ارسال )
ارسال: #22
RE: شروعی دوباره برای میکروهای arm
روی آی سی کار کردWink
کم کم دارم همه چیشه می فهممHappy خیلی با حالنBiggrin
توی فایل هدر این رجیستر PDSR نوشتهPin Data Status Register اگر اشتباه نکرده باشم این رجیستر وضعیت پایه رو مشخص می کنه درسته ؟
حالا اگر بخوام یه پایه رو بخونم باید اینطوری بنویسم درسته
کد:
if((AT91C_BASE_PIOB->PIO_PDSR=(1<<19))==1)
امتحانش نکردم

۱۰-بهمن-۱۳۹۱, ۱۴:۰۰:۲۰
ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, omid_phoenix


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Wink بررسی تمام میکروهای آرم با یکدیگر md3848 1 2,421 ۱۰-شهریور-۱۳۹۵, ۱۴:۵۴:۴۲
آخرین ارسال: md3848

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS