پاسخ : (برنامه بسکام)چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!! [آموزشی]
درود خدمت شما استاد عزیز :smile:
داداش ببخشید من این برنامه رو کپی کردم کامپایل کردم ریختم تو اتمگا 8 اما جوابی نگرفتم میشه یه بررسی کنید راستش با pwm کار نکردم از منطق برنامه زیاد سر در نمیارم اگه میشه الگوریتمشم توضیح بدید سپاس فراوان :nerd:
نوشته اصلی توسط سامان اسدی
پیش خودم گفتم که این سورس که اینقدر خوب جواب داده چرا با زبانهای دیگه (مثل بیسیک) ارائه ندادم ؟؟؟
به خاطر همین رفتم کدها رو به زبان بیسیک تبدیل کردم
با این وجود که خیلی وقت بود طرف بیسیک نرفته بودم و کلا" یادم رفته بود ولی آخرش موفق شدم کدها رو تبدیل کنم
سورس کد برای میکروهای ATmega16-32 به زبان بیسیک (بسکام)
سورس کد برای ATmega64-128 به زبان بیسیک(بسکام)
به دلیل درخواست زیاد برنامه برای ATmega8 ، این برنامه در تاریخ 93/2/11 اضاف شد
سورس کد برای ATmega8 به زبان بیسیک(بسکام)
یه موضوع خیلی مهم
دقیقا دو برنامه مثل هم هستند ولی موقع کامپایل کردن ، حافظه فلشی که برنامه بسکام اشغال میکنه تقریبا" دو برابر کدویژن هست
چراااااااا ؟؟؟؟
دوستان
اگر اشتباهی دیدید حتما بگید :applause:
با سپاس
موفق باشید
به خاطر همین رفتم کدها رو به زبان بیسیک تبدیل کردم
با این وجود که خیلی وقت بود طرف بیسیک نرفته بودم و کلا" یادم رفته بود ولی آخرش موفق شدم کدها رو تبدیل کنم
سورس کد برای میکروهای ATmega16-32 به زبان بیسیک (بسکام)
کد:
$regfile = "m16def.dat"
$crystal = 8000000
Led1 Alias Porta.0
Led2 Alias Porta.1
Led3 Alias Porta.2
Led4 Alias Porta.3
Led5 Alias Porta.4
Led6 Alias Porta.5
Led7 Alias Porta.6
Led8 Alias Porta.7
Led9 Alias Portc.7
Led10 Alias Portc.6
Led11 Alias Portc.5
Led12 Alias Portc.4
Led13 Alias Portc.3
Led14 Alias Portc.2
Led15 Alias Portc.1
Led16 Alias Portc.0
Led17 Alias Portd.7
Led18 Alias Portd.6
Led19 Alias Portd.5
Led20 Alias Portd.4
Led21 Alias Portd.3
Led22 Alias Portd.2
Led23 Alias Portd.1
Led24 Alias Portd.0
Led25 Alias Portb.7
Led26 Alias Portb.6
Led27 Alias Portb.5
Led28 Alias Portb.4
Led29 Alias Portb.3
Led30 Alias Portb.2
Led31 Alias Portb.1
Led32 Alias Portb.0
Max_var_pwm Alias 99
Dim Pwm(35) As Byte , A As Byte , X1 As Byte , X2 As Byte , X3 As Byte , X As Byte
A = Max_var_pwm
'Config All =============================================
'Config Timers
'Config Ports
Config Timer0 = Timer , Prescale = 8
Enable Compare0
On Compare0 T0
Ddra = 255
Ddrb = 255
Ddrc = 255
Ddrd = 255
' Timer/Counter 0 initialization
' Clock source: System Clock
' Clock value: 1000.000 kHz
' Mode: CTC top=OCR0
Tccr0 = &H0A
Ocr0 = 150
' Global enable interrupts
Enable Interrupts
'End Config ============================================
Do
For X1 = 0 To 24
Pwm(1) = Lookup(x1 , Rain1)
For X2 = 17 To 1 Step -1
X = X2 + 1
Pwm(x) = Pwm(x2)
Next X2
Waitms 40
Next X1
For X1 = 0 To 34
Pwm(1) = Lookup(x1 , Rain2)
For X2 = 17 To 1 Step -1
X = X2 + 1
Pwm(x) = Pwm(x2)
Next X2
Waitms 40
Next X1
For X1 = 0 To 24
Pwm(1) = Lookup(x1 , Rain3)
For X2 = 17 To 1 Step -1
X = X2 + 1
Pwm(x) = Pwm(x2)
Next X2
Waitms 40
Next X1
For X1 = 1 To 24
Pwm(17) = Lookup(x1 , Rain1)
For X2 = 1 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
Waitms 40
Next X1
For X1 = 0 To 34
Pwm(17) = Lookup(x1 , Rain2)
For X2 = 1 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
Waitms 40
Next X1
For X1 = 0 To 24
Pwm(17) = Lookup(x1 , Rain3)
For X2 = 1 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
Waitms 40
Next X1
For X3 = 1 To 3
For X1 = 0 To 13
For X2 = 1 To 7
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
For X2 = 17 To 10 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next X2
Pwm(8) = Lookup(x1 , Rain1)
Pwm(9) = Lookup(x1 , Rain1)
Waitms 40
Next X1
Next X3
For X3 = 1 To 3
For X1 = 0 To 13
For X2 = 8 To 2 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next
For X2 = 9 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next
Pwm(17) = Lookup(x1 , Rain1)
Waitms 40
Pwm(1) = Lookup(x1 , Rain1)
Next
Next
For X3 = 0 To 3
For X1 = 0 To 18
For X2 = 1 To 7
X = X2 + 1
Pwm(x2) = Pwm(x)
Next
For X2 = 17 To 10 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next
Pwm(8) = Lookup(x1 , Rain4)
Pwm(9) = Lookup(x1 , Rain4)
Waitms 40
Next
Next
For X3 = 0 To 3
For X1 = 0 To 18
For X2 = 8 To 2 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next
For X2 = 9 To 17
X = X2 - 1
Pwm(x2) = Pwm(x2 + 1)
Next
Pwm(1) = Lookup(x1 , Rain2)
Pwm(17) = Lookup(x1 , Rain2)
waitms 40
Next
Next
Loop
End 'end program
T0:
If A > 0 Then
If A = Pwm(1) Then Led1 = 1
If A = Pwm(2) Then Led2 = 1
If A = Pwm(3) Then Led3 = 1
If A = Pwm(4) Then Led4 = 1
If A = Pwm(5) Then Led5 = 1
If A = Pwm(6) Then Led6 = 1
If A = Pwm(7) Then Led7 = 1
If A = Pwm(8) Then Led8 = 1
If A = Pwm(9) Then Led9 = 1
If A = Pwm(10) Then Led10 = 1
If A = Pwm(11) Then Led11 = 1
If A = Pwm(12) Then Led12 = 1
If A = Pwm(13) Then Led13 = 1
If A = Pwm(14) Then Led14 = 1
If A = Pwm(15) Then Led15 = 1
If A = Pwm(16) Then Led16 = 1
If A = Pwm(17) Then Led17 = 1
If A = Pwm(18) Then Led18 = 1
If A = Pwm(19) Then Led19 = 1
If A = Pwm(20) Then Led20 = 1
If A = Pwm(21) Then Led21 = 1
If A = Pwm(22) Then Led22 = 1
If A = Pwm(23) Then Led23 = 1
If A = Pwm(24) Then Led24 = 1
If A = Pwm(25) Then Led25 = 1
If A = Pwm(26) Then Led26 = 1
If A = Pwm(27) Then Led27 = 1
If A = Pwm(28) Then Led28 = 1
If A = Pwm(29) Then Led29 = 1
If A = Pwm(30) Then Led30 = 1
If A = Pwm(31) Then Led31 = 1
If A = Pwm(32) Then Led32 = 1
End If
Decr A
If A = 255 Then
A = Max_var_pwm
Porta = 0
Portb = 0
Portc = 0
Portd = 0
End If
Return
Rain1:
Data 0 , 99 , 70 , 40 , 20 , 10 , 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Rain2:
Data 0 , 1 , 2 , 3 , 4 , 5 , 10 , 20 , 40 , 70 , 99 , 70 , 40 , 20 , 10 , 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Rain3:
Data 0 , 1 , 2 , 3 , 4 , 5 , 10 , 20 , 40 , 70 , 99 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Rain4:
Data 1 , 2 , 3 , 4 , 5 , 10 , 20 , 40 , 70 , 99 , 70 , 40 , 20 , 10 , 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
کد:
$regfile = "m64def.dat"
$crystal = 8000000
LED1 Alias Portf.0
LED2 Alias Portf.1
LED3 Alias Portf.2
LED4 Alias Portf.3
LED5 Alias Portf.4
LED6 Alias Portf.5
LED7 Alias Portf.6
LED8 Alias Portf.7
LED9 Alias Porta.0
LED10 Alias Porta.1
LED11 Alias Porta.2
LED12 Alias Porta.3
LED13 Alias Porta.4
LED14 Alias Porta.5
LED15 Alias Porta.6
LED16 Alias Porta.7
LED17 Alias Portg.2
LED18 Alias Portc.7
LED19 Alias Portc.6
LED20 Alias Portc.5
LED21 Alias Portc.4
LED22 Alias Portc.3
LED23 Alias Portc.2
LED24 Alias Portc.1
LED25 Alias Portc.0
LED26 Alias Portg.1
LED27 Alias Portg.0
LED28 Alias Portd.7
LED29 Alias Portd.6
LED30 Alias Portd.5
LED31 Alias Portd.4
LED32 Alias Portd.3
LED33 Alias Portd.2
LED34 Alias Portd.1
LED35 Alias Portd.0
LED36 Alias Portg.4
LED37 Alias Portg.3
LED38 Alias Portb.7
LED39 Alias Portb.6
LED40 Alias Portb.5
LED41 Alias Portb.4
LED42 Alias Portb.3
LED43 Alias Portb.2
LED44 Alias Portb.1
LED45 Alias Portb.0
LED46 Alias Porte.7
LED47 Alias Porte.6
LED48 Alias Porte.5
LED49 Alias Porte.4
LED50 Alias Porte.3
LED51 Alias Porte.2
LED52 Alias Porte.1
LED53 Alias Porte.0
Max_var_pwm Alias 99
Dim Pwm(55) As Byte , A As Byte , X1 As Byte , X2 As Byte , X3 As Byte , X As Byte
A = Max_var_pwm
'Config All =============================================
'Config Timers
'Config Ports
Config Timer0 = Timer , Prescale = 8
Enable Compare0
On Compare0 T0
Ddra = 255
Ddrb = 255
Ddrc = 255
Ddrd = 255
Ddre = 255
Ddrf = 255
Ddrg = 31
' Timer/Counter 0 initialization
' Clock source: System Clock
' Clock value: 1000.000 kHz
' Mode: CTC top=OCR0
Tccr0 = &H0A
Ocr0 = 150
' Global enable interrupts
Enable Interrupts
'End Config ============================================
Do
For X1 = 0 To 24
Pwm(1) = Lookup(x1 , Rain1)
For X2 = 17 To 1 Step -1
X = X2 + 1
Pwm(x) = Pwm(x2)
Next X2
Waitms 40
Next X1
For X1 = 0 To 34
Pwm(1) = Lookup(x1 , Rain2)
For X2 = 17 To 1 Step -1
X = X2 + 1
Pwm(x) = Pwm(x2)
Next X2
Waitms 40
Next X1
For X1 = 0 To 24
Pwm(1) = Lookup(x1 , Rain3)
For X2 = 17 To 1 Step -1
X = X2 + 1
Pwm(x) = Pwm(x2)
Next X2
Waitms 40
Next X1
For X1 = 1 To 24
Pwm(17) = Lookup(x1 , Rain1)
For X2 = 1 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
Waitms 40
Next X1
For X1 = 0 To 34
Pwm(17) = Lookup(x1 , Rain2)
For X2 = 1 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
Waitms 40
Next X1
For X1 = 0 To 24
Pwm(17) = Lookup(x1 , Rain3)
For X2 = 1 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
Waitms 40
Next X1
For X3 = 1 To 3
For X1 = 0 To 13
For X2 = 1 To 7
X = X2 + 1
Pwm(x2) = Pwm(x)
Next X2
For X2 = 17 To 10 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next X2
Pwm(8) = Lookup(x1 , Rain1)
Pwm(9) = Lookup(x1 , Rain1)
Waitms 40
Next X1
Next X3
For X3 = 1 To 3
For X1 = 0 To 13
For X2 = 8 To 2 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next
For X2 = 9 To 16
X = X2 + 1
Pwm(x2) = Pwm(x)
Next
Pwm(17) = Lookup(x1 , Rain1)
Waitms 40
Pwm(1) = Lookup(x1 , Rain1)
Next
Next
For X3 = 0 To 3
For X1 = 0 To 18
For X2 = 1 To 7
X = X2 + 1
Pwm(x2) = Pwm(x)
Next
For X2 = 17 To 10 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next
Pwm(8) = Lookup(x1 , Rain4)
Pwm(9) = Lookup(x1 , Rain4)
Waitms 40
Next
Next
For X3 = 0 To 3
For X1 = 0 To 18
For X2 = 8 To 2 Step -1
X = X2 - 1
Pwm(x2) = Pwm(x)
Next
For X2 = 9 To 17
X = X2 - 1
Pwm(x2) = Pwm(x2 + 1)
Next
Pwm(1) = Lookup(x1 , Rain2)
Pwm(17) = Lookup(x1 , Rain2)
waitms 40
Next
Next
Loop
End 'end program
T0:
If A > 0 Then
If A = Pwm(1) Then LED1 = 1
If A = Pwm(2) Then LED2 = 1
If A = Pwm(3) Then LED3 = 1
If A = Pwm(4) Then LED4 = 1
If A = Pwm(5) Then LED5 = 1
If A = Pwm(6) Then LED6 = 1
If A = Pwm(7) Then LED7 = 1
If A = Pwm(8) Then LED8 = 1
If A = Pwm(9) Then LED9 = 1
If A = Pwm(10) Then LED10 = 1
If A = Pwm(11) Then LED11 = 1
If A = Pwm(12) Then LED12 = 1
If A = Pwm(13) Then LED13 = 1
If A = Pwm(14) Then LED14 = 1
If A = Pwm(15) Then LED15 = 1
If A = Pwm(16) Then LED16 = 1
If A = Pwm(17) Then LED17 = 1
If A = Pwm(18) Then LED18 = 1
If A = Pwm(19) Then LED19 = 1
If A = Pwm(20) Then LED20 = 1
If A = Pwm(21) Then LED21 = 1
If A = Pwm(22) Then LED22 = 1
If A = Pwm(23) Then LED23 = 1
If A = Pwm(24) Then LED24 = 1
If A = Pwm(25) Then LED25 = 1
If A = Pwm(26) Then LED26 = 1
If A = Pwm(27) Then LED27 = 1
If A = Pwm(28) Then LED28 = 1
If A = Pwm(29) Then LED29 = 1
If A = Pwm(30) Then LED30 = 1
If A = Pwm(31) Then LED31 = 1
If A = Pwm(32) Then LED32 = 1
If A = Pwm(33) Then LED33 = 1
If A = Pwm(34) Then LED34 = 1
If A = Pwm(35) Then LED35 = 1
If A = Pwm(36) Then LED36 = 1
If A = Pwm(37) Then LED37 = 1
If A = Pwm(38) Then LED38 = 1
If A = Pwm(39) Then LED39 = 1
If A = Pwm(40) Then LED40 = 1
If A = Pwm(41) Then LED41 = 1
If A = Pwm(42) Then LED42 = 1
If A = Pwm(43) Then LED43 = 1
If A = Pwm(44) Then LED44 = 1
If A = Pwm(45) Then LED45 = 1
If A = Pwm(46) Then LED46 = 1
If A = Pwm(47) Then LED47 = 1
If A = Pwm(48) Then LED48 = 1
If A = Pwm(49) Then LED49 = 1
If A = Pwm(50) Then LED50 = 1
If A = Pwm(51) Then LED51 = 1
If A = Pwm(52) Then LED52 = 1
If A = Pwm(53) Then LED53 = 1
End If
Decr A
If A = 255 Then
A = Max_var_pwm
Porta = 0
Portb = 0
Portc = 0
Portd = 0
Porte = 0
Portf = 0
Portg = 0
End If
Return
Rain1:
Data 0 , 99 , 70 , 40 , 20 , 10 , 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Rain2:
Data 0 , 1 , 2 , 3 , 4 , 5 , 10 , 20 , 40 , 70 , 99 , 70 , 40 , 20 , 10 , 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Rain3:
Data 0 , 1 , 2 , 3 , 4 , 5 , 10 , 20 , 40 , 70 , 99 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Rain4:
Data 1 , 2 , 3 , 4 , 5 , 10 , 20 , 40 , 70 , 99 , 70 , 40 , 20 , 10 , 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
سورس کد برای ATmega8 به زبان بیسیک(بسکام)
کد:
$regfile = "m8def.dat"
$crystal = 8000000
Led1 Alias portd.0
Led2 Alias portd.1
Led3 Alias portd.2
Led4 Alias portd.3
Led5 Alias portd.4
Led6 Alias Portb.6
Led7 Alias Portb.7
Led8 Alias Portd.5
Led9 Alias Portd.6
Led10 Alias Portd.7
Led11 Alias Portb.0
Led12 Alias Portb.1
Led13 Alias Portb.2
Led14 Alias Portb.3
Led15 Alias Portb.4
Led16 Alias Portb.5
Led17 Alias Portc.0
Led18 Alias Portc.1
Led19 Alias Portc.2
Led20 Alias Portc.3
Led21 Alias Portc.4
Led22 Alias Portc.5
Max_var_pwm Alias 99
Max_led Alias 22
Delay1 Alias 20
'ms
Delay2 Alias 200
'ms
Dim Pwm(35) As Byte , A As Byte , _
Y2 As Byte , _
X1 As Byte , X2 As Byte , X3 As Byte
Y2 = Max_led + Max_led
A = Max_var_pwm
'Config All =============================================
'Config Timers
'Config Ports
Config Timer0 = Timer , Prescale = 8
Enable Interrupts
Enable Timer0
On Ovf0 T0
Tcnt0 = 105
Start Timer0
Ddrb = 255
Ddrc = 63
Ddrd = 255
'End Config ============================================
Do
X1 = 0
While X1 < Y2
X2 = Max_led
While X2 > 1
X3 = X2 - 1
Pwm(x2) = Pwm(x3)
Decr X2
Wend
Pwm(1) = Lookup(x1 , Rain)
Waitms Delay1
Incr X1
Wend
Waitms Delay2
Loop
End 'end program
T0:
Tcnt0 = 105
If A > 0 Then
If A = Pwm(1) Then Led1 = 1
If A = Pwm(2) Then Led2 = 1
If A = Pwm(3) Then Led3 = 1
If A = Pwm(4) Then Led4 = 1
If A = Pwm(5) Then Led5 = 1
If A = Pwm(6) Then Led6 = 1
If A = Pwm(7) Then Led7 = 1
If A = Pwm(8) Then Led8 = 1
If A = Pwm(9) Then Led9 = 1
If A = Pwm(10) Then Led10 = 1
If A = Pwm(11) Then Led11 = 1
If A = Pwm(12) Then Led12 = 1
If A = Pwm(13) Then Led13 = 1
If A = Pwm(14) Then Led14 = 1
If A = Pwm(15) Then Led15 = 1
If A = Pwm(16) Then Led16 = 1
If A = Pwm(17) Then Led17 = 1
If A = Pwm(18) Then Led18 = 1
If A = Pwm(19) Then Led19 = 1
If A = Pwm(20) Then Led20 = 1
If A = Pwm(21) Then Led21 = 1
If A = Pwm(22) Then Led22 = 1
End If
Decr A
If A = 255 Then
A = Max_var_pwm
Portb = 0
Portc = 0
Portd = 0
End If
Return
Rain:
Data 99 , 80 , 70 , 60 , 40 , 20 , 15 , 9 , 7 , 5 , _
3 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , _
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
دقیقا دو برنامه مثل هم هستند ولی موقع کامپایل کردن ، حافظه فلشی که برنامه بسکام اشغال میکنه تقریبا" دو برابر کدویژن هست
چراااااااا ؟؟؟؟
دوستان
اگر اشتباهی دیدید حتما بگید :applause:
با سپاس
موفق باشید

داداش ببخشید من این برنامه رو کپی کردم کامپایل کردم ریختم تو اتمگا 8 اما جوابی نگرفتم میشه یه بررسی کنید راستش با pwm کار نکردم از منطق برنامه زیاد سر در نمیارم اگه میشه الگوریتمشم توضیح بدید سپاس فراوان :nerd:






برنامه PWM را برای یک LED در صورت امکان بنویسید و کمی در خصوص رجیستر TCNT0 نیز توضیح بفرمایید. با تشکر فراوان
دیدگاه