PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : سوال درباره ی avr با سی++



mahdieh721
07-10-2015, 13:40
یک دیتای 8 بیتی به طور مدام از پورت b بخواند و بررسی کند اگر عدد زوج است استیک پالس مربعی با فرکان 1 مگاهرتز و اگر فرد است فرکانس با 2 مگاهرتز باشد.
من توی خواندن یک مقدار از پورت مشکل دارم میشه راهنماییم کنید

erfanjeddy
07-10-2015, 14:26
سلام، اول اینکه میکرو atmega هست یا atxmega
دوم اینکه مشکل رو بیشتر توضیح بدید لطفا

mahdieh721
07-10-2015, 14:40
atmega16
(یک دیتای 8 بیتی به طور مدام از پورت b بخواند) من اینجا مشکل دارم

ehsanbagheri
07-10-2015, 14:45
دزست کردن فرکانس 2 مگا هرتز با avr فکر نکنم عملی باشه البته با دقت پایین فکر کنم بشه تا به حال این فرکانس رو امتحان نکردم
کامپایلر یا بهتره بگم ide که استفاده میکنی چی هست؟
تو کدویژن اینطوری باید بنویسی val=pinx که x همون پورت مورد نظر هست

erfanjeddy
07-10-2015, 14:53
روی atmega ایجاد این فرکانس فکر نمیکنم امکان پذیر باشه، البته با کلاک 16 مگاهرتز که سری های 16pu میتونن داشته باشن شاید، atxmega میتونه با کلاک 32 مگاهرتز کارکنه و میشه روی پین هاش به فرکانس بالا رسید، البته تقلب هم میشه کرد مثلا از کلاک spi استفاده کرد که روی atmega هم میشه به فرکانس بالا رسید.

- - - Updated - - -


void MB_PortInit (void *Port,INT16U BaudRate,INT8U Parity,INT8U StopBit){
INT16U UBRR;

(void)Port; /* Avoid compiler warning. Port is not used in ATMEGA. */

UBRR = ((CPU_FREQ/16) / BaudRate) - 1;

UBRRH =UBRR>>8;
UBRRL = UBRR;

UCSRB |= 1 << RXEN;
UCSRB |= 1 << TXEN;

UCSRC = (1 << URSEL) | (Parity << UPM0) | (StopBit << USBS) | (3 << UCSZ0);

SerialPort_DDR &= ~(1 << SerialPort_RXD); /* Set RXD to input */
SerialPort_DDR |= 1 << SerialPort_TXD; /* Set TXD to output */
SerialPort_DDR |= 1 << SerialPort_REN; /* Set REN to output */
SerialPort_DDR |= 1 << SerialPort_DEN; /* Set DEN to output */

SerialPort &= ~(1 << SerialPort_REN); /* Listen mode */
SerialPort &= ~(1 << SerialPort_DEN); /* Listen mode */
}

mahdieh721
07-10-2015, 14:54
خب قبلش باید توی اون پورت یه چیزی باشه که بعد طبق گفته شما اونو بریزم توی val , اونو باید چیکار کنم؟
میشه این تیکه اولشو کد کاملش برام بنویسید . ( توی کدویژن)

erfanjeddy
07-10-2015, 14:57
با این کد حتما سریال پورت ATMEGA کار خواهد کرد، برای کد کامل به پست MODBUS for AVR مراجعه کنید و کد رو بگیرید.

- - - Updated - - -

You can see links before reply

mahdieh721
07-10-2015, 14:57
روی atmega ایجاد این فرکانس فکر نمیکنم امکان پذیر باشه، البته با کلاک 16 مگاهرتز که سری های 16pu میتونن داشته باشن شاید، atxmega میتونه با کلاک 32 مگاهرتز کارکنه و میشه روی پین هاش به فرکانس بالا رسید، البته تقلب هم میشه کرد مثلا از کلاک spi استفاده کرد که روی atmega هم میشه به فرکانس بالا رسید.

- - - Updated - - -


void MB_PortInit (void *Port,INT16U BaudRate,INT8U Parity,INT8U StopBit){
INT16U UBRR;

(void)Port; /* Avoid compiler warning. Port is not used in ATMEGA. */

UBRR = ((CPU_FREQ/16) / BaudRate) - 1;

UBRRH =UBRR>>8;
UBRRL = UBRR;

UCSRB |= 1 << RXEN;
UCSRB |= 1 << TXEN;

UCSRC = (1 << URSEL) | (Parity << UPM0) | (StopBit << USBS) | (3 << UCSZ0);

SerialPort_DDR &= ~(1 << SerialPort_RXD); /* Set RXD to input */
SerialPort_DDR |= 1 << SerialPort_TXD; /* Set TXD to output */
SerialPort_DDR |= 1 << SerialPort_REN; /* Set REN to output */
SerialPort_DDR |= 1 << SerialPort_DEN; /* Set DEN to output */

SerialPort &= ~(1 << SerialPort_REN); /* Listen mode */
SerialPort &= ~(1 << SerialPort_DEN); /* Listen mode */
}




ممنون ولی الان سوال رو نگاه کردم مگا نبوده کیلو بوده :mrgreen:

erfanjeddy
07-10-2015, 15:03
:mrgreen:خوب بهتر حالا با یه تایمر میتونی به راحتی به این فرکانس برسی

mahdieh721
07-10-2015, 15:08
من اون کد رو دیدم ولی راستش چیزی نفهمیدم . من تازه شروع کردم و چیز زیادیم نمیدونم
به همین خاطر مشکلم توی قسمت اول رفع نشد ...میشه ساده تر توضیح بدین cry::

ehsanbagheri
07-10-2015, 17:15
من اون کد رو دیدم ولی راستش چیزی نفهمیدم . من تازه شروع کردم و چیز زیادیم نمیدونم
به همین خاطر مشکلم توی قسمت اول رفع نشد ...میشه ساده تر توضیح بدین cry::

شما یه متغیر تعریف کن از نوع unsighned char یا int بعد مقدار پوزت رو بریز داخلش تمام


unsigned char Val;



void main();
{
DDRB=0x00;

while(1)
{
Val=PINB;
}
}


فقط باید یادت باشه هر دفه باید دستور خوندن پورت رو اجرا کنی تا تغییرات ثبت بشه

erfanjeddy
07-10-2015, 17:32
من واقعا شرمندم، پورت B رو سریال خوندم و کد سریال براتون فرستادم،
کدی که آقای احسان فرستادن کاملا درست و عملیه فقط اگه بازم استباه نکنم PINB باید بشه PORTB
در خط DDRB=0x00 پورت B به حالت ورودی تنظیم شده، وقتی میخوای مقداری رو از پورت بخونی باید تبدیلش کنی به ورودی، بعد رجیستر PORTB رو میخونی،
val=PORTB همون عمل خوندن رجیستره،
یک حلقه بینهایت هم همیشه هست، فعلا همینقدر بدونید کافیه که میکرو هرگز نباید به آخر تابع main برسه.

ehsanbagheri
07-10-2015, 20:51
Port بزایه نوشتن رویه پورت هست

mahdieh721
07-10-2015, 22:03
برای تولید موج پالس مربعی باید چیکار کنم؟cry::

erfanjeddy
07-10-2015, 23:03
یه پین رو صفر و یک بکنی مربعی میشه دیگه

mahdieh721
07-10-2015, 23:14
یه پین رو صفر و یک بکنی مربعی میشه دیگه
ممنون توی فرکانسش مشکل داشتم که درست شد.

mahdieh721
14-10-2015, 19:36
یک شمارنده از 9 تا 0 با استفاده از IC مبدل BCD به 7segment ، 7447 پياده سازي كنيد.
من برای این سوال این کد رو نوشتم ولی توی شبیه سازی یک سری کاراکتر زیادی چاپ میکند(البته بعد از چاپ 9 تا 0)
کسی میدونه اشکال کار کجاست؟


#include <mega32.h>
#include <delay.h>
unsigned char seven_seg_code(unsigned char num);
void main(void)
{
unsigned char i;
DDRC=0xff;
while (1)
{
for (i=9;i>=0;i--)
{
PORTC=seven_seg_code(i);
delay_ms(1000);
}
}
}
unsigned char seven_seg_code(unsigned char num)
{
unsigned char out;
switch(num)
{
case 0: out=0b0000;break;
case 1: out=0b0001;break;
case 2: out=0b0010;break;
case 3: out=0b0011;break;
case 4: out=0b0100;break;
case 5: out=0b0101;break;
case 6: out=0b0110;break;
case 7: out=0b0111;break;
case 8: out=0b1000;break;
case 9: out=0b1001;break;
default:break;
}
return out;
}

erfanjeddy
14-10-2015, 22:58
بسیار عالی، درسته یه ایراد کوچیک داره ولی کد نویسیت تمیزو خوبه حالا این درستش.

for (i=10;i>=1;i--) {
PORTC=seven_seg_code(i-1);
delay_ms(1000);
}
حالا شما توضیح بده چرا. این ممکنه مشکل خیلی از دوستان باشه

mahdieh721
14-10-2015, 23:23
بسیار عالی، درسته یه ایراد کوچیک داره ولی کد نویسیت تمیزو خوبه حالا این درستش.

for (i=10;i>=1;i--) {
PORTC=seven_seg_code(i-1);
delay_ms(1000);
}
حالا شما توضیح بده چرا. این ممکنه مشکل خیلی از دوستان باشه
نمیدونم چرا ولی بازم اون مشکل سرجاشه درست نشد!!!

erfanjeddy
14-10-2015, 23:26
اینجا که درسته

- - - Updated - - -

میره تا صفر بعد برمیگرده 9

- - - Updated - - -

کامپایلرت چیه؟

mahdieh721
14-10-2015, 23:30
پس احتمالا شبیه سازیم مشکلی داشته باشه که اونم مهم نیس فعلا احتیاجی بهش ندارم فقط برای امتحان کدم استفاده میکنم.
ممنون لطف کردید.

- - - Updated - - -


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

- - - Updated - - -

میره تا صفر بعد برمیگرده 9

- - - Updated - - -

کامپایلرت چیه؟

کدویژن

erfanjeddy
14-10-2015, 23:40
داستان این بود که در حالت قبلی i یه دور میچرخه و میشه 255 از صفر اونوقت بزرگتره و همینطور ادامه پیدا میکنه. تا دوباره به 9 برسه. اما اینجا هم کد شما روی کامپایلر GCC روی صفر میمونه. ممکنه کدویژن مقدار متغیر out رو بدون مقدار دهی اولیه 255 فرض میکنه پس حالا اینو امتحان کن

unsigned char out=0;
در ابتدای تابع seven_seg_code