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

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

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

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


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


Перевод устройства с Timer0 на Timer1

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

1

Пытаюсь сделать диммер с управлением с пульта ДУ. Взял такой код:

Код:
$regfile = "attiny2313.dat"
$crystal = 8000000

Dim Lamp As Byte
Dim N As Bit
Config Int0 = Falling
On Int0 Imp

Config Timer0 = Timer , Prescale = 1024
Dim Wt As Byte
On Timer0 Perepolnenie

Config Pind.3 = Input
Config Portd.0 = Output
Opto Alias Portd.0
Opto = 0

Enable Interrupts
Enable Timer0
Start Timer0
Enable Int0
Wt = 195
N = 0
Do
If Pind.3 = 0 Then
Toggle N
If N = 1 Then
Lamp = 255
Else
Lamp = 185
End If
Waitms 700
End If

If N = 1 Then
Lamp = 255
Else
Lamp = 185
End If

Loop
End

Imp:
 Timer0 = Wt
 Start Timer0
If Lamp > Wt Then
 Incr Wt
 End If


 If Lamp < Wt Then
 Decr Wt
 End If
 Return
Return

Perepolnenie:
 Stop Timer0
 Opto = 1
 Waitus 100
 Opto = 0
Return

Детектор нуля на INT0. PIND.3 - симмистор
Мне нужно сделать прием сообщении с RC5. А RC5 хочет работать с timer0. Вопрос - как мне перевести диммирование на timer1?
http://avrproject.ru/publ/poleznaja_inf … /4-1-0-140

0

2

All text code: Timer0 > (replace) > Timer1 :D
Только Timer0 - 8 бит, а Timer1 - 16 бит, надо поменять/подобрать значения загружаемые в таймер и следовательно Wt будет Word.

0

3

а прерывания от 16 битного таймера будут происходить так же как от 8 битного?

Код:
$regfile = "attiny2313.dat"
$crystal = 8000000

Dim Lamp As Word
Dim N As Bit
Config Int0 = Falling
On Int0 Imp

Config Timer1 = Timer , Prescale = 1024
Dim Wt As Word
On Timer1 Perepolnenie

Config Pind.3 = Input
Config Portd.0 = Output
Opto Alias Portd.0
Opto = 0

Enable Interrupts
Enable Timer1
Start Timer1
Enable Int0
Wt = 47545
N = 0
Do
If Pind.3 = 0 Then
Toggle N
If N = 1 Then
Lamp = 65535
Else
Lamp = 47545
End If
Waitms 700
End If

Loop
End

Imp:
 Timer1 = Wt
 Start Timer1
If Lamp > Wt Then
 Wt = Wt + 257
 End If


 If Lamp < Wt Then
 Wt = Wt - 257
 End If
 Return
Return

Perepolnenie:
 Stop Timer1
 Opto = 1
 Waitus 100
 Opto = 0
Return

написал такой вот код. Но никакого плавного разгорания лампочки не получается- лампочка просто загорается или тухнет. В чем дело?

Отредактировано dossalab (2013-12-26 14:18:30)

0

4

Все заработало вот с таким вот кодом.

Код:
$regfile = "attiny2313.dat"
$crystal = 4000000

Dim Lamp As Word
Dim Wt As Word

Config Int0 = Falling
Config Portd.0 = Output
Config Timer1 = Timer , Prescale = 1

On Int0 Imp
On Timer1 Perepolnenie

Enable Interrupts
Enable Timer1
Enable Int0

Start Timer1

Wt = 30069

Do
Lamp = 65535
Wait 1
Lamp = 30069
Wait 1
Loop
End

Imp:
 Timer1 = Wt
 Start Timer1
If Lamp > Wt Then
 Wt = Wt + 257
 End If

 If Lamp < Wt Then
 Wt = Wt - 257
 End If
 Return
Return

Perepolnenie:
Portd.0 = 1
Waitus 100
Portd.0 = 0
Return

Всем спасибо за советы

Отредактировано dossalab (2013-12-26 22:38:58)

0

5

Хорошо, что заработало.
Но судя по "Prescale = 1" и коду:

Код:
Perepolnenie:
Portd.0 = 1
Waitus 100
Portd.0 = 0
Return

Не совсем корректно и весьма не красиво происходит отработка прерывания по таймеру. Из разряда глюка/повезло.
Получается, что таймер постоянно срабатывает и тормозит весь МК на 100 us, и этот код не выполняется за 1 такт процессора.
Иными словами, основное тело программы выполняется как бы по шагам (программное торможение всего МК)...это изначально неправильный подход к задаче ("куча" бесполезного кода).  :confused:

0

6

Что же делать?

0

7

По хорошему - поставить задачу и решить её своими силами (свой алгоритм).
Или - забить.)

0


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