سلام، من یه مدتی هست که میخوام خودم موج مادون قرمز تولید کنم برا اینکه rc5 همین طور که خودتون میدونین خیلی سخته که اطلاعاتو درست رد و بدل کنه...
خلاصه من میخوام خودم موج 38 کیلو تولید کنم; اول رفتم سراغ تایمر معمولی و تقسیم کنننده رو 1 دادم و مقدار تایمرم با حساب اینکه 65430 = 106 - 65536 بدست آوردم که هر بار با سرریز شدن دوباره 65430 میشد، ولی وقتی تو پرئوتس اجراش کردم دیدم که هر سیکلش 64 میکرو ثانیه شد!

آقا ما هرچی سعی کردیم کوچیکش کنیم نشد که نشد

بعد رفتم رو pwm، ی کم سرچ کردم درموردش دیدم که تو مثالای C میگه که
(F(pwm)= clk\(prescale*time number که تو وقفه ی سرریز هر بار x رو یه عدد خاصی میکرد مثلا تو تایمر یک time number = 65536 - x بعد من همینو تو بسکام نوشتم ولی بازم 64 میکرو ثانیه بدست اومد....
سرتونو درد نیارم دیگه دارم روانی میشم از دست این میکرو و برنامه نویسی، لطفا کمک کنین فقط توضیح میخوام همین.
براچی وقتی مقدار تایمرو کاهش میدم، از یه حدی سیکل بزرگتر میشه؟
اصلن این rc5 چجوری این موجو تولید میکنه؟ آخه rc5 رو هم امتحان کردم 28 میکرو ثانیه بود سیکلش


[/size][/color]
خب دوستان، مثل اینکه کسی نتونست جواب من رو بده، ولی از اونجایی که من براحتی بیخیال چیزی نمیشم خودم گشتم و درمورد pwm تحقیق کردم و چنتا pdf که برا زبان c بود خوندم که زیاد شبیه بسکام نیس ولی تونستم با تغییر ریجستری ها موج 38khz خودمو درست کنم که اینجا فایل پرئوتس با کد بسکام برنامه ای که خودم درست کردم و مثل یه پروتکل کار میکنه
امیدوارم به دردتون بخوره و مثل من سرگردون نشید اینقدر، هرچند باید بگم که با روش تولید rc5 کلی فرق داره که این روش با دو پورت ocr1a و ocr1b کار میکنه ولی rc5 فقط ی پایه داره که یعنی اینکه هنوز جا واسه کار هست...
کسی اگه چیز بهتری داره یا پیدا کرد همین جا پست کنه لطفا
کد:
$regfile = "m8def.dat"
$crystal = 8000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Tccr1a = &B00000011
Tccr1b = &B00011001
Ocr1a = 210
Ocr1b = 80
Ddrb.1 = 1 : Set Portb.1
Ddrb.2 = 1 : Set Portb.2
Dim A As Byte , B As Byte , C As Bit , D As Byte , E As Byte , F(3) As Byte
A = 0 : C = 0
Ddrd.1 = 0 : Portd.1 = 1
Ddrd.2 = 0 : Portd.2 = 1
Ddrd.3 = 0 : Portd.3 = 1
Ddrd.4 = 0 : Portd.4 = 1
Do
Debounce Pind.1 , 0 , Al1
Debounce Pind.2 , 0 , Al2
Debounce Pind.3 , 0 , Al3
Debounce Pind.4 , 0 , Al4
Hh:
Loop
Al1:
F(1) = 1 : F(2) = 0 : F(3) = 0
Goto Leader
Al2:
F(1) = 0 : F(2) = 1 : F(3) = 0
Goto Leader
Al3:
F(1) = 0 : F(2) = 0 : F(3) = 1
Goto Leader
Al4:
F(1) = 1 : F(2) = 1 : F(3) = 0
Goto Leader
Leader:
D = 0
B = 0
Tccr1a = &B11110011
Waitus 1560
Tccr1a = &B00000011
B = 0
Waitus 364
Incr D
Goto Check
Address:
Tccr1a = &B11110011
Waitus 780
Tccr1a = &B00000011
Waitus 364
Incr D
Goto Check
Comm1:
Tccr1a = &B11110011
Waitus 390
Tccr1a = &B00000011
B = 0
Waitus 364
Incr D
Goto Check
Comm0:
Tccr1a = &B11110011
Waitus 390
Tccr1a = &B00000011
B = 0
Waitus 728
Incr D
Goto Check
Check:
Select Case D
Case 1
Goto Address
Case 2
If F(1) = 0 Then
Goto Comm0
Else
Goto Comm1
End If
Case 3
If F(2) = 0 Then
Goto Comm0
Else
Goto Comm1
End If
Case 4
If F(3) = 0 Then
Goto Comm0
Else
Goto Comm1
End If
Case 5
Goto Comm0
Case 6
Goto Hh
End Select
Frequency(Bascom+Prot)
سلام دوستان امروز تونستم با تغییر رجیستری TCCR1A و OCR1A فقط با یک پایه OCR1A موج 38khz رو تولید کنم...
فقط فرقش با اولی اینه که تو اولی duty cycle متغیره و میشه از رابطه ی DUTY CYCLE = OCR1B / OCR1A * 100 که تو مثال قبل میشه 80/210*100= 38.09 ولی در این مثالی که براتون میزارم میزان Duty cycle فقط 50 هستش و نمیشه تغییرش داد
تذکر : تو مثال اول هیچ وقت با Stop Timer1 کار نکنید که بعدش اگه Start Timer1 رو بزنین تداخل موج به وجود میاد
درمورد رجیستری TCCR1A و TCCR1B هم اگه کسی سوال داشت بپرسه شاید بتونم کمک کنم ولی بهتره خودتون بگردین پیدا کنینشون.
کد:
$regfile = "m8def.dat"
$crystal = 8000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Tccr1a = &B00000011
Tccr1b = &B00011001
Ocr1a = 104
Ddrb.1 = 1 : Set Portb.1
Ddrb.2 = 1 : Set Portb.2
Dim A As Byte , B As Byte , C As Bit , D As Byte , E As Byte , F(3) As Byte
A = 0 : C = 0
Ddrd.1 = 0 : Portd.1 = 1
Ddrd.2 = 0 : Portd.2 = 1
Ddrd.3 = 0 : Portd.3 = 1
Ddrd.4 = 0 : Portd.4 = 1
Do
Debounce Pind.1 , 0 , Al1
Debounce Pind.2 , 0 , Al2
Debounce Pind.3 , 0 , Al3
Debounce Pind.4 , 0 , Al4
Hh:
Loop
Al1:
F(1) = 1 : F(2) = 0 : F(3) = 0
Goto Leader
Al2:
F(1) = 0 : F(2) = 1 : F(3) = 0
Goto Leader
Al3:
F(1) = 0 : F(2) = 0 : F(3) = 1
Goto Leader
Al4:
F(1) = 1 : F(2) = 1 : F(3) = 0
Goto Leader
Leader:
D = 0
B = 0
Tccr1a = &B01000011
Waitus 1560
Tccr1a = &B00000011
B = 0
Waitus 364
Incr D
Goto Check
Address:
Tccr1a = &B01000011
Waitus 780
Tccr1a = &B00000011
Waitus 364
Incr D
Goto Check
Comm1:
Tccr1a = &B01000011
Waitus 390
Tccr1a = &B00000011
B = 0
Waitus 364
Incr D
Goto Check
Comm0:
Tccr1a = &B01000011
Waitus 390
Tccr1a = &B00000011
B = 0
Waitus 728
Incr D
Goto Check
Check:
Select Case D
Case 1
Goto Address
Case 2
If F(1) = 0 Then
Goto Comm0
Else
Goto Comm1
End If
Case 3
If F(2) = 0 Then
Goto Comm0
Else
Goto Comm1
End If
Case 4
If F(3) = 0 Then
Goto Comm0
Else
Goto Comm1
End If
Case 5
Goto Comm0
Case 6
Goto Hh
End Select