ايران ويج

نسخه‌ی کامل: افکت کم نور و پر نور شدن تدریجی با بسکام؟
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
ا سلام دوستان میخام یه حالت مثل فید یا پی دبلیو ام که افکت کم نور و پر نور شدن تدریجی ال ای دی با بسکام رو تو هشت پین پرت دی داشته باشم با اتمگا8 کسی میتونه روش نوشتن برنامشو بگه؟
برای افکت دادن به تابلو ثابت ال ای دی میخام فقط نرم افزاری باشه با پی دبلیو ام دو کانال بیشتر جواب نمیده قبلا من تو یه فروم پرسیده بودم کد زیر رو بهم دادن ولی عملی تست کردم فقط کم نور روشن میشد و هیچ اتفاقی نمیفتاد
کد:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portc.0 = Output

Dim A As Integer

For A = 0 To 100000
Do
Set Portc.0
Waitus A
Reset Portc.0
Waitus 500
Next
من این افکت و افکت های دیگه برای کار تابلو رو دارم اما براش زحمت زیادی کشیدم نمیتونم رایگان در اختیارتون بزارم
والا من در حده توانم یه برنامه براتون نوشتم با فایله پررتئوس میزارم براتون
بحثه جریان کشیو ایناشو خودتون میدونید Biggrin

البته شرمنده شبیه سازیشو با مگا 16 انجام دادم اگه مشکلی ندارید خودتو به 8 تبدیل کنید
ممنون دوست من ولی من افکت نرم افزاری این حالتو برای تمام پینها میخام اجرا کنم با pwmفقط دو پین بیشتر نمیشه
با يكي از تايمرها در حد چند ميلي ثانيه زمان درست كن و مرتب برو به وقفه ، توي وقفه هر تعداد پورت يا پين رو كه نياز داري يه جا مقدار دهي مي كني. با گذاشتن شرط سرشون يه بار 1 اشون مي كني و اگر شرط برقرار نبود 0 اشون مي كني.
درجا مي شه از دستور XOR استفاده كرد و ...
اينطوري DUTY CYCLE 50% هست. براي تغيير DUTY CYCLE بايد ايده بدي ...
مثلا هر بار به وقفه مي ري يه عددي رو مرتب +1 مي كني . شرطي كه براي مقادير پورت ها مي ذاري ( كه بالا گفتم )
متاثر از اين عددي هست كه مرتب با هر بار به وقفه اومدن دارهه با 1 جمع مي شه + عددي كه خودتون به عنوان DUTY CYCLE در نظر گرفتيد.
با مقايسه ي اين 2تا عدد نسبت زمان روشني به زمان خاموشي در مي ياد.
دقت كنيد كه فركانس بايد ثابت باشه ، و شما وقتي به وقفه مي ياد ، قرارهه در اين زمان مشخص ، يه بار مقدار 0 رو به همه اعمال كنيد و يك بار 1 رو.
فرض كنيد هر 20ms مي ريد وقفه ، تا زمان 1 ثانيه ، حداقل بايد 24 بار روشن خاموش بشه ، البته اين عدد نزديك 50 باشه بهترهه ، تو اين مدت كه مدام مي ريد به وقفه باعث مي شه فركانس ثابت باشه. براي ساختن همون 20ms هم بايد چند بار بريد به وقفه تا مثلا 100 تا شد مي فهميد كه زمان 20ms ساخته شدهه. تغيير DUTY CYCLE رو بايد در همين بازهه اعمال كنيد. يعني در اين 100 باري كه براي ساختن 20ms مي رهه به وقفه ، اگر در اين مدت كلا خروجي ها رو 1 كنيد ، و در ساخت نيم سيكل دوم ( 20ms بعدي ) خروجي ها رو 0 كنيد و به همين صورت روند ادامه داشته باشه ، DUTY CYCLE 50% ايجاد كرديد.
براي ساختن 25% بايد نصفه نيم سيكل اول 1 و نصف ديگه ي نيم سيكل اول 0 باشه + نيم سيكل دوم كلا 0 باشه.
اينجوري 25% ساخته مي شه ، كه با شرط گذاريي كه بالا گفتم مي تونيد DUTY CYCLE هاي دلخواه تون رو ايجاد كنيد.

در كل اگر دنبال دقت خوبي هستيد ، بايد كار با تايمرها و ساخت زمان با اون ها رو خوب بلد باشيد.

موفق باشيد.
(۲۰-اسفند-۱۳۹۱, ۰۰:۳۹:۳۰)رسول21 نوشته است: [ -> ]ممنون دوست من ولی من افکت نرم افزاری این حالتو برای تمام پینها میخام اجرا کنم با pwmفقط دو پین بیشتر نمیشه

(۲۰-اسفند-۱۳۹۱, ۱۱:۳۱:۴۸)sharin نوشته است: [ -> ]با يكي از تايمرها در حد چند ميلي ثانيه زمان درست كن و مرتب برو به وقفه ، توي وقفه هر تعداد پورت يا پين رو كه نياز داري يه جا مقدار دهي مي كني. با گذاشتن شرط سرشون يه بار 1 اشون مي كني و اگر شرط برقرار نبود 0 اشون مي كني.
درجا مي شه از دستور XOR استفاده كرد و ...
اينطوري DUTY CYCLE 50% هست. براي تغيير DUTY CYCLE بايد ايده بدي ...
مثلا هر بار به وقفه مي ري يه عددي رو مرتب +1 مي كني . شرطي كه براي مقادير پورت ها مي ذاري ( كه بالا گفتم )
متاثر از اين عددي هست كه مرتب با هر بار به وقفه اومدن دارهه با 1 جمع مي شه + عددي كه خودتون به عنوان DUTY CYCLE در نظر گرفتيد.
با مقايسه ي اين 2تا عدد نسبت زمان روشني به زمان خاموشي در مي ياد.
دقت كنيد كه فركانس بايد ثابت باشه ، و شما وقتي به وقفه مي ياد ، قرارهه در اين زمان مشخص ، يه بار مقدار 0 رو به همه اعمال كنيد و يك بار 1 رو.
فرض كنيد هر 20ms مي ريد وقفه ، تا زمان 1 ثانيه ، حداقل بايد 24 بار روشن خاموش بشه ، البته اين عدد نزديك 50 باشه بهترهه ، تو اين مدت كه مدام مي ريد به وقفه باعث مي شه فركانس ثابت باشه. براي ساختن همون 20ms هم بايد چند بار بريد به وقفه تا مثلا 100 تا شد مي فهميد كه زمان 20ms ساخته شدهه. تغيير DUTY CYCLE رو بايد در همين بازهه اعمال كنيد. يعني در اين 100 باري كه براي ساختن 20ms مي رهه به وقفه ، اگر در اين مدت كلا خروجي ها رو 1 كنيد ، و در ساخت نيم سيكل دوم ( 20ms بعدي ) خروجي ها رو 0 كنيد و به همين صورت روند ادامه داشته باشه ، DUTY CYCLE 50% ايجاد كرديد.
براي ساختن 25% بايد نصفه نيم سيكل اول 1 و نصف ديگه ي نيم سيكل اول 0 باشه + نيم سيكل دوم كلا 0 باشه.
اينجوري 25% ساخته مي شه ، كه با شرط گذاريي كه بالا گفتم مي تونيد DUTY CYCLE هاي دلخواه تون رو ايجاد كنيد.

در كل اگر دنبال دقت خوبي هستيد ، بايد كار با تايمرها و ساخت زمان با اون ها رو خوب بلد باشيد.

موفق باشيد.

سلام مهندس ببین این برنامه را من نوشتم همون طوری هست که فرمودین اگه جایش مشکلی داره لطف راهنمایی کنید

$regfile = "m32def.dat"
$crystal = 4000000
Config Porta.0 = Output
Config Porta.1 = Output
Config Portc.0 = Output
Dim B As Word

Dim A As Word , D As Word , C As Word
A = 0
B = 0
C = 0
D = 0
Config Timer1 = Timer , Prescale = 1
Enable Interrupts
Enable Timer1
On Timer1 P
Start Timer1



Do
'Reset Porta.1
'Reset Portc.0

For B = 0 To 100 Step 1
Waitms 10
Next B

For B = 100 To 0 Step -1
Waitms 10

Next B

Loop
End

P:
'Set Portc.0

A = A + 1
If A = 100 Then : A = 0 : End If
If A > B Then : Porta.0 = 1
Else
Porta.0 = 0
End If
'If A = 0 Then : Set Porta.1
'Else
'Reset Porta.1
'End If

Return
سلام.
راستی میدونی چرا اون برنامه بالا که گذاشتی عمل نکرد؟
دلیلش اینه:
کد:
Config Portc.0 = Output
شما نوشیتی پورت سی.0 درصورتی که واسه یک پایه باید بنویسی پین سی.0
یعنی:
کد:
Config PINC.0 = Output
الان اینو امتحان کن و نتیجه ش رو بگو.
خب بریم سره اصل مطلب.
این برنامه ای بود شما دادی:
کد:
int pw=1000,sw=0,i,i1,i2,i3;
void delay_usec (long int time)
for(i2=0;i2<time;i2++)
{
}
.
.
.
*********************** این قسمت را در تابع اصلی کپی کنید

// پور نور

for(i3=0;i3<=100;i3++)
{
pw-=10;
sw+=10;
for(i2=0;i2<5;i2++)
{
PORTB=0xFF;
delay_usec(pw);
PORTB=0x00;
delay_usec(sw);
}
}
// کم نور
for(i3=0;i3<=100;i3++)
{
pw-=10;
sw+=10;
for(i2=0;i2<5;i2++)
{
PORTB=0xFF;
delay_usec(sw);
PORTB=0x00;
delay_usec(pw);
}
}

اینم همونی که خواستی:
کد:
$regfile = "m32def.dat"
$crystal = 8000000

Config Portb = Output

Dim Pw As integer
Dim Sw As Integer
Dim I1 As Integer
Dim I2 As Integer
Dim I3 As Integer

Do
'por nor shodan
For I3 = 1 To 100
Pw = Pw + 10
Sw = Sw + 10
For I2 = 1 To 5
Portb = &HFF
Waitus Pw
Portb = &H00
Waitus Sw
Next I2
Next I3

'kam nor shodan
For I3 = 1 To 100
Pw = Pw - 10
Sw = Sw + 10
For I2 = 1 To 5
Portb = &HFF
Waitus Sw
Portb = &H00
Waitus Pw
Next I2
Next I3

Loop

End 'end program

بفرما اینم خدمت شما.
امید وارم کارتو راه بندازه.
( راستی این برنامه رو تو پیام خصوصی به من داد و منم با پیام خصوصی پاسخ دوستمون رو دادم ولی برای اینکه بقیه دوستان از این برنامه بهره ببرند اون رو هم اینجا گذاشتم ).
موفق باشید....HeartHeartHeart
نقل قول: شما نوشیتی پورت سی.0 درصورتی که واسه یک پایه باید بنویسی پین سی.0
نه مهندس .اصلا ربطی به این پورت نداره کلا از پورت c استفاده نمیکنم اگه این برنامه را تو نرم فزار بیسکام کپی کرده بودی میدیدی که اصلا پورت سی استفاده نشده وسبزه . خروجی برنامه فقط پورت a هست
نقل قول: خواهشن یه چک بکن و نتیجه را که کجا مشکل دارم بهم بگو
خودم با هزار زحمت نوشتم . البته موج تولید میشه ولی خوب نیست
این برنامه رو شما نوشتی؟
دلیل اینکه موج خوب تولید نمیشه همین پین و پورته.
سره همین موضوع 2روز از کارو زندگی افتادم.
خب این با pwm کار میکنه.
دوستمون گفت با pwm نمیخوام.
بعدشم من که اون برنامه رو ننوشتم.
من فقط اونو به بیسیک بر گردوندم.
و تستشم نکردم.
ولی دستت درد نکنه.;)
(۲۴-اسفند-۱۳۹۱, ۱۷:۵۰:۳۰)h.unique نوشته است: [ -> ]خب این با pwm کار میکنه.
دوستمون گفت با pwm نمیخوام.
بعدشم من که اون برنامه رو ننوشتم.
من فقط اونو به بیسیک بر گردوندم.
و تستشم نکردم.
ولی دستت درد نکنه.;)

حقیقتش من با بیسکام کار نکردم واین برنامه که دیدیت با سی نوشتم میخواستم به بیسکام برگردونم برای یکی از دوستان که با سی کار نمی کنه خواهشن اگه با بیسکام کار میکنی اینو برام برش گردون خودم اینو برگردوندم ولی خوب نشد چون زیاد با بیسکام کار نکردم ببیبن میتونی برگردونی اگه نه برم دنبال کارم ببینم میتونم برگردونم

نه مهخندس فکر کنم اصلا توجه نمیکنی وزود قضاوت میکنی این برنامه که با سی هست اصلا با pwm کار نداره و کار نمیکنه
خواهشن اگه با بیسکام کار میکنی اینو برام برش گردون به بیسکام
صفحه‌ها: 1 2