کار با پورت ها

saalek110

Well-Known Member

DDRx register​

DDRx (Data Direction Register) configures data direction of port pins. Means its setting determines whether port pins will be used for input or output. Writing 0 to a bit in DDRx makes corresponding port pin as input, while writing 1 to a bit in DDRx makes corresponding port pin as output.​

Example:

PHP:
to make all pins of port A as input pins :
DDRA = 0b00000000;
to make all pins of port A as output pins :
DDRA = 0b11111111;
to make lower nibble of port B as output and higher nibble as input :
DDRB = 0b00001111;

پس وقتی این طوری می نویسیم DDRx مثلا DDRB
می خواهیم خروجی و ورودی تعریف کنیم.
و صفرها ورودی و یک ها خروجی اند.


 

saalek110

Well-Known Member

PORTx register​

PORTx is used for two purposes.

1) To output data : when port is configured as output

When you set bits in DDRx to 1, corresponding pins becomes output pins. Now you can write data into respective bits in PORTx register. This will immediately change state of output pins according to data you have written.

In other words to output data on to port pins, you have to write it into PORTx register. However do
not forget to set data direction as output.
Example :




PHP:
to output 0xFF data on port b
DDRB = 0b11111111;        //set all pins of port b as outputs
PORTB = 0xFF;             //write data on port
to output data in variable x on port a
DDRA = 0xFF;              //make port a as output
PORTA = x;                //output variable on port
to output data on only 0th bit of port c
DDRC |= 0b00000001;        //set only 0th pin of port c as output
PORTC |= 0b00000001;       //make it high.

در کدهای بالا ، ابتدا خروجی و ورودی مشخص شده و سپس مقدار دهی شده .
مثلا در کد زیر:
PHP:
DDRC |= 0b00000001;        //set only 0th pin of port c as output
PORTC |= 0b00000001;       //make it high.

بیت صفرم از پورت C ابتدا به عنوان خروجی تعریف شده
و در خط دوم آن بیت را high تعریف کرده ایم. یعنی روشن.
 

saalek110

Well-Known Member
figures as input

When you set bits in DDRx to 0, i.e. make port pins as inputs, then corresponding bits in PORTx register are used to activate/deactivate pull-up registers associated with that pin. In order to activate pull-up resister, set bit in PORTx to 1, and to deactivate (i.e to make port pin tri stated) set it to 0.

In input mode, when pull-up is enabled, default state of pin becomes ‘1’. So even if you don’t connect anything to pin and if you try to read it, it will read as 1. Now, when you externally drive that pin to zero(i.e. connect to ground / or pull-down), only then it will be read as 0.

However, if you configure pin as tri-state. Then pin goes into state of high impedance. We can say, it is now simply connected to input of some OpAmp inside the uC and no other circuit is driving it from uC. Thus pin has very high impedance. In this case, if pin is left floating (i.e. kept unconnected) then even small static charge present on surrounding objects can change logic state of pin. If you try to read corresponding bit in pin register, its state cannot be predicted. This may cause your program to go haywire, if it depends on input from that particular pin.

Thus while, taking inputs from pins / using micro-switches to take input, always enable pull-up resistors on input pins.

NOTE: while using on-chip ADC, ADC port pins must be configured as tri-stated input.

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

PHP:
to make port a as input with pull-ups enabled and read data from port a
DDRA = 0x00;        //make port a as input
PORTA = 0xFF;       //enable all pull-ups 
y = PINA;           //read data from port a pins
to make port b as tri stated input
DDRB  = 0x00;        //make port b as input
PORTB = 0x00;        //disable pull-ups and make it tri state
to make lower nibble of port a as output, higher nibble as input with pull-ups enabled
DDRA  = 0x0F;        //lower nib> output, higher nib> input
PORTA = 0xF0;        //lower nib> set output pins to 0,
                     //higher nib> enable pull-ups

در کدهای بالا وقتی از کلمه PORTx استفاده کردیم مثلا PORTA ,
داریم پول آپ و پول داون می کنیم ، چون قبلش اون پین ها را به عنوان ورودی انتخاب کردیم.
 

saalek110

Well-Known Member

PINx register​

PINx (Port IN) used to read data from port pins. In order to read the data from port pin, first you have to change port’s data direction to input. This is done by setting bits in DDRx to zero. If port is made output, then reading PINx register will give you data that has been output on port pins.

Now there are two input modes. Either you can use port pins as tri stated inputs or you can activate internal pull up. It will be explained shortly.​

Example :

PHP:
to read data from port A.
DDRA = 0x00;    //Set port a as input
x = PINA;       //Read contents of port a

در کد بالا، اول ورودی اعلام کردیم پورت A را،
و در خط بعدی اون پورت خواندیم.

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

saalek110

Well-Known Member
دو سایت زیر مربوط به افزایش پایه هاست ..... شما پیام بازرگانی حساب کنید و رد شوید.




در اینجا روش های افزایش پایه را گفته که به بحث ما نمی خوره ، ولی لینک گذاشتم.



افزایش پورت های خروجی میکروکنترلر AVR با استفاده از آیسی ۷۴HC595
 
آخرین ویرایش:

saalek110

Well-Known Member
Screenshot_۲۰۲۳-۱۱-۱۷_۱۸۵۳۵۱.jpg

در شکل بالا شکل رجیستر را هم کشیده ، که خیلی خوبه ،
و در پایین ۳ روش مقدار دادن به پورت را نشان داده...... مشابه خط زیر که من گفتم در بالا:

PHP:
PORTA = 0xFF;       //enable all pull-ups

در شکل بالا ، در خط سوم ، اون اسمها قراردادی است و باید راهنماها را دید ،
یک سری رجیستر ، یا همون حافظه داریم که هر بیت اش را اسم خاصی داده اند ، چون برای کارهای خاصی است.
مثلا در بالا بیت REFS0 اگر یک بشه ، میکروکنترلر رفتار خاصی نشان می دهد.

اما در مورد خط اول و دوم یعنی این دو خط:

PHP:
ADMUX=0b01110101;

ADMUX=0x75;

علامت 0b به معنی باینری است و علامت 0x به معنای مبنای ۱۶ است.
اون یک های بالا را اگر جمع بزنید ، همین 75 پایین میشه. بهتره بخوانیم ۷ و ۵ ... چون که اگر ۴ بیت اول 0b01110101 یعنی 0101 را جمع بزنی میشه ۵ و چهار بیت بعدی یعنی 0111 را هم جمع بزنی میشه ۷ . عدد اول را یک بگیرید ، عدد دومی را دو و عدد سومی را ۴ و عدد آخری را ۸ ....یعنی 1111 میشه ۸+۴+۲+۱ که میشه ۱۵ ولی نمی نویسند ۱۵ بلکه می نویسند F ...مثل کد زیر:

PHP:
PORTA = 0xFF

پس فرق مبنای ۲ و مبنای ۱۶ را هم فهمیدیم.

پس اگر اینو دیدید: 0x32 ، یعنی مبنای ۱۶ و باید فوری در ذهنتان به مبنای ۲ تبدیل کنید.
اون دو میشه این 0010 یعنی پین دومی روشن و اون ۳ میشه 0011 یعنی دو پین اول روشن.


 

saalek110

Well-Known Member
شاید بهتر باشد ، به جای دیدن عکسهای این پست و پست بعد ، خود سایت را بازدید کنید.




Screenshot_۲۰۲۳-۱۱-۱۷_۱۹۲۰۳۷.jpg

Screenshot_۲۰۲۳-۱۱-۱۷_۱۹۲۲۴۰.jpg

پس می بینید که یک سری رجیستر به نام pin داریم که مقدار پورت ها را در خود نگه می دارند.


نقل از سایت :

نکته: در هر سه رجیستر DDR و PIN و PORT (هنوز این مورد رو نگفتم) با قرار دادن یک نقطه و یک عدد از 0 تا 7 می‌توان به صورت مستقیم به بیت مورد نظر مقدار 0 یا 1 را داد یا این‌که مقدار آن را خواند.


بقیه پست بعد...
 
آخرین ویرایش:

saalek110

Well-Known Member
Screenshot_۲۰۲۳-۱۱-۱۷_۱۹۲۶۳۴.jpg

PHP:
#include <mega16.h>
#include <delay.h>
void main(void)
{
DDRA.0 = 1;
    while(1){
    PORTA.0 = 1;
    delay_ms(500);
    PORTA.0 = 0;
    delay_ms(500);
    }
}


همانطور که گفتیم، بیت صفرم از رجیستر DDRA را برابر 1 کردیم. با این کار پایه صفرم پورت A خروجی می‌شود. سپس برنامه وارد حلقه بی‌انتهای while می‌شود. در این حلقه به صورت مداوم با تاخیر 500 میلی ثانیه‌ای، بیت صفرم رجیستر PORTA بین 0 و 1 تغییر حالت می‌دهد. با این کار اگر یک LED به پایه PA0 متصل شده باشد، به صورت چشمک زدن روشن و خاموش می‌شود.

سالک: برنامه بالا ، مناسب کدویژن است. با اندکی تغییر در اتمل استودیو هم قابل اجراست.
خوبی برنامه بالا اینه که اومده یک بیت از یک پورت را کار کرده. هر پورت ۸ بیت است.
در برنامه بالا ، خبری از خواندن نیست چون کلمه PIN را نداریم... فقط با DDRx ورودی-خروجی تعریف کرده و با PORTx مقدار دهی کرده. اینها را تکرار می کنم تا جا بیافتد وگرنه قبلا گفته بودیم.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا