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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите с допилом программы для ДРЛ в BASCOM


Помогите с допилом программы для ДРЛ в BASCOM

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

1

Решил написать свою красивую программу для светодиодных ДРЛ с плавным розжигом диодов при подачи питания и плавным притуханием и разгоранием в зависимости от включенных габаритов. Шим на МК Attiny 13 управлет через открытый коллектор драйвером на ZXLD1360. Програмку наконец-то осилил дописать. В протеусе работает как надо. Вчера сделал в железе.  Словил глюк: при подачи питания на МК и драйвер, сначала происходит крастковременное разовое моргание светодиодами, потом диоды разгораются от  выключенного состояния, как и положено. Сама програмка работает как надо дальше. Не пойму откуда ноги растут у глюка с промаргиванием, может что не так в коде?
Собственно код:

$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 10
$swstack = 20
$framesize = 20

Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 64
Start Timer0

Config Portb.0 = Output : Portb.0 = 0
Config Portb.1 = Output : Portb.1 = 0
Config Portb.2 = Input : Portb.2 = 1
Config Portb.3 = Input : Portb.3 = 1

Key Alias Pinb.2                                            'noga 7 settings
Gab Alias Pinb.3                                            'noga 2 gabarit
Pwm Alias Compare0a
Dim N As Byte
Dim Flag_drl As Byte
Dim Flag_gab As Byte
Dim Pwm_cur As Byte
Dim Pwm_drl As Byte
Dim Pwm_gab As Byte
Declare Sub Settings
Declare Sub Set_drl
Declare Sub Set_gab

Flag_drl = 0
Flag_gab = 0

N = 0
Pwm_drl = 250
Pwm_cur = 0

$eeprom
Readeeprom Pwm_gab , 00
$data

Do
If Pinb.2 = 0 And Pinb.3 = 0 Then Gosub Settings
If Pinb.3 = 0 And Flag_gab = 0 Then Gosub Set_gab
If Pinb.3 = 1 And Flag_drl = 0 Then Gosub Set_drl
Loop
End

Set_drl:
Waitms 250
For N = Pwm_cur To Pwm_drl Step 1
Pwm = N
Waitms 5
Next N
Pwm_cur = Pwm
Flag_drl = 1
Flag_gab = 0
End_set_drl:
Return

Set_gab:
Waitms 250
If Flag_drl = 0 Then

For N = 0 To Pwm_gab Step 1
Pwm = N
Waitms 5
Next N
Flag_drl = 0
Flag_gab = 1
Pwm_cur = Pwm
Else
For N = Pwm_cur To Pwm_gab Step -1
Pwm = N
Waitms 5
Next N
Flag_drl = 0
Flag_gab = 1
Pwm_cur = Pwm
End If
End_set_gab:
Return

Settings:
Do
If Key = 0 Then

Pwm_gab = Pwm_gab + 1
Pwm = Pwm_gab
Waitms 5
Loop Until Key = 0
Else
Writeeeprom Pwm_gab , 00
Flag_drl = 0
Flag_gab = 1
Pwm_cur = Pwm_gab

End If
End_settings:
Return

0

2

botar скорее всего из за того, что во время запуска до конфигурации порта на выход (который управляет ключом) порт висит в воздухе. Поддтяни его на массу резистором.

0

3

MACTEPok
Пробовал на +5В подтягивать через 10К - не повлияло никак, на массу вроде тож пробовал, но эффекта не было... Номинал резистора большой мб???

0

4

Попробуйте между строками "Config Timer0 = Pwm" и "Start Timer0" поместить строку "Compare0a = 255".

0

5

Пётр если не поможет, то напрямую управлять регистром TCCR0B?

Код:
 TCCR0B.CS02 = 0:CCR0B.CS01 = 1:CCR0B.CS00 = 1     -  запуск таймера с делителем 64

 TCCR0B.CS02 = 0:CCR0B.CS01 = 0:CCR0B.CS00 = 0     - останов таймера

Да и вообще сконфигурировать ШИМ вручную и запускать в последнюю очередь.
Баском скорее всего запускает таймер сразу после строки
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 64
не дожидаясь, пока ты его запустишь.  :unsure:

0

6

MACTEPok
Как напрямую управлять регистром в баскоме я не знаю, я как бы новичок в программировании...

Все перепробовал - ничего не выходит. Светодиоды обязательно вспыхивают, тухнут и только потом начинается нормальная работа программы...

0

7

После строки Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 64
написать Stop Timer0
Перед главным циклом уже Start Timer0

0

8

MACTEPok
Не помогло, все как и было...

0

9

Вместо Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 64
пишем
Tccr0a = &B11100001
Tccr0b = &B00000000

Start Timer0 из кода убираем

Перед началом главного цикла пишем Tccr0b = &B00000011  - это запуск таймера

0

10

А может схему управления драйвером покажешь? Управление идет логическим 0? Поэтому в момент включения на выходе порта 0 кратковременно.

0

11

MACTEPok
Драйвер как из даташита ZXLD1360 Управляется от тиньки через транзистор с открытым коллектором. В общем-то от этого ничего не меняется, а глюк остается Сейчас вообще подключен китайский драйвер на неизвестной микросхеме :)

0

12

Транзистор p-n-p?

0

13

n-p-n
сейчас напрямую к микросхеме драйвера подключено, результат не меняется. Транзистор дает нужную инверсию ШИМ, без него светодиоды при текущей программе притухают вместорозжига, но и опять подмаргивание присуствует.... Что-то в коде не то, а где не понятно.... Есть мысли, что если написать код на си, то может будет правильный результат, но я си не владею....
с  прямым доступом к регистру глюк как был так и остался .....

0

14

хоть на си, какая разница )
Если конфигурацию таймера убрать и не включать его вообще, вспышка появляется? а затем все тухнет?

0

15

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

Транзистор дает нужную инверсию ШИМ, без него светодиоды при текущей программе притухают вместорозжига

Нужно правильно ШИМ настроить и транзистор не понадобится.  :writing:  :)

Код:
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64

0

16

MACTEPok
Надо попробовать. но мне кажется вспышка идет в момент запуска основного цикла... Проверимс...

Пётр
Без транзистора придется именно подбирать выходной ток драйвера от заполнения шим. Выход мк частично шунтирует вход драйвера. Через транзистор полюбому лучше и по даташиту драйвера так же. Я шим на тиньке для этого драйвера делаю, тупо просто кидал в порт настройку шима,  и менюшка настройки яркости в режиме габаритов, но с циклами для плавного розжига  в первый раз заморочился, а оно не работает...

0

17

Пётр, а всплеск при включении, все таки из за времени перевода ШИМ в активное состояние?

0

18

Парни, я тут обнаружил, что программа прекрасно работает без команды start timer0. Может она как раз на этом и спотыкается? Посмотрел один пример, там тоже нет этой команды....

0

19

дело не в этом. Предыдущей строкой ты уже запускаешь таймер, так что эта строка не нужна вообще.

Попробуй настроить ШИМ так
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64

и убрать транзистор.
Если при напряжении 0 на входе ADJ диоды не горят, а при 1 - горят на полную мощность, то все должно работать.

0

20

MACTEPok
Да  я делал без транзистора. Проблема в том, что настроенный драйвер на ток 330 мА начинает чувствовать подтяжку от микроконтроллера и меняется выходной ток, причем меняется так, что при 100% заполнении ШИМ драйвер начинает выдавать максимальный для него ток в 1,2А, что неприемлемо, т.е. придется сделать каким-то образом регулировку тока по шим и в режиме ДРЛ. Да и даташит явно указывает на применение ШИМ через открытый коллектор. Запускал я ШИМ на драйвер, только строка немного другая была:
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 64
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 64
Меняется только полярность импульсов на выходе, соотвествено доды либо плавно разгораются, либо тухнут с максимума....

0

21

Ну, в даташите же есть схема для МК с резистором и диодом.
Весь глюк в том, что при запуске МК на выходе ADJ должен быть лог. 0! С транзистором же лог.0 на ADJ появляется только после запуска МК и конфигурации таймера, на что тратится время. Отсюда и вспышка.

0

22

MACTEPok
Хорошо... Тогда получается надо определить логический ноль в программе на порту и сконфигурировать правильно полярность ШИМ:

Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64
Ddrb = &B00000011
Portb = &B11111100

Можно еще дописать для верности:
compare0A = 0

0

23

После такой настройки шим на выходе мк и будет 0, без импульса.

0

24

MACTEPok
Ну и отлично, раз импульса не будет, то, что и нужно! Или я не прав?

0

25

botar
Попробуй и расскажи нам.)

0

26

В общем, попробовал. Глюк остался. Поставил резисторподтяжки  10к на выход тиньки к +5В и проблема почти исчезла. В общем, програмная подтяжка не работает что-ли...  В общем баг убрался но не до конца: если железки были долгое время в выключенном состоянии, то при подачи питания глюка нет, а вот если щелкать питанием оперативно моргули проскакивают. Чего еще сделать можно ума не приложу...
PS: Кучей керамики и тантала все обложено....

0

27

Попробуйте включить детектор снижения напряжения питания.

0

28

Пётр
как это сделать?

0

29

В конфигурации МК, если он конечно поддерживает детектор снижения питания.

Посмотрел даташит. Да поддерживает. См. страницу 119, таблица "18.5.1 Brown-Out Detection". http://www.atmel.com/images/doc2535.pdf

Отредактировано Пётр (2014-12-04 11:51:19)

0

30

А не может проблемма крыться в настройках фьюзов? Сейчас стоят: low =79 hi= FF Внутренний генератор 4,8Мгц задержка запуска 14 тактов + 64мс, может стоит попробовать 4,8+14тактов + 0мс ????

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите с допилом программы для ДРЛ в BASCOM