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

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

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

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



RGB-ночник

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

1

Представляю на суд опчества свое творение. второе.
Ночник в детскую комнату. режимы: стартово выключен, только RGB и RGB+белая подсветка, переключаются коротким нажатием кнопки. длинное нажатие ведет к троекратному миганию красного цвета и выключению. некое подобие таймера выключает светильник через 1 час 15 минут (оставил детям и ушел, они уснули и свет сам погас)
код под светодиод с ОК (4мКд), МК ATiny-85 (просто он был у меня), питальник от Нокии 5В.
код:

$Regfile="attiny85.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32

Config Portb.0 = Output 'R
config portb.1 = output 'G
config portb.4 = output 'B
Config PORTB.3 = output 'белый свет
Config PINB.2 = input 'кнопка
Config PINB.5 = input
Set PINB.5 'подтяжка ресета

Config Int0 = Falling : On INT0 Button   'конфигурируем кнопку на прерывании 0
Config Timer1 = Timer , Prescale = 1 : On Timer1 Pwm_prog : Enable Timer1 : Enable Interrupts : start timer1 : Enable Int0
Dim S As Byte , A as Byte , C(3) as byte , B as Byte , R as Byte  , T as Byte , V as Byte ' , F as Byte

R=10  ' при включении питания все выключены
3: 'гасим всех
While R=10
C(1) = 0 : C(2) = 0 : C(3) = 0 : PORTB.3 = 0
Wend

V=0 : R=0
for A=0 to 63                            'увеличиваем красный
       C(1)=lookup(A , TAB_PWM)
      waitms 20
next

Do

If R=0 then
  PORTB.3 = 0
for A=0 to 63                            'увеличиваем зеленый
    if R=0 then
      C(2)=lookup(A , TAB_PWM)
      waitms 20
    else
    goto 1
    end if
next

for A=63 to 0 step -1                    'уменьшаем красный
       if R= 0 then
         C(1)=lookup(A , TAB_PWM)
         waitms 20
       else
       goto 1
       end if
next
waitms 100
for A=0 to 63                             'увеличиваем синий
    if R=0 then
      C(3)=lookup(A , TAB_PWM)
      waitms 20
    else
    goto 1
    end if
next

for A=63 to 0 step -1                     'уменьшаем зеленый
    if R=0 then
      C(2)=lookup(A , TAB_PWM)
      waitms 20
    else
    goto 1
    end if
next
waitms 100
for A=0 to 63                             'увеличиваем красный
       if R=0 then
         C(1)=lookup(A , TAB_PWM)
         waitms 20
       else
       goto 1
       end if
next

for A=63 to 0 step -1                     'уменьшаем синий
    if R=0 then
      C(3)=lookup(A , TAB_PWM)
      waitms 20
    else
    goto 1
    end if
next
waitms 200
V=V+1            'увеличиваем переменную
if V=225 then   'примерно полтора часа. один оборот цикла примерно 20 сек
R=10
goto 3
End if
end if

1:  'включаем белый свет
if R=10 then
C(2)=0 : C(3)=0 : C(1)=255       'мигаем о том, шо щас выключимся. пора отпускать кнопку
waitms 100
C(1)=0
waitms 100
C(1)=255
waitms 100
C(1)=0
waitms 100
C(1)=255
Goto 3
else
If R=1 Then PORTB.3 = 1
end if

loop

end

Pwm_prog:
Incr S

if S=255 then S=0

If S<C(1) Then Set Portb.0 Else Reset Portb.0

If S<C(2) then Set Portb.1 Else Reset Portb.1

If S<C(3) then Set Portb.4 Else Reset Portb.4

Return

Button:
If PINB.2 = 0 Then
   T=0           ' нажатие кнопки 1  +
  For B = 0 To 200
    Incr T
      If T > 110 Then R=10           ' долгое удержание кнопки 1
    If PINB.2 = 1 Then Exit For       ' Выходим из цикла подсчета времени удержания кнопки
     Waitms 10
  Next

   If T < 111 Then
      Incr R
      If R>1 then R=0       ' Если короткое нажатие кнопки 1
   End If
End If
GIFR = 64
Return

TAB_PWM:        'значения взяты из программы http://lightportal.at.ua/publ/dimmery/p … /7-1-0-125
Data 0 , 0 , 0 , 0 , 1 , 2 , 3 , 3 , 5 , 6 , 7 , 8 , 10 , 12 , 14 , 15
Data 17 , 20 , 22 , 24 , 27 , 30 , 32 , 35 , 38 , 42 , 45 , 48 , 52 , 56 , 59 , 63
Data 67 , 71 , 76 , 80 , 85 , 89 , 94 , 99 , 104 , 109 , 115 , 120 , 126 , 131 , 137 , 143
Data 149 , 155 , 161 , 168 , 174 , 181 , 188 , 195 , 202 , 209 , 216 , 224 , 231 , 239 , 247 , 255


http://s6.uploads.ru/t/Ipq9i.jpg

PS фьюзы вот просто по умолчанию, ничего менять не надо. делитель на 8 отключен, внутренний генератор на 8МГц

Отредактировано IDok (2017-06-27 18:34:39)

+2

2

большое спасибо всем, кто отвечал на мои вопросы. код явно требует оптимизации, но я уже выдохся :)
из неполучившегося - так и не удалось переводить МК в спящий режим. в итоге оставил как есть. итог:
упс, фоточки не выклались
http://sa.uploads.ru/t/efCMQ.jpg
http://sg.uploads.ru/t/R0QVW.jpg
http://s3.uploads.ru/t/Jo1pN.jpg
http://s0.uploads.ru/t/mGHIN.jpg
http://s1.uploads.ru/t/SVU6n.jpg

Отредактировано IDok (2017-06-29 17:15:38)

0

3

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

так и не удалось переводить МК в спящий режим


Чёй-то,   туточки усё расписано, правда в Attiny85 нема PowerSave, зато есть PowerDown, как раз Ваш случай, будете просыпаться от кнопочки.

0

4

R8 маловат... рискуете жизнью МК!
уж лучше поставьте составной транзистор, например КТ972

0

5

Александр Д. написал(а):

R8 маловат.

Учитывая что транзистор включен как эмиттерный повторитель. Входное сопротивление будет относительно велико. Не думаю что ток базы превысит 20 ма.

0

6

Александр Д.
R8 по большому счету тут вообще не нужен. вот если б нагрузка питалась от другого источника - то тогда да.

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

туточки усё расписано

да емае, у меня только от начала кода голова заболела  :D
в следующей версии доведу до конца. сперва вас, потом лампу  :D
белые диоды выпаяны с ленты. теоретически, можно их на один резистор примерно 18-20 Ом посадить, но я решил перебдеть (хотя пихать их в корпус было тяжко)

0

7

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

да емае, у меня только от начала кода голова заболела


Раздел  "Power Management and Sleep Modes" стр. 34 документации

Настроили регистр "PRR" и заснули "Power-down". Просыпаемся по прерыванию "INT0".

Рекомендации Atmel по поводу снижения потребления  стр. 36  "Minimizing Power Consumption"

0

8

А - Аптимизация
переработал предыдущий код, утоптал в Тини-13. Было больно. Сова плакала, глобус не хотел, но человек царь природы и все такое. занял все 100% памяти. Теперь белый свет вместо отдельных светодиодов включается сразу тремя цветами на максимальной яркости и таки реализовал IDLE. хотел прикрутить генератор случайных чисел, но только строчка X=RND(400) сходу отнимает 20% :( код для общего анода (что б ему икалось).
сам код:
$Regfile="attiny13a.dat"
$Crystal=9600000
$hwstack=32
$swstack=8
$framesize=8

Set PINB.5 'подтяжка ресета
DDRB=011101
Config Int0 = Low Level : On INT0 But   'конфигурируем кнопку на прерывании 0
Config Timer0 = Timer , Prescale = 1 : On Timer0 Pprog : Enable Timer0 : Enable Interrupts  :  Enable Int0
Dim S As Byte , A as Byte , C(3) as byte ,  R as Byte  , V as Byte , X as Byte , Y as Byte , T as Byte , B as Byte
Config Powermode =IDLE

2:
R=10 : V=0
stop timer0
set PORTB.0 : set portb.3 :set portb.2
While R=10
Power IDLE   ' при включении питания сразу спать до нажатия кнопки
Wend
Start Timer0

R=0 : X=1
for A=1 to 255
       C(X)=A
      waitms 10
next

Do
If R=0 then Gosub Pwm

if V=240 then  goto 2        ' задержка на выключение чуть больше часа

If R=1 Then                     'по короткому нажатию кнопки включаем все три цвета
C(2)=255: C(1)=255 : C(3)=255
end if

if R=10 then  'перед переходом в спящий режим трижды мигнем красным
C(2)=0: C(3)=0 : C(1)=255
waitms 50
C(1)=0
waitms 50
C(1)=255
waitms 50
C(1)=0
waitms 50
C(1)=255
goto 2
End if

loop

end

Pprog:
Incr S

If S>C(1) Then Set Portb.0 Else reset Portb.0

If S>C(2) then Set Portb.2 Else reset Portb.2

If S>C(3) then Set Portb.3 Else reset Portb.3

Return

But:
If PINB.1 = 0 Then
    T=0
For B = 0 To 200
Incr T
   If T > 110 Then R=10
   If PINB.1 = 1 Then Exit For
  Waitms 10
  Next

   If T < 111 Then
   Incr R
      If R>1 then R=0
      end if
end if
GIFR = 64
Return

Pwm:
X=X+1
Y=X-1
If X> 3 then X=1
  for A=1 to 255                         'увеличиваем
      if R>0 then return
     C(X)=A
     waitms 10
next
waitms 100
for A=255 to 1 step -1                    'уменьшаем
         if R>0 then return
         C(Y)=A
         waitms 10
next
waitms 100
V=V+1
Return

Отредактировано IDok (2017-07-07 08:08:02)

0