Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » помогите с програмным шим


помогите с програмным шим

Сообщений 1 страница 9 из 9

1

Гуру Bascoma помогите пожалуйста кодом

Собственно дано: Atmega8 на PinD6-кнопка на PinD7-светодиод. При нажатии на кнопку светодиод должен плавно набрать яркость и остаться в таком состоянии.

Спасибо за помощь. С уважением.

0

2

Выход шим соответственно 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Гц

0

3

у меня таймеры уже заняты  :(

0

4

спасибо!

0

5

Где бы доступно про шим и таймеры почитать, и как в 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)

0

6

А может у кого завалялся маленький не нужный кусочек программки для программного 3х фазного или однофазного ШИМ? Мне бы взглянуть на реализацию, а дальше я сам... )

Mrshilov написал(а):

Может так:

Кстати, как раз давно взглянул на этот кусок кода и реализовал для друга моргалку в его световом коробе.
Вот видео:

Правда на видео нет такого мерцания, оно как бы сглажено качеством мобилы, а так на деле красотища!

Вроде он исходник:

Код:
$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 порта ИБП, приспособил.
http://cs413624.vk.me/v413624961/6f1/uHOFp5h9zno.jpg

А теперь нужно более шустрое и управляемое, да ещё 3х фазное (

Отредактировано Ev3658 (2013-05-25 01:22:19)

0

7

мда, схема как-то странно сделана + чот намудрили
в 2313 есть 4 аппаратных шима, можно было 3 использовать на RGB, а остальное управление по разным портам внутри собирать в одной подпрограмме, места думаю бы код занимал значительно меньше

0

8

RDW написал(а):

мда, схема как-то странно сделана + чот намудрили
в 2313 есть 4 аппаратных шима, можно было 3 использовать на RGB, а остальное управление по разным портам внутри собирать в одной подпрограмме, места думаю бы код занимал значительно меньше

Когда собирал, знания Баскома было почти нулевое. А с аппаратным шим ещё не доводилось работать, их нужно 6ть. а такого девайса нету (

Отредактировано Ev3658 (2013-05-26 19:29:15)

0

9

Ev3658 написал(а):

их нужно 6ть. а такого девайса нету (

Например ATmega48.

0


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » помогите с програмным шим