Гуру Bascoma помогите пожалуйста кодом
Собственно дано: Atmega8 на PinD6-кнопка на PinD7-светодиод. При нажатии на кнопку светодиод должен плавно набрать яркость и остаться в таком состоянии.
Спасибо за помощь. С уважением.
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » помогите с програмным шим
Гуру Bascoma помогите пожалуйста кодом
Собственно дано: Atmega8 на PinD6-кнопка на PinD7-светодиод. При нажатии на кнопку светодиод должен плавно набрать яркость и остаться в таком состоянии.
Спасибо за помощь. С уважением.
Выход шим соответственно pinb.1 pinb.2 - если исп. таймер 1 или pinb.3 - на таймере 2. Кнопка на прерывании INT0 - pind.2
вот простенькая программа на таймере2
-----------------------------------------------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
Dim I As Byte
Config Int0 = Low Level
Config Portb.3 = Output
Tccr2 = &B01101100
ocr2 = 0
Enable Int0
Enable Interrupts
On Int0 Set_pwm
Do
nop 'можно еще ченить воткнуть)
Loop
End
Set_pwm:
For I = 0 To 250 Step 10 'здесь можно подбирать параметры шага чтобы обеспечить необходимую скорость-плавность зажигания изменяя задержку(5мс) и шаг (10)
Ocr2 = I
Waitms 5
Next
Return
-----------------------------------------------------------------------------------------------
в tccr2 последние три бита 01101xxx устанавл. частоту шим 000 - коэф 1, 001 - 8 итд,можно в даташите глянуть., чем выше коэф - тем ниже частота/ Например при ххх=101 частота 244Гц
у меня таймеры уже заняты 
спасибо!
Где бы доступно про шим и таймеры почитать, и как в bascom этип пользоваться никак что-то вьехать не могу...
Хочу простенькую програмку написать atmega 32. В зависимости от напряжении на входе (ADC) меняется яркость LED. Никто не набросает ?
$regfile = "m32def.dat" ' используем atmega 32 $crystal = 8000000 Config Lcdpin = Pin , Rs = Porta.5 , E = Porta.4 , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 Config Lcd = 16 * 2 Config Portb.3 = Output ' подключаем LED к Portb.3 Tccr0 = 107 ' fast PWM clear oc0 on compare match clk/64 Config Adc = Single , Prescaler = Auto , Reference = Avcc 'конфигурация АЦП Dim W As Word Dim V As Single Dim U As String * 10 Dim Ch As Byte Dim Cor As Byte Dim A As Word Cursor Off Cls Do Declare Sub N() Ch = 7 ' к ыываду PA7 цепляем средний вывод потенциометра , два других на GND и VCC Call N() A = W / 10 ' нормируем величину, дело в том что уже при порядка 500-600 единиц Getadc(ch) LED достигает насыщения Cor = A Ocr0 = Cor ' при достиженни вличины cor (соответствующей Getadc(ch) - пропорциональна напрящению на PA7, которое пропорционально углу поворота потенциометра) на выводе Oc0 устанавливается 0 Locate 1 , 1 Lcd "Voltage:" ; W ; " V" ' попутно выводим значение напряжения PA7 на LCD в вольтах Waitms 100 Loop End Sub N() Start Adc W = Getadc(ch) V = W * 5 V = V / 1023 U = Fusing(v , "#.##") ' нормируем величну adc 1024 = 5.00 вольт End Sub
Понятно, люди занятые, всяким чайникам отвечать не сруки, для таких, как я привожу свой вариант
Отредактировано THX1138 (2011-01-06 20:35:14)
А может у кого завалялся маленький не нужный кусочек программки для программного 3х фазного или однофазного ШИМ? Мне бы взглянуть на реализацию, а дальше я сам... )
Может так:
Кстати, как раз давно взглянул на этот кусок кода и реализовал для друга моргалку в его световом коробе.
Вот видео:
Правда на видео нет такого мерцания, оно как бы сглажено качеством мобилы, а так на деле красотища!
Вроде он исходник:
$regfile = "attiny2313a.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Portb = Output
Config Portd = Output
Dim P As Byte 'цикл-1
Dim O As Byte 'цикл-2
Dim Sp1 As Byte 'скорость циклов
Dim Sp2 As Byte 'скорость циклов эталон
Dim Tr1 As Byte 'тригер 1
Dim Tr2 As Byte
Dim Tr3 As Byte
Dim Cveta As Byte
Dim Paus1 As Byte
'P1 Alias Portb.0
'P2 Alias Portb.1
'P3 Alias Portb.2
'P4 Alias Portb.3
'P5 Alias Portb.4
'P6 Alias Portb.5
'P7 Alias Portb.6
'P8 Alias Portb.7
Cv1 Alias Portd.4
Cv2 Alias Portd.5
Cv3 Alias Portd.6
Sp1 = 190
Goto F:
Vrash1:
Portb = 160
Waitms Paus1
Portb = 10
Waitms Paus1
Portb = 80
Waitms Paus1
Portb = 5
Waitms Paus1
Return
Porti1:
Portd = Rnd(255)
Portb = Rnd(255)
Waitms Paus1
Return
Cvet2:
Portd = 0
If Cveta = 1 Then Portd = 16
If Cveta = 2 Then Portd = 32
If Cveta = 3 Then Portd = 64
If Cveta = 4 Then Portd = 48
If Cveta = 5 Then Portd = 96
If Cveta = 6 Then Portd = 112
Return
F:
P = P + 1
If O = 1 And P = 1 Then
Tr1 = Tr1 + 1
If Tr1 => 18 Then Tr1 = 1
End If
If P => Sp1 Then P = 0 : O = O + 1
If O => Sp1 Then O = 1
If Tr1 < 10 And Sp2 = 0 Then Sp1 = 190
If Tr1 < 10 And Sp2 = 1 Then Sp1 = 130
If Tr1 < 10 And Sp2 = 2 Then Sp1 = 70
If Tr1 < 10 And Sp2 >= 3 Then Sp1 = 30
'--------------------------------------------------------
If Tr1 = 1 Then
Cveta = 1 : Gosub Cvet2:
If P > O Then
Portb = 15
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 2 Then
Cveta = 1 : Gosub Cvet2:
If P > O Then
Portb = 255
Else
Portb = 15
End If
End If
'--------------------------------------------------------
If Tr1 = 3 Then
Cveta = 1 : Gosub Cvet2:
If P < O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 4 Then
Cveta = 1 : Gosub Cvet2
If P > O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 5 Then
Cveta = 1 : Gosub Cvet2
If P < O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 6 Then
Cveta = 4 : Gosub Cvet2
If P > O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 7 Then
Cveta = 4 : Gosub Cvet2
If P < O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 8 Then
Cveta = 1 : Gosub Cvet2 :
If P > O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 9 Then
Cveta = 3 : Gosub Cvet2
Portb = 255
O = 254 : Tr1 = 10
End If
'--------------------------------------------------------
If Tr1 = 10 Then
For Paus1 = 1 To Sp1 Step 5
Gosub Vrash1:
Next Paus1
Cveta = 1 : Gosub Cvet2
For Paus1 = Sp1 To 1 Step -5
Gosub Vrash1:
Next Paus1
Cveta = 4 : Gosub Cvet2
For Paus1 = 1 To Sp1 Step 5
Gosub Vrash1:
Next Paus1
Cveta = 5 : Gosub Cvet2
For Paus1 = 1 To Sp1 Step 5
Gosub Vrash1:
Next Paus1
Cveta = 1 : Gosub Cvet2
For Paus1 = 1 To Sp1 Step 5
Gosub Vrash1:
Next Paus1
Cveta = 4 : Gosub Cvet2
For Paus1 = 1 To Sp1 Step 5
Gosub Vrash1:
Next Paus1
Cveta = 3 : Gosub Cvet2
For Paus1 = 1 To Sp1 Step 5
Gosub Vrash1:
Next Paus1
O = 254 : Tr1 = 11
Cveta = 6
Gosub Cvet2 : Portb = 255
Wait 15
End If
'--------------------------------------------------------
If Tr1 = 11 Then
Sp1 = 230
Cveta = 1 : Gosub Cvet2
If P > O Then
Portb = 240
Else
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 12 Then
Sp1 = 230
Cveta = 2 : Gosub Cvet2
If P > O Then
Portb = 255
Else
Portb = 240
End If
End If
'--------------------------------------------------------
If Tr1 = 13 Then
Sp1 = 230
If P < O Then
Portb = 255
Cveta = 1 : Gosub Cvet2
Else
Cveta = 3 : Gosub Cvet2
Portb = 255
End If
End If
'--------------------------------------------------------
If Tr1 = 14 Then
Sp1 = 230
If P < O Then
Portb = 255
Cveta = 4 : Gosub Cvet2
Else
Cveta = 1 : Gosub Cvet2
Portb = 255
End If
End If
'--------------------------------------------------------
If Tr1 = 15 Then
Sp1 = 230
If P < O Then
Portb = 255
Cveta = 4 : Gosub Cvet2
Else
Cveta = 0 : Gosub Cvet2
Portb = 0
End If
End If
'--------------------------------------------------------
If Tr1 = 16 Then
For Paus1 = 230 To 23 Step -3
Gosub Porti1
Next Paus1
For Paus1 = 3 To 230 Step 3
Gosub Porti1
Waitms Paus1
Next Paus1
Tr1 = 17
Cveta = Sp2 + 1 : Gosub Cvet2 : Portb = 255
Sp2 = Sp2 + 1
If Sp2 = 6 Then Sp2 = 0
Wait 26
End If
'--------------------------------------------------------
If Tr1 = 17 Then
Sp1 = 90
Cveta = Sp2 + 1 : Gosub Cvet2
If P < O Then
Portb = 255
Else
Portb = 0
End If
End If
'--------------------------------END--------------------
Goto F:Алиасы глючили, пришлось убрать, память МК почему-то в этом коде подошла к концу, пришлосьоптимизировать в меру опыта.
И схемка, конечно оптопару можно убрать, но она валялась не нужная от COM порта ИБП, приспособил.
А теперь нужно более шустрое и управляемое, да ещё 3х фазное (
Отредактировано Ev3658 (2013-05-25 01:22:19)
мда, схема как-то странно сделана + чот намудрили
в 2313 есть 4 аппаратных шима, можно было 3 использовать на RGB, а остальное управление по разным портам внутри собирать в одной подпрограмме, места думаю бы код занимал значительно меньше
мда, схема как-то странно сделана + чот намудрили
в 2313 есть 4 аппаратных шима, можно было 3 использовать на RGB, а остальное управление по разным портам внутри собирать в одной подпрограмме, места думаю бы код занимал значительно меньше
Когда собирал, знания Баскома было почти нулевое. А с аппаратным шим ещё не доводилось работать, их нужно 6ть. а такого девайса нету (
Отредактировано Ev3658 (2013-05-26 19:29:15)
их нужно 6ть. а такого девайса нету (
Например ATmega48.
Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » помогите с програмным шим