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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Бытовая и промышленная техника, авто, мото и т.п. » Моддинг стоп-сигналов - Bascom. Проект внутри


Моддинг стоп-сигналов - Bascom. Проект внутри

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

1

Доброе время суток, Господа!
В Bascom'e я новичОк
А потому прошу советы профессионалов

Набросал вот такую схемку
Она представлет собой моддинг стоп-сигналов на 5 каналов
идея в следующем:
[эффект_1] поворот налево - бегущий огонь налево (пока на PIND.4 = 0)
[эффект_2] поворот направо - бегущий огонь направо (пока на PIND.5 = 0)
[эффект_3] авайрийник - мигают все 5 каналов (пока на PIND.4 = 0 and PIND.5 = 0)

[STOP] (тут прерывание PIND.2 (INT0)) - горят все лампы статично и (!)не важно, какая операция была до прерывания.
В случае, если аварийник и поворотники не горят - стоп-сигналы все-равно работают по прерыванию.

Внимание:
Реализован, [эффект_1] и [эффект_2]. Трабла в том, что подав 0 к соответ. портам, огонек без остановки бежит
Как сделать так, чтобы огонь бегал, пока на PIND.X = 0 ? (я вроде указал это в коде)

И еще, касательно PIND.2 (INT0) - прерывание сразу пролетает.
т.е. при активном [эффект_1], [эффект_2], [эффект_3] все 5 каналов вспыхнут и программа идет дальше :(
Как сделать так, чтобы прерывание было активно. пока PIND.2 = 0

Подскажите, укажите ошибку. Может че-то напортачил
Буду весьма благодарен :)

Выкладываю код

Код:
'------------------------------------------------------------------

                  'моддинг стоп-сигналов

'------------------------------------------------------------------



$regfile = "2313def.dat"	'specify the used micro
$crystal = 4000000'used crystal frequency
$baud = 19200'use baud rate
$hwstack = 32'default use 32 for the hardware stack
$swstack = 10'default use 10 for the SW stack
$framesize = 40'default use 40 for the frame space


Config Portb.0 = Output	'настройка пина b0 выход (LED1)
Config Portb.1 = Output	'настройка пина b1 выход (LED2)
Config Portb.2 = Output	'настройка пина b2 выход (LED3)
Config Portb.3 = Output	'настройка пина b3 выход (LED4)
Config Portb.4 = Output	'настройка пина b4 выход (LED5)
Config Portd.4 = Input	'настройка пина D4 на вход (S1)
Config Portd.5 = Input	'настройка пина D5 на вход (S2)


Config Portd.2 = Input
Config Int0 = Rising
Config Debounce = 50
Enable Interrupts
Enable Int0
On Int0 Stopbutton



Dim Effect As Byte
Dim Temp As Byte
Temp = 250



Инициализация
Portb = 0	'00000'

'-------------------------------------------------------------------------------



Do	'начало всех начал


'Опрос кнопок
If Pind.4 = 0 Then Effect = 1 Else Portb = 0
If Pind.5 = 0 Then Effect = 2 Else Portb = 0
If Pind.4 = 0 And Pind.5 = 0 Then Effect = 3 Else Portb = 0


'RIGHT, если Effect = 1
If Effect = 1 Then
Portb = 1	'10000'
Waitms Temp
Portb = 2	'01000'
Waitms Temp
Portb = 4	'00100'
Waitms Temp
Portb = 8	'00010'
Waitms Temp
Portb = 16	'00001'
Waitms Temp
End If


'LEFT, если Effect = 2
If Effect = 2 Then
Portb = 16	'00001'
Waitms Temp
Portb = 8	'00010'
Waitms Temp
Portb = 4	'00100'
Waitms Temp
Portb = 2	'01000'
Waitms Temp
Portb = 1	'10000'
Waitms Temp
End If



'EMERGENCY, если Effect = 3
If Effect = 3 Then
Portb = 31	'00000'
Waitms Temp
Portb = 0	'11111'
Waitms Temp
End If
Loop


Stopbutton:
Portb = 31	'11111'
Gifr = 64
Return
End


'конец

'-------------------------------------------------------------------------------

Отредактировано ma35tr0 (2011-05-26 13:08:46)

0

2

Изучите команды shift, rotate.

0

3

У него 5 выходов. С шифтом он только намучается. Имхо паттерны вполне нормально, я бы их только свел в массив.

Предложу в основном цикле только опрашивать кнопки, а смену состояний вынести в прерывание по таймеру.

0

4

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

Изучите команды shift, rotate.

Я же говорю, что новичОк :(
Код, что Я разместил работает, просто никак не могу добиЦа желаемого :(

0

5

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

И не забудь резисторы на светодиоды - так можно и выходы пожечь.

Обязательно!
Это я просто на скорую руку делал, да бы проверить код.

Ща пойду с Вашим кодом разбираЦа.

0

6

Благодарю за код :)
Все работает тип-топ!

Теперь ясно.
В опросе кнопок вы добавили PIND.2 и ссылку на действие.
Я так понял, если нет прерывания, то STOP работает в обычном режиме, как и другие кнопки.
А если выполняеЦа какой-либо эффект - тогда STOP запускаеЦа прерыванием INT0.

Поправьте, если неверно понял

И еще непонятно вот это:

Код:
Do 'начало всех начал

'Опрос кнопок
   Effect = 0 '------------->это какая-то функция?
...
...
...
If Effect = 0 Then Portb = 0 '------------->и почему это в самом конце, а не в начале, где опрос кнопок?

в моем вариант (первое сообщение)

Код:
If Pind.4 = 0 Then Effect = 1 Else Portb = 0

- условие else не работало

0

7

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

У него 5 выходов. С шифтом он только намучается

Код:
$regfile = "2313def.dat"                                    'specify the used micro
$crystal = 4000000                                          'used crystal frequency


Config Portb.0 = Output 'настройка пина b0 выход (LED1)
Config Portb.1 = Output 'настройка пина b1 выход (LED2)
Config Portb.2 = Output 'настройка пина b2 выход (LED3)
Config Portb.3 = Output 'настройка пина b3 выход (LED4)
Config Portb.4 = Output 'настройка пина b4 выход (LED5)
Config Portd.4 = Input 'настройка пина D4 на вход (S1)
Config Portd.5 = Input 'настройка пина D5 на вход (S2)

Config Portd.2 = Input
ЗДЕСЬ ПОМЕНЯЛ__________
Config Int0 = Low Level         \
_________________________\
Config Debounce = 50
Enable Interrupts
Enable Int0
On Int0 Stopbutton

Dim A As Byte
Dim Temp As Byte
Temp = 100

'Инициализация
Portb = 0                                                   '00000'
'ЗДЕСЬ ПОМЕНЯЛ
Do
 If Pind.4 = 0 Then ' а лучше сделать так: If Pind =239(&b11101111), смотрим ниже
 A = 32
 Do
 Shift A , Right
  If A = 0 Then A = 16
 Portb = A

 Loop Until Pind.4 = 0
 End If
Loop
Stopbutton:
Portb = 31                                                  '11111'
Gifr = 64
Return

Я выделил что изменил. блин, в коде не выделяется
Прерывание иключается всегда, когда есть низкий уровень на нём.
здесь показан только бегание светодиода в право . Остальное по аналогии
з.ы. Нет задержки, чтобы в симуляторе легче проверить.
сноска-смотрим код
If Pind =239(&b11101111)-сдвиг в право
If Pind =223(&b11011111)-сдвиг в лево
If Pind =207(&b11001111)-моргание

Отредактировано kip (2011-05-27 09:52:31)

0

8

получается на каждый эффект свой кусок кода. С точки зрения качества программирования это не очень хорошо.
А если он придумает эффект, который шифтом не решить - например популярный сдвиг двух точек от краев к центру? Придется лепить некрасивые конструкции. Поэтому я и предложил разместить все возможные комбинации в массиве и просто дергать их оттуда. Такую схему легко адаптировать под другие эффекты, другое количество с/диодов и т.п.

Вообще мне постороение программы не нравится - сигнал поворота может запаздывать на 0.5с от реальности. Так для авто не делают.

0

9

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

сигнал поворота может запаздывать на 0.5с от реальности. Так для авто не делают

1. А чем вызвано запоздание и, как можно это устранить?
2. А если честно, - ничего страшного.  Полсекунды это немного :)
3. Ради интереса, можно попробовать пункт №1.

комбинации в массиве

- а можно пример?
Как показывает практика, примеры кода с описанием быстрее усваиваюЦа. :)
Вот, код из сообщения №4 Я уже разобрал. Правда, кое-что не понял (см. сообщение №7)

0

10

Ни кто не спорит ! Это всего лишь вариант реализации задачи. С массивом конечно универсальней, но сложней. Потом, в моём коде реализован

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

Трабла в том, что подав 0 к соответ. портам, огонек без остановки бежитКак сделать так, чтобы огонь бегал, пока на PIND.X = 0 ?

Хотя дело не в шифте.
И я не спец, конечно, как в авто делают, но не совсем понятно:

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

сигнал поворота может запаздывать на 0.5с от реальности.

Относительно чего он запаздывает? от физического поворота :dontknow: Я на машине, слава Богу, пока ещё сам поварачиваю :yep:

0

11

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

- а можно пример?

Код:
 do
Incr A' увеличиваем переменную а
 If Effect = 1 Then S = a' если вкл поворот то с масива берём первые пять
 If Effect = 2 Then S = a +5'если второй поворот, то вторые пять
 If Effect = 1 Then S = a + 10'если оба включены,то следующие.
 Portd = Lookup(s, Value_table)'
If A = 5 Then A = 0
loop until pind<>255
-----------
Value_table:
Data 1 , 2 , 4 ,8 , 16 , и т.д.

0

12

Держи Кутузов

Код:
$regfile = "2313def.dat"                                       ' мега8
$crystal = 4000000
Portd = &B00110100                                          ' внутренние подтягивающие резисторы. Внешние выкинь
Config Portb = Output
Config Int0 = Rising : On Int0 Impuls : Enable Interrupts : Enable Int0       ' прерывание от кнопки
Const Pause = 200

Nachalo:

Do
If Pind.4 = 0 Then                                          ' влево
 Portb = &B000000001
   Do
     Rotate Portb , Left
     If Portb.5 = 1 Then Portb = &B000000001
     Waitms Pause
   Loop Until Pind.4 = 1
End If

If Pind.5 = 0 Then                                          ' вправо
 Portb = &B000100000
   Do
     Rotate Portb , Right
     If Portb.7 = 1 Then Portb = &B000010000
     Waitms Pause
   Loop Until Pind.5 = 1
End If
Loop

Impuls:                                                     ' стопы

Do
Portb = &B00011111 : WAITMS 300
Portb = 0 : Waitms 300
Loop Until Pind.2 = 1                                       ' ждем пока кнопку не отпустим
Goto Nachalo                                                ' гасим свет и начинаем с нуля
Return

0

13

kip
как-то так. : ) Хотя я бы задавал не только начальную позицию в массиве, но и количество кадров в эффекте.  Мало ли эффекты какой сложности можно придумать.
Запаздывание относительно включения рукояткой сигнала поворота. Он же опрашивает кнопки только раз в 0.5с (а если захочется сделать длинный эффект, то время и больше может быть)

ma35tr0
Устранить можно повесив переключение на таймер. Я выше писал уже. Или, другой вариант, повесив все кнопки на прерывание через диоды. но так сложнее.

0

14

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

Он же опрашивает кнопки только раз в 0.5с

А как можно уменьшить время опроса без таймера и прерываний?
Как мне кажеЦа, надо уменьшить значение Config Debounce = 50 ?
т.е. если уменьшить время задержи, то и опрос кнопок будет чаще.
Например, Config Debounce = 10 - в таком случае опрос 0.1сек
Поправьте, если не так

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

повесив все кнопки на прерывание через диоды

Это пока для меня сложно. Но обязательно и это попробую

0

15

рис3 изучайте

0

16

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

рис3 изучайте

Благодарю за ссылку.
Тут только схема включения, а нет самого кода с описанием :(

0

17

http://www.decada.org.ru/project/lessons/bascom_avr/13/  здесь есть код и описание

0

18

ma35tr0
я понимаю, что Вы живёте в другом государстве, но пишите по-русски, без выпиздронов
вам же не 15 лет...
Спасибо.

0

19

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

здесь есть код и описание

Не пойму, в чем отличие между таким подключением и тем, что из поста #1 и коддинга из поста #4
Ведь в обеих случаях для опроса кнопок тоже используеЦа wait и debounce
А следовательно, (как я думаю) в любом случае будет запоздание срабатывания эффекта на n,n секунд.

Очевидно одно - это подключение матричной клавы :)
Как мне кажеЦа, этот случай для тех, кому нужны много кнопок, а портов мало.
(вырезка: "...для клавиатуры 4x4 из 16 выключателей нужно 16 линий ввода. Гораздо более разумным решением было бы организовать их в 4 строки по 4 выключателя, использовав тем самым всего 8 линий...")

0

20

Не думал я, что из такой простой задачи, можно так тему раздуть. На кой тут вообще прерывание? Если основная задача-это опрос кнопок. Прерывание нужно только на стоп-сигнал.
Надо-то:  Pind.4, Pind.5 -повороты. Я бы ещё Pind.6 добавил для аварийки, помоему проще, чем 4-й и 5-й замыкать. Вот и опрашивайте их в основном цикле, а по прерыванию стоп зажигайте. Всё!!!

0

21

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

чем 4-й и 5-й замыкать

- это для того, чтобы снимать сигнал непосредственно с задних огней.

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

Я бы ещё Pind.6 добавил для аварийки, помоему проще, чем 4-й и 5-й замыкать

- тогда придеЦа тянуть провод от этой кнопки под рулем :(
А стоп - это прерывание.

0

22

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

По совету kip добавил кнопку на PIND.6 - аварийники.

Хмм... Только вспомнил, что если тянуть провод из кнопки аварийника или из задних огней сигнал к пинам будет подаваЦа прерывистый, в такт с поворотниками. А мне нужен +12в постоянно.
Видимо, надо будет поставить реле непосредственно к рукоятке поворотников и кнопке аварийника.

Отредактировано ma35tr0 (2011-05-30 10:31:24)

0

23

Насколько я помню, в автомобиле стопы прижаты к земле в активном состоянии ......

0

24

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

Насколько я помню, в автомобиле стопы прижаты к земле в активном состоянии ......

Посмотрел схему электропроводки.
На стопах постоянный минус, а управление плюсом.
Свет в салоне - с точностью до наоборот.

0

25

И тишина...
Неужели никто не прокомментирует схему?

0

26

А зачем транзисторные ключи на входы стоят под кнопки?

0

27

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

А зачем транзисторные ключи на входы стоят под кнопки?

Благодарю за отзывчивость!
Транзисторные ключи поставлены для того, чтобы защитить порты и инвертировать подающий сигнал с (-)минуса на (+)плюс.
Т.е. управление кнопками должно осуществляться подачей плюса.

0

28

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

Благодарю за отзывчивость!
Транзисторные ключи поставлены для того, чтобы защитить порты и инвертировать подающий сигнал с (-)минуса на (+)плюс.
Т.е. управление кнопками должно осуществляться подачей плюса.

Я обычно стараюсь использовать минимум деталей, по этому обычно порты подвязываются сопротивлением около 27кОм к питанию (+), а управление идет через кнопку, которая замыкает тот же порт на общий (-).
Далее программе всё равно что обрабатывать (единицы или нули).

0

29

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

Я обычно стараюсь использовать минимум деталей

Я тоже к этому стремлюсь. Т.к. данная конструкция  должна быть максимально минимальной, дабы уместить это все в стоп-сигнале на заднем стекле.
Но видимо Протеусу не все-равно. Кнопки реагируют на подачу (-)минуса

0

30

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

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

А по схеме они управляются минусом.

0


Вы здесь » Программирование ATMEL в BASCOM. » Бытовая и промышленная техника, авто, мото и т.п. » Моддинг стоп-сигналов - Bascom. Проект внутри