Zoser جان این عکس مربوط به توضیحات صفحه قبل هست دیگه لازم نیست بری توی اون سایت عکس رو نگاه کنی با توجه به همین عکس اون بو بخون.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید
سلام
یک مشکل با کلید ها دارم
من این کد رو می نویسم
ldi R16,0b11111110
out DDRD,r16
ldi R16,0b00000001
out PortD,R16
الان پین یک از D رو برای ورودی فعال کردم یک کلید روشن خاموش به اون وصل هست .
تئوری من میگه که وقتی این کلید در حالت بالا یا off باشه این پورت هم 0 است و فعال نیست یعنی
sbis PinD,0
rjmp LedOn
الان کلید بالاست و غیر فعال و Led خاموش و خط LedOn اجرا نمیشه چون PinD,0 برابر 1 نیست .
ولی اینجا چیز دیگه ای نشون میده .من چک نمیکنم که فعاله یا غیر فعال مستقیم در PortB می ریزم
in R16,Pind
out PortB,r16
با این دو خط بر عکس اجرا می شه وقتی کلید به سمت بالاست مدار برقرار نست روشن می شه یعنی PorB برابر با 11111111 می شه و وقتی کلید رو می زنم خاموش میشه
نمیدونم چرا .
خواهش میکنم کاری نکردم
راستش درست متوجه نشدم چه کار میخوای بکنی، اگر کل برنامه رو بزاری و مدارت رو بهتر میتونم کمکت کنم، از این چیزا که نوشتی یه چیزایی متوجه شدم ولی نمیتونم با توجه به اینها چیزی بنویسم چون یک خط کد توی اسمبلی میتونه کل برنامه رو به هم بریزه.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید
از مدار که یک مدار ساده
یک LED وصل به PB0 و یک کلید وصل هست به PD0
حالا برنامه اول .
.include "m16def.inc"
.def temp=r16
init:
;;;Direction
ser Temp
out DDRB,temp
ldi temp,0b11111110
out DDRD,temp
;;;end Direction
clr Temp
out PortB,temp
ldi Temp,0b00000001 ;
out PortD,temp
;;;;;;;;;;;;;;;;;;;
start:
sbis PinD,0
rjmp LedOn
cbi PortB,0
rjmp start
LedOn:
sbi PortB,0
rjmp Start
این برنامه وقتی که کلید زده شد Led روشن می شه یعنی کلید وقتی در حالا off باشه Led خاموش
ولی این برنامه
.include "m16def.inc"
.def temp=r16
init:
;;;Direction
ser Temp
out DDRB,temp
ldi temp,0b11111110
out DDRD,temp
;;;end Direction
clr Temp
out PortB,temp
ldi Temp,0b00000001 ;
out PortD,temp
;;;;;;;;;;;;;;;;;;;
start:
in temp,PinD
out PortB,temp
rjmp start
اگر این برنامه رو نگاه کنی و اجرا کنی میبینی برعکسه
یعنی حرف وقت کلید در حالت off باشه یعنی بالا باشه Led روشن
خوب این دوتا عکس هم هستند، توی برنامه اولی که نوشتی میاد پین 0 از پورت D رو چک میکنه اگر صفر بود LEDon رو اجرا میکنه اما اگر یک بود اون رو رد میکنه و دستور بعدی CBI Portb,0 هست رو اجرا میکنه، یعنی در هر لحظه پین صفر از پورت D عکس پین 0 از پورت B هست.
اما در برنامه دومی شما میای دقیقا محتویات روی پورت D رو کپی میکنی توی R16 و بعد دقیقا همون رو بلافاصله کپی میریزی روی پورت B در نتیجه پورت B و D دقیقا مثل هم هستند و در نتیجه پین صفر هم در هر دوتا شبیه به هم هست در صورتی که توی برنامه قبلی عکس هم میشدند.
من مدارش رو توی Proteus برای هر دوتا برنامه بستم همین جواب رو داد که خودت گفتی و من هم دارم میگم، چیز اشتباهی هم نیست برنامه داره طبق نوشته شما اجرا میشه. حالا اگر چیزی که شما میخوای نیست ممکن هست از نحوه بستن کلید و LED باشه ولی این برنامه ها دقیقا همینطور که توضیح دادم دارند روی پورت ها کار میکنند و درست هم برنامه اجرا میشه.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید
توی برنامه اول چک میکنه که pindD یک است اگر هست بعد LEDON رو اجرا میکنه
SBIS PinD,0
یعنی اگر کلید رو زدیم و اتصال برقرار باشه 1 ر و میده در نتیجه LEDON اجرا میشه .
ولی توی برنامه دوم اصلا موقعی که ما کلید رو نزدیم باید 0 رو بده در نتیجه خاموش باید بشه ولی روشن می شه بر عکس اگر کلید رو زدیم جریان برقراره در نتیجه 1 می شه و باید روشن بشه ولی توی مدار چیز دیگه ای نشون میده .
یعنی اگر کلید بالا بشه و جریان برقرار نباشه در نتیجه PIND می شه 0b00000001 می شه ولی من میگم که باید 0b00000000 بشه چون مدار وصل نیست .
SBIS یعنی Skip if Bit in I/O Register is Set یعنی اینکه چک میکنه و اگر اون پین یک بود دستور بعدی رو رد میکنه نه اینکه اجرا بکنه، یعنی در برنامه اول که شما نوشتی اگر این بیت یک باشه ( به ولتاز مثبت وصل باشه ) از روی Rjmp Ledon میپره و اون رو اجرا نمیکنه و دستور بعدیش که Cbi Portb,0 هست رو اجرا میکنه.
اگر توی SBIS PIND,0 این پین صفر بشه ( به زمین وصل بشه ) حالا دستور Rjmp Ledon رو اجرا میکنه و پرش میکنه به Ledon. به همین خاطر هست که زمانی LED شما روشن میشه که ورودی شما صفر هست. یا بهتر اینجوری بگم که زمان شما به روتین Ledon میرید که ورودی شما صفر باشه یعنی به زمین مدار وصل بشه.
من هنوز متوجه نشدم شما این کلید رو چطوریوصل کردین و منظورتون رو از بالا و پایین بودن متوجه نمیشم لطف کن یه عکسی چیزی از مدار یا از نحوه وصل شدن کلید به مدار بزار، تا حالا هر چی توضیح دادم کاری به کلید نداشتم و طبق صفر و یک بودن ورودی گفتم، شاید کلید جوری وصل شده که صفر و یک رو برعکس میده؟؟!!
توی برنامه دوم شما اگر اصلا کلید رو بکنی بندازی دور و ورودی به هیچ جا وصل نباشه باز خروجی شما یک هست چون اول برنامه PIND,0 رو به مقاومت PullUp داخلی وصل کردی و در نتیجه یک شده حالا از اونجا که شما دقیقا داری پین D رو میخونی و اون رو مستقیم میریزی روی PortB خوب این پین یک خونده میشه و یک هم ریخته میشه روی پورت B و در نتیجه LED روشن میشه.
اگر یه عکس کامل از مدارت یا فایل Proteus رو بزاری کامل برات توضیح میدم که به قول معروف چطور میشه که ایطور میشه. :smile:
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید
من با توجه به همین عکسی که گزاشتید برنامه ها رو توضیح میدم، توی این مدار شما وقتی کلید رو وصل میکنی عملا یعنی Pind,0 رو صفر کردی چون این پین به زمین وصل میشه ولی زمانی که کلید رو قطع کنید با توجه به مقاومت PullUp داخلی که اول برنامه ها تعریف کردید و به Pind,0 وصل کردید این پین در حالت عادی یک هست، یعنی کلید که قطع هست چون پین به هیچ جا وصل نیست یک هست، پس تا اینجا اینطوری شد که اگر کلید رو فشار دادید و وصل کردید پین صفر میشه، اگر قطعش کردید پین یک میشه. کاری به جاری شدن جریان هم نداشته باشید نشانه صفر یا یک بودن یک پین سطح ولتاز اون هست اگر صفر یا خیلی نزدیک به صقر بود یعنی پین صفر هست اگر نزدیک به ولتاژ تغذیه مدار بود یک هست.
خوب حالا برنامه اولی و این مدار:
تا قبل از Start که تنظیمات مربوط به پایه ها هست به این صورت که پورت B رو به صورت خروجی تعریف کردین و بعد همه پایه هارو صفر کردین، پورت D هم همه پایه ها خروجی تعریف شدن غیر از PIND,0 که ورودی تعریف شده و به مقاومت Pull Up یا بالاکش از داخل متصل شده و این باعث میشه که این پین در حالت عادی که به هیچ جا وصل نیست مقدار یک رو داشته باشه. این قضیه اینکه PullUp داخلی رو میدونی؟ اگر متوجه نشدی که این PullUp از کجا اومده و چی شد که این اومد تا در مورد اون هم توضیح بدم.
خوب حالا میرسیم به Start ، Sbis Pind,0 میاد مقدار Pind,0 رو چک میکنه اگر این مقدار یک بود که خط بعدی که Rjmp Ledon باشه رو Skip میکنه یعنی رد میکنه و اجرا نمیکنه، یعنی در واقع اگر Pind,0 یک بود میره و CBI Portb,0 رو اجرا میکنه که نتیجه اون خاموش شدن LED هست. حالا تو این مدار چه موقع Pind,0 یک هست؟ زمانی که کلید قطع هست و پین عملا به جایی اتصال نداره ( از داخل میکرو به وسیله مقاومت Pull Up به VCC یا مثبت وصل شده برای همین یک هست )
حالا دوباره بر میگردیم به همون Sbis Pind,0 اما اینبار فرض میکنیم کلید فشار داده شدده باشه و در نتیجه Pind,0 به زمین وصل شده باشه، در این حالت Pind,0 برابر صفر هست، یعنی اینکه دستور Sbis Pind,0 وقتی که چک میکنه میبینه که این پین صفر هست و اینبار دیگه دستور بعدی که Rjmp Ledon باشه رو Skip نمیکنه بلکه اون رو اجرا میکنه، در نتیجه به روتین LEDon میره و Sbi portb,0 رو اجرا میکنه که نتیجه اون روشن شدن LED هست. پس زمانی که کلید رو فشار دادید و به صفر وصل شد Led روشن میشه، توی این برنامه در واقع Pind,0 و Portb,0 عکس هم هستند ولی چیزی که موقع اجرا دیده میشه این هست که با وصل کردن کلید LED روشن میشه و با قطع کردن اون LED خاموش میشه.
اما برنامه دوم:
توی این برنامه هم تا قبل از Start همه پورت ها دقیقا مثل برنامه قبل تنظیم میشن تا اینکه میرسیم به Start :
با اجرای دستور In Temp,Pind وضعیت پورت D به طور کامل کپی میشه در رجیستر R16 در این حالت اگر کلید وصل باشه Pind,0 باز مثل قبل به زمین وصل میشه و صفر میشه در نتیجه عدد هشت بیتی 00000000 یا همون 0 کامل توی رجیستر R16 کپی میشه، و وقتی که خط بعد اجرا میشه (Out Portb,Temp) دقیقا همون مقدار R16 که همون مقدار Pind,0 بوده ( صفر ) روی پورت B ریخته میشه و در نتیجه پورت B کاملا صفر میشه و LED هم خاموش خواهد بود، همونطور که میبینی اینجا کلید وصل هست ولی به صفر وصل هست و از اونجا که دقیقا مقدار Portd رو PortB ریخته میشه پورت B هم به کل خاموش میشه.
حالا فرض میکنیم کلید رو قطع کنیم و دوباره برگردیم به Start :
در این حالت Pind,0 از بیرون به جایی وصل نیست و به دلیل اینکه از داخل میکرو به وسیله مقاومت بالاکش یا Pull Up به مثبت وصل شده پس این پین مقدار یک رو داره، در نتیجه وقتی که دستور In Temp,Pind,0 اجرا میشه عدد هشت بیتی 00000001 یا همون یک توی رجیستر R16 کپی میشه، و در دستور بعد Out Portb,Temp این مقدار عینا از رجیستر R16 روی پورت B ریخته میشه و در نتیجه پورت B هم برابر با 00000001 یا همون یک میشه که در این حالت LED روشن خواهد شد، پس میبینیم در این حالت عملا Pind,0 و Portb,0 همیشه مثل هم هستند اما از اونجا که با وصل شدن کلید مقدار صقر روی Pind,0 و بعد PortB,0 ریخته میشه وقتی که کلید فشار داده شده LED خاموش خواهد بود.
حالا اگر این وضعیت بدون تغییر برنامه عکس بشه کافیه LED و تغذیش رو بر عکس کنی یعنی کاتدش رو بزنی به Portb,0 و آندش رو بزنی به مثبت مدار، توی این وضعیت هر دوتا برنامه رفتارشون عکس میشه.
موفق باشی
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید
میشه یک کتاب خوب بهم معرفی کنی البته تا حالا کتاب AVR نخریدم . مثلا الان در مورد این تایمر ها مشکل دارم همین TCN0 و بقیه یک کتاب خوب که واضح باشه با سی هم بود اشکال نداره ممنون از زحمات فراوانت
چند روز پیش یک کتاب خریدم که تا اینجا که نگاه کردم برای یادگیری اسمبلی خیلی خوب هست، اسمش اینه: میکروکنترلرهای AVR سری Mega مولفان: سعید شجاعی و نادر مهرا. دیباگران تهران. کتاب خوبی هست پیشنهاد میکنم بگیرش چون هم با ساختمان میکرو آشنات میکنه هم با کد نویسی اسمبلی.
کتاب میکروکنترلرهای AVR نوشته مهدی پرتوی فر، مظاهریان و یوسف بیانلو هم هست که هم C توضیح داده هم اسمبلی، که البته برای یادگیری اسمبلی از صفر به درد نمیخوره ولی مثالهایی داره که میتونه به دردت بخوره.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید
سلام
من این برنامه رو روی mega16 میخوام Flash کنم پیغام Out Of the memory
.include "m16def.inc"
.def Temp=R16
init:
ser Temp
out DDRB,Temp
clr Temp
Out PortB,TEmp
ldi R17,0
Main:
ldi Temp,High(RAMEND)
out SPH,temp
ldi Temp,LOW(RAMEND)
out SPL,Temp
;;;;;;;;;;;;;;;;;;
ldi Temp,0b00000001
Out PortB,temp
ldi ZH,High(65535)
ldi ZL,low(65535)
start:
Rcall Delay
LSL Temp
Out PortB,temp
sbic PortB,7
rjmp InitPort
rjmp start
InitPort:
rcall Delay
ldi Temp,0b00000001
Out PortB,temp
rjmp Start
Delay:
sbiw Z,1
brne Delay
ldi ZH,High(65535)
ldi ZL,low(65535)
ret
1 - درون Z چه عددی نوشته می شه تو چند خط اخر یا منظور از High(65535) چیه
2 - اگر بخوام از SBI استفاده کنم نمیشه حتما باید یک عدد بهش بدم نه یک متغیر
SBI PortB,8
نمی تونم برای عدد از متغیر استلفاده کنم
دیدگاه