پورت میکرو در قسمت سوم بحث avr

سلام دوست عزیز، برای سوال های جدید، بهتر هست که پست های جدید ایجاد کنید تا اگر دوست دیگری هم سوال مشابه داشت، راحت پیدا کنه.
در مورد سوالتون، دو تا نکته رو چک کنید. یکی اینکه حتما حتما گراند منبع تغذیه شما باید به گراندی که کامپیوتر شما رفته وصل باشه. این مورد رو چک کنید.
مورد دوم baudrate هست. آیا baudrate فرستنده با baudrate تنظیم شده در نرم افزار ها یکی هست؟
اون delay_ms هم خودتون نوشتید؟ اگه خودتون نوشتید کدش رو بفرستید. ممکنه که سرعت ارسال داده خیلی زیاد باشه. آیا اگر delay_ms رو با ۱۰۰۰ صدا بزنید، هر ۱ ثانیه روی ترمینال نوشته (حتی نوشته اشتباه) میبینید؟

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

من دیگه واقعا خسته شدم نمیدونم چیکار کنم دیوانه شدم
putchar(getchar()) که مینویسم پشت سرهم اعداد رو میخونه گاهی بازم خزعبلات مینویسه که مجبور میشم دوباره سخت افزار و سرهم بندی کنم حالا اون به جهنم
اما الان برنامه دوم که برنامه خودتونه رو مینویسم به جای اینکه زیر هم بنویسه بازم پشت سرهم میتنویسه اونم باز دری وری مینویسه هرکار میکنم نه زیرهم مینویسه نه عدد نشون میده بلکه دری وری نشون میده اون پشت سرهم
یه بار هردو رو 13 یه بار هردو 12 یه بار 12 و 13 دادم بازم درست نمیشه؟

#include <mega16a.h>
#include <delay.h>
#include <stdio.h>

void main(void)
{
// Declare your local variables here

// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0x19; while (1) { printf(“salam”); delay_ms(500); } }

سلام قبلی رو که نفهمیدم . اما تو ادامه این کد رو نوشتین و تو پاتی یا realterm میخوایم a رو نشون بده با ارتباط سریال.
من بعد buildallproject میرم تو نرم افزار progisp و برنامه رو پروگرم میکنم بعد که پاتی یا ریال ترم رو باز میکنم یه دونه a نشون میده بعد تو تکرارها کلی مزخرفات نشون میده که قابل خوندن نیست یا برا salam حتی یه دونه هم نشون نمیده و باز دری وری مینویسه مشکل چی میتونه باشه؟؟؟؟؟

از دوستان کسی هست که بتونه یه جوابی به من بده؟؟؟؟؟؟

به احتمال زیاد فک کنم بخاطر sck freq هست که چون شما با خود کد ویژن پروگرم میکنید اونو 2500 میذرید اما من از progisp استفادخ میکنم

سلام دوست عزیز، مرحله مرحله پیش بریم با هم:
وقتی که شما عدد ۱ رو به اندازه ۱ دونه شیفت میدید یعنی 1<<1 جوابش میشه 10 در مبنای دو.
وقتی که عدد 10 در مبنای دو رو با یک عدد دیگه and میکنید، یعنی همه بیت های اون عدد صفر میشن به جز بیت دوم. یعنی ما فقط بیت دوم برامون مهم بوده. اگر بیت دوم اون عدد 0 باشه که جواب کلا میشه 0 و اگر بیت دوم اون عدد 1 باشه، جواب میشه 10
حالا شما میخواید چک کنید ببینید که اون عدد حاصل از عملیات and آیا برابر ۰ هست یا برابر ۱۰ ؟
برای اینکار من برای اینکه داخل if نخوام بگم آیا حاصل این عملیات برابر ۱۰ هست، اومدم یدونه شیفت دادم که بشه عدد ۱ و با ۱ مقایسه کنم. دقت کنید که این شیفت، بعد از عملیات and انجام شده و اطلاعات همه بیت ها به جز بیت مورد نظر ما از بین رفته و ۰ شده. بنابراین مشکلی ایجاد نمیشه.
ولی در ادامه آموزش میگم که این شیفت آخر لازم نیست و برای نشون فقط انجام شده. شما میتونید خیلی راحت داخل if فقط خود عملیات رو بذارید و if با ورودی ۰ میشه false و با ورودی غیر ۰ میشه true بنابراین کد اینطوری میشه:
if(pinb&(1<<1))
دقت کنید که دیگه == استفاده نمیشه چون قرار نیست با چیزی مقایسه بشه. جواب عملیات and اگر ۰ باشه میشه false و اگر غیر ۰ باشه میشه true و میدونیم که تنها حالتی که جواب این عملیات غیر از ۰ باشه، اینه که اون پایه ورودی ۱ داشته باشه. پس به هدفمون میرسیم.

اگر هنوز جا نیفتاده براتون بگید که یک مثال عددی بزنم براتون.

>

@814#5742 سلام قبلی رو که نفهمیدم .

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

سلام دوست عزیز، برای اینکه من بتونم به شما کمک کنم، شما باید متن جواب من رو بخونید و به تمامی سوالاتی که پرسیدم پاسخ بدید. شما بدون توجه به پاسخ من دوباره همون مطالب قبلی رو با حالت آشفتگی بیان میکنید. یکبار دیگه پاسخ من رو بخونید و به سوالات من پاسخ بدید.
ارتباط سریال یکی از ساده ترین ارتباط ها در دنیای میکرو کنترل ها هست و مطمئن باشید اگر مدار شما و کد شما کار نمیکنه، قطعا یک جا رو اشتباه کردید. ممکنه الان نبینید اشتباهتون رو ولی بعد از اینکه اشتباه خودتون رو پیدا کردید، متوجه منظور من میشید. در اوایل شروع کار همیشه این اتفاق ها میفته.
دقت کنید که اشتباه شما ممکن هست در کد باشه و یا در سخت افزار. پس اطلاعات کافی از سخت افزار و یا عکس از مدارتون هم ارسال کنید. همونطور که قبلا هم گفتم، در ارتباط سریال، وقتی کاراکترها نامفهمون ارسال میشن، معمولا یا مشکل از عدم اتصال گراند ها هست و یا مشکل از عدم تطابق baudrate در فرستاده و گیرنده هست.
یک نکته هم در مورد realterm بگم که یکم کار باهاش سخت تر از putty هست و پیشنهاد میکنم اگر با کاراکترهای ascii سر و کار دارید، از putty استفاده کنید. در realterm تنظیمات سریال میتونه گیج کننده باشه و همچنین نحوه نمایش اطلاعات حالت های متنوعی داره که اگر اشتباه ست کردی باشید، چیزی که انتظار دارید رو روی صفحه نمیبینید.

سلام استاد شما تو قسمت سوم بحث ای وی ار به پایه 1 یه چراغ ال ای دی و به پایه دوم یه دکمه وصل کردید و گفتید اگه دکمه زده شد چراغ روشن شه حالا با شرط if میخونیم که ایا دکمه زده شده یا نه
خب همونطور که من مطالعه کردم هرپایه دارای سه رجیستر متناظر با خودشه ینی الان که دمه سوییچ به پایه دوم وصله اگه ddr ان پایه 0 fhai fi uk,hk ,v,nd hsj , اگه port ان 0 باشه پول اپ داخلی غیرفعاله الان برای خواندن pin باید دید که 00000010 یا نه
اما شما میاید پین رو میخونید و اند میکیند با 1>>1 تا اینجا درسته اما چرا اخر سر میاید دوباره شیفت میکیند به راست یه دونه؟؟؟
چون وقتی یه دونه شیفت میکنیذ به راست اونوقت 000000001 میشه که ماله پایه یک میشه که مربوط به ال ای دی است.
ینی باید باشه
if (pinb & (1<<1) ==0b00000010 ;
که پین رجیستر متناظر با پایه دوم که ماله سوییچ است خونده بشه اما شما یه دونه دوباره شیفت میدید به راست.حتی وقتی دکمه سوییچ به پایه سوم وصله باز 2 تا شیفت میدید بعه راست چرا؟؟؟؟؟؟