roboforum.ru

Технический форум по робототехнике.
Текущее время: 01 май 2025, 12:01

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 31 мар 2010, 23:10 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
а как выключать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 31 мар 2010, 23:13 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
В общем тебе нужно по нажатию кнопки его включать (1 посылать насколько я понял) а по отпусканию выключать (0). Если ты реализовать без задержки хочешь, то надо настраивать прерывание по Rizing а потом по Falling

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 09:08 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
galex1981 писал(а):
надо настраивать прерывание по Rizing а потом по Falling

а как это? можете показать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 09:29 
Не в сети
Аватара пользователя

Зарегистрирован: 18 сен 2008, 17:31
Сообщения: 134
Skype: tsrodger
прог. языки: VB.Net, C, PHP
В статье между прочим написано http://www.decada.org.ru/project/lesson ... /index.php


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 10:11 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
ыЫ) спасиб, нашел


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 11:15 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
а как написать такую программу:
подключил 5 светодиодов, и када включаю все по очереди мигают по 1сек, и после первого круга, первые 2светодиоды не мигают, тока остальные 3ое по очереди мигают
Код:
Do
Portd.1 = 1             )
Waitms 1000             )
Portd.2 = 1             )
Waitms 1000             )
Portd.3 = 1             )1ый круг   )   
Waitms 1000             )           )
Portd.4 = 1             )           ) 2,3,4... круг...
Waitms 1000             )           )
Portd.5 = 1             )           )
Waitms 1000             )           )
loop


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 11:51 
Не в сети
Аватара пользователя

Зарегистрирован: 18 сен 2008, 17:31
Сообщения: 134
Skype: tsrodger
прог. языки: VB.Net, C, PHP
даю подсказку - это маска:
Цитата:
1 круг: 11111111 = FF = 255
2 круг: 00111111 = 3F = 63
3 круг: 00001111 = 0F = 15
4 круг: 00000011 = 03 = 3


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 12:08 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
Код:
Do
Portd.1 = 1             
Waitms 255             
Portd.2 = 1             
Waitms 255             
Portd.3 = 1             
Waitms 3           
Portd.4 = 1             
Waitms 3             
Portd.5 = 1             
Waitms 3             
loop
так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 01 апр 2010, 14:16 
Не в сети
Аватара пользователя

Зарегистрирован: 18 сен 2008, 17:31
Сообщения: 134
Skype: tsrodger
прог. языки: VB.Net, C, PHP
мм не совсем :roll:
в примере я хотел показать что можно использовать маску... Ведь не обязательно использовать управление отдельным выводом, как сейчас.
Допустим нам нужно включить светодиоды на первом, третьем и шестом выводах порта D, а остальные выключить. Это можно сделать написав такой код
Код:
Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Portd.4 = 0
Portd.5 = 1
Portd.6 = 0
Portd.7 = 0

Но можно записывать значение сразу для всех выводов 01000101 = 25 = 37, записывая значение сразу всего порта
Код:
portd = 37

Эти два фрагмента выполняют одну и ту же задачу!

Ближе к примеру,
круг 1 - включение светодиодов 1-8
Код:
portd = 255 = 11111111

круг 2 - включение светодиодов 1-6
Код:
portd = 63 = 00111111

круг 3 - включение светодиодов 1-4
Код:
portd = 15 = 00001111

круг 4 - включение светодиодов 1-2
Код:
portd = 3 = 00000011


Если посмотреть на пример, то можно заметить, что перед каждым кругом у нас смещаются единички вправо
Код:
11111111
00111111


Воспользуемся справкой по Bascom, нет ли там какой-либо функции которая может осуществлять свдиг (shifting) битов. Оказывается есть:
Код:
Shift


если ей воспользоваться можно получить, например, такой код
Код:
    $regfile = "m32def.dat"
    $crystal = 16000000

    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output

    Dim Wtime As Byte
    Dim Mymask As Byte

    Cls

    Wtime = 200
    Mymask = 255

    Do
      Portd = Mymask
      Waitms Wtime
      Shift Mymask , Right , 2
    Loop

    End

Данный код сначала включает все светодиоды (111111111 = FF = 255), потом выключает по два начиная с тех, которые подключены к выводам 7 и 6 соответственно..

Теперь о том как заставить их мигать по очереди. 8 светодиодов - 8 выводов, если хочется чтобы они мигали по очереди, надо понять как это происходит. Пусть сначала будет включен самый "правый" светодиод, остальные выключены: 00000001 = 01 = 1
Теперь включаем второй светодиод, а первый выключаем: 00000010 = 02 = 2
Дальше третий - 00000100 = 04 = 4 и тд
Очевидно, что опять перемещается битик (только теперь вправо), а значит можно опять воспользоваться функцией SHIFT!

Код:
    $regfile = "m32def.dat"
    $crystal = 16000000

    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output

    Dim Wtime As Byte
    Dim Mymask As Byte

    Cls

    Wtime = 200
    Mymask = 1

    Do
      Portd = Mymask
      Waitms Wtime
      Shift Mymask , left, 1
    Loop

    End

Данный код последовательно будет включать/выключать светодиоды, начиная с 1-го

Препоследний шаг.. есть такая вещь как битовые операцииПочитайте обязательно, это азы и без них никуда :(
Пытаемся объеденить полученные знания.

Для удобства введем маску
Код:
Dim Mymask As Byte
Mymask = 255

которая соответствует тому, какие светодиоды можно включать (начальное значение - это значение на первом круге: 255 = FF = 11111111 - те на первом круге можно включать все светодиоды).

Введем еще одну маску
Код:
Dim Myleds As Byte
Myleds = 1

она будет соответствовать тому, какие светодиоды будут включены (начальное значение один светодиод справа - 1 = 01 = 00000001)

Перменная
Код:
Dim Portstatus As Byte 

будет хранить состояние порта

Воспользовавшись логической операцией AND получим то значение, которое необходимо записывать в порт
Код:
Portstatus = Myleds And Mymask
Portd = Portstatus

предположим, у нас 2 круг, значит Mymask = 00111111
и нам нужно включить 3 светодиод, значит Myleds = 00000100
в результате операции AND в переменную Portstatus запишется значение 00000100
значения для других кругов и других светодиодов настойтельно рекомендую сверить самому!

В принципе программа почти готова, осталось добавить совсем чуть чуть автоматизации
Код:
$regfile = "m32def.dat"
    $crystal = 16000000

    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output

    Dim Wtime As Byte
    Dim Mymask As Byte
    Dim Myleds As Byte
    Dim Portstatus As Byte

    Cls

    'начальные значения
    Wtime = 200
    Mymask = 255
    Myleds = 1

    ' основной цикл программы
    Do
      Do                                                    ' цикл мигания свтодиодами
      Portstatus = Myleds And Mymask                        ' рассчитываем состояние порта
      Portd = Portstatus                                    ' записывае полученное значение в порт
      Waitms Wtime                                          ' пауза
      Shift Myleds , Left , 1                               ' сдвигаем маску влево, в следущий раз зажгется другой светодиод
      Loop Until Portstatus = 0                             ' выполняем цикл до тех пор пока состояние порта не вернет 0, те все светодиоды выключены
    Myleds = 1                                              ' сбарсываем позицию светодиода который нужно включить
    Shift Mymask , Right , 2                                ' круг прошел, сдвигаем маску, в следующий раз два светодиода включать будет уже нельзя
    If Mymask = 0 Then Mymask = 255                         ' если маска равна 0 значит пора опять разрешить включать все светодиоды
    Loop

    End


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 04 апр 2010, 21:04 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
знаю что не в тему... но ради такого простого вопроса не стал тему открывать...
короч проблема вот в чем, помогите если знаете...
прога довольно простая

Код:
If Pinb.4 = 1 Then                                         
  Portb.0 = 1
  Waitms 100
  Else
  Portb.0 = 0
  End If

вот собсна...

у меня светодиод на В1... и кнопка на В4... когла нажимаю на кнопку светодиод мигает по задержке 100мс... а у меня должен по нажатию кнопки гореть а не мигать... как можно исправить? но раньше так работало, может в схеме где то? но схему не трогал совсем... поставил другой мк вся та же ошибка... помогите


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 04 апр 2010, 21:22 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
а вы не думали, что программа дальше делает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 04 апр 2010, 21:23 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
:oops: она думает по перегрузке. :D улыбнуло "мигать". это сколько раз, 1 или переодически помигивает? :( буковки кириллические, предложения нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 04 апр 2010, 23:24 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Светодиод на b1 а код на b0 Portb.0 = 1...

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 04 апр 2010, 23:53 
Не в сети

Зарегистрирован: 24 дек 2008, 17:55
Сообщения: 203
Откуда: Актюбинск
ааа да... светодиод на В.0) что дальше делает нет, он даже не может выполнить эту программу так как я хочу...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: прерывание, помогите
СообщениеДобавлено: 05 апр 2010, 00:11 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Слушай, выложи весь код, тогда может и разберемся в чем дело

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO