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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » DC-CDI на attiny2313


DC-CDI на attiny2313

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

1

Доброго времени суток всем:
На моем многострадальном мото спеклись мозги, немного порывшись в нете, нашел схему DC-CDI на at89c2051.

http://bikerpub.ath.cx/cdi/gb89c2051.htm

Схему и печатку взял оттуда, at89c2051 заменил на attiny2313, кварц с 24MHz заменил на 20, подтяжку на сброс перекинул на плюс, в остальном, все оставил так же.
Входной импульс определяю по  аналоговому компаратору, от этого же импульса начинаю отсчет до следующего, и формирую ипульс на PD.5 через 0.15245 от таймера1
Накидал следующий алгоритм:

$regfile = "attiny2313.dat"
$crystal = 20000000
Waitms 500
Config Aci = On , Trigger = Falling
Config Timer1 = Timer , Prescale = 64
Enable Interrupts
Enable Aci
Enable Timer1
Dim I As Word
Dim T As Word
Dim J As Single
On Aci Calc
On Timer1 Pulse
Config Portd.5 = Output
Portd.5 = 1
Stop Timer1

Do
Wait 1000
Loop

Calc:
Stop Timer1
J = Timer1 * 0.15245
T = 65536 - J
Timer1 = T
Start Timer1

Return

Pulse:
Stop Timer1
Portd.5 = 0
Waitus 400
Portd.5 = 1
Return

End

Все ок, работает как надо,

http://www.youtube.com/watch?v=xnwkEr6kR98

но есть один косяк:
через минуту работы на постоянных оборотах, может внезапно остановиться, или начать работать через импульс.
или все же 89c2051 выбрана не случайно?
Где могут быть грабли?

Заранее спасибо!

Отредактировано demonizer (2010-12-03 20:07:04)

0

2

1 Нельзя выполнять арифм.  действия с переменными разного типа без отдельной операции преобразования. Иногда работает, но это не гарантируется.
2 При таком стиле написания 128 байт ОЗУ может не хватить! Может быть неприятности со стеком?
3 Опять применен пустой главный цикл - прерывание не место для выпонения всех действий. Там нужно делать только захват значения таймера и сообщать его главной программе. Она посчитает и назначит время следующего импульса.
4 Но дело не этом - у тебя косой алгоритм. На постоянных оборотах, а они, на самом деле, дрожат - время измеренное на предыдущем обороте Т(n-1) оказывается не равным времени следующего оборота T(n). Если T(n-1)<T(n), то естественно, на одном цикле происходит два зажигания, а на другом ни одного. И тебе кажется, что пропускается импульс. Должна быть построена инерционная система:
- т.е темп выдачи импульсов зажигания должен быть определен аппаратным ШИМ, например таймера 1 (частота - длительностью, фаза - скважностью);
- таймер 0, пусть работает в системе измерения частоты оборотов и синхронизирует фазу ШИМ по тахо-датчику (установливает таймер 1 в нуль);
- главная программа, получив измеренное значение частоты оборотов устанавливает параметры ШИМ, но с замедляющим коэффициентом 0.05 - 0.2 (не за один период) .  Тогда все будет работать как часы.

0

3

Еще дополнение (для тех, кто не понял). Речь идет о корректре угла опережения зажигания. Он сбоит на малых оборотах, когда угол опережения мал (6 градусов или 0.015 от периода оборота). Если следующий оборот более быстрый, то значение времени срабатывания, взятое для предыдущего более медленного не достигается в таймере вообще. Естественно никакого импульса не происходит.

+1

4

ох, завтра попробую разобраться, спасибо.

0

5

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

При таком стиле написания 128 байт ОЗУ может не хватить! Может быть неприятности со стеком?

можно пояснить немного? что есть стиль?

0

6

стиль,
имеется в виду, что некоторые операции вроде работы с запятой потребляют много памяти мк - код генерируется ну очень объёмный

0

7

ну а как без этого? к сожалению, расположение датчика такое, что без дробных переменных не обойтись

dmm
по первому ответу:
т.е. нужно так?
Dim I As Word
Dim T As Word
Dim J As Single

J = Timer1 * 0.15245
I=J
T = 65536 - I

Переменная I Введена не случайно, изначально код выглядел так, как описано выше, потом я убрал I - разницы никакой
или даже так?

Dim I As Word
Dim T As Word
Dim J As Single
Dim K AS Single

k= timer1
J = k * 0.15245
I=J
T = 65536 - I

Отредактировано demonizer (2010-12-04 15:42:21)

0

8

Получилось как-то так:

$regfile = "attiny2313.dat"
$crystal = 20000000
$hwstack = 32
$swstack = 10
$framesize = 40

Waitms 500

Config Aci = On , Trigger = Falling
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 64
Stop Timer1

Enable Interrupts
Enable Aci
Enable Timer1
Enable Timer0

On Aci Capt
On Timer1 Pulse
On Timer0 Tmr0

Config Portd.5 = Output
Portd.5 = 1

Dim T As Word
Dim I As Word
Dim J As Single
Dim K As Single

Do
Waitus 300
   Portd.5 = 1
   T = I * 256
   T = T + Timer0
   K = T
   J = K * 0.151
   T = J
   T = 65536 - T
Loop

Capt:
   Timer1 = T
   Start Timer1
   I = 0
   Timer0 = 0
Return

Pulse:
   Portd.5 = 0
   Stop Timer1
Return

Tmr0:
   Incr I
Return

End

не помрет камень от таких действий в прерываниях? или он может только светодиодом мигать?  :shine:

Отредактировано demonizer (2010-12-04 19:07:24)

0

9

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

не помрет камень от таких действий в прерываниях

А разве там выполняется что-то такое, что может привести к электрическим конфликтам в МК или схеме?

0

10

ну, мало ли,
я про это:

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

При таком стиле написания 128 байт ОЗУ может не хватить!

Мне казалось, компилятор должен был выдать ошибку, что -то типа out of RAM при таком раскладе
короче, алгоритм все равно рубится((( причем, закономерности не наблюдается, может стать в любой момент

Отредактировано demonizer (2010-12-04 21:12:05)

0

11

с линии ресета электролит С5 убрать
и добавить 0.1мкф на землю

0

12

EdGull
Ешкин кот, совсем забыл! у меня он вообще в воздухе висит! o.O

0

13

нет тебе прощенья, только смерть смоет твой позор! )))

0

14

EdGull
:tomato:
Попутно вопрос, кварц с металлическим корпусом нужно заземлять? я это делаю, но не знаю, есть ли необходимость. фильтрующие кондюки присутствуют

0

15

кстати, этож автотема, поставь параллельно С6 диод шоттки анодом на землю.

0

16

EdGull
ок, а какие еще есть рекоммендации по фильтрации нестабильного питания?
Я как-то задавал этот вопрос, да так он и остался без ответа, ограничиваюсь емкостями до и после стабилизатора и диодом перед стабилизатором.

0

17

кстати, а где кондеры 0,1 и полярник по питанию тиньки?

0

18

по питанию 0,1 после кренки, электролита - нема(
раз такое дело, что лучше? керамика или пленочные? для фильтров по питанию тиньки

Отредактировано demonizer (2010-12-04 21:59:09)

0

19

0,1 после кренки это для  кренки
а для тиньки нужен свой 0.1, чем ближе к ногам тиньки тем лучше.
только керамика

+1

20

EdGull респект и уважуха! чтож, буду пробовать

0

21

исчо приходи )

0

22

EdGull
я еще и не ухожу))) баском осваивать начал совсем недавно, выбрал его потому, что в школе Qbasic изучал))) Сейчас такому не учат)))

0

23

эт ты маладца!
главное не сдавайся!

0

24

EdGull
а по кварцу как? спаси и заземли?

внес корректировки в железо, будем попробовать

Отредактировано demonizer (2010-12-04 22:44:03)

0

25

если кварец для запайки земли не предназначен, землю не цеплять.

0

26

ок, отцепляю), спасибо тебе, добрый человек)

0

27

( все равно, рубится :tired:

0

28

реальную схему в студию

0

29

Схема в ссылке в первом посте
http://bikerpub.ath.cx/cdi/fichiers/atmel/schema89C.png
Вместо R15 4k7 кондюк 0,1, вместо С5 - резистор 10k, параллельно C6 шотка, на первом пине тиньки кондюк 0,1, все, печатка с сайта, все номиналы соблюдены
у тиньки и 2051 AIN0, AIN1, T1, RESET и питание на одних и тех же ногах

Отредактировано demonizer (2010-12-05 00:18:11)

0

30

1 Делаешь успехи! В принципе движешься правильно.
2 Каждое прерывание, написанное на Bascomе, забирает 35 ячеек памяти из стека. плюс служебная область - 16 байт для преобразования плавающего в целое и обратно. Однако, так-как програма простая, не применяются ресурсоемкие преобразования и переменных мало, то, думаю, остается байт 30-40 свободных. это я заметил, чтобы ты вспомнил о размере ОЗУ.
3 Без плавающей точки тоже можно обойтись - делаешь все числа в 100 или 1000 раз больше и дели-умножай без потери точности.
4 Когда используешь прерывания нежелательно, а лучше и совсем не допускать изменения одних и тех же переменных в обоих частях программы. Когда выполняешь программу прерывания, ты гарантирован от изменения переменной главной программой, в главной программе нет. Как разделить действия - главная программа начинает действия только по команде, полученной из программы прерывания. это осуществляет переменная-флаг, установки которой в главном цикле ждет главная программа. Не обсуждая оптимальность алгоритма - это должно выглядеть приблизительно так:

$regfile = "attiny2313.dat"
$crystal = 20000000
$hwstack = 32
$swstack = 10
$framesize = 40

Waitms 500

Config Aci = On , Trigger = Falling
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 64
Stop Timer1

Enable Interrupts
Enable Aci
Enable Timer1
Enable Timer0

On Aci Capt
On Timer1 Pulse
On Timer0 Tmr0

Config Portd.5 = Output
Portd.5 = 1

Dim Flag As byte
Dim T As Word
Dim I As Word
Dim B As Byte
Dim W As Word
Dim J As Single
Dim K As Single

Do
If Flag <> 0 Then
   Flag = 0
   Portd.5 = 1
   T = I * 256
   B = Timer0 : W = B
   T = T + W
   K = T
   J = K * 0.151
   T = J
   Timer1 = 65536 - T
   Start Timer1
   I = 0
   Timer0 = 0
End If
Loop

Capt:
  Flag = 255
Return

Pulse:
   Portd.5 = 0
   Stop Timer1
Return

Tmr0:
   Incr I
Return

End

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » DC-CDI на attiny2313