roboforum.ru

Технический форум по робототехнике.

прерывание, помогите

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Re: прерывание, помогите

Сообщение chinga » 31 мар 2010, 23:10

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

Re: прерывание, помогите

Сообщение galex1981 » 31 мар 2010, 23:13

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

Re: прерывание, помогите

Сообщение chinga » 01 апр 2010, 09:08

galex1981 писал(а):надо настраивать прерывание по Rizing а потом по Falling

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

Re: прерывание, помогите

Сообщение tsrodger » 01 апр 2010, 09:29

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

Re: прерывание, помогите

Сообщение chinga » 01 апр 2010, 10:11

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

Re: прерывание, помогите

Сообщение chinga » 01 апр 2010, 11:15

а как написать такую программу:
подключил 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
chinga
 
Сообщения: 203
Зарегистрирован: 24 дек 2008, 17:55
Откуда: Актюбинск

Re: прерывание, помогите

Сообщение tsrodger » 01 апр 2010, 11:51

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

Re: прерывание, помогите

Сообщение chinga » 01 апр 2010, 12:08

Код: Выделить всёРазвернуть
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
так?
chinga
 
Сообщения: 203
Зарегистрирован: 24 дек 2008, 17:55
Откуда: Актюбинск

Re: прерывание, помогите

Сообщение tsrodger » 01 апр 2010, 14:16

мм не совсем :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
Аватара пользователя
tsrodger
 
Сообщения: 134
Зарегистрирован: 18 сен 2008, 17:31
Skype: tsrodger
прог. языки: VB.Net, C, PHP

Re: прерывание, помогите

Сообщение chinga » 04 апр 2010, 21:04

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

Код: Выделить всёРазвернуть
If Pinb.4 = 1 Then                                          
  Portb.0 = 1
  Waitms 100
  Else
  Portb.0 = 0
  End If

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

у меня светодиод на В1... и кнопка на В4... когла нажимаю на кнопку светодиод мигает по задержке 100мс... а у меня должен по нажатию кнопки гореть а не мигать... как можно исправить? но раньше так работало, может в схеме где то? но схему не трогал совсем... поставил другой мк вся та же ошибка... помогите
chinga
 
Сообщения: 203
Зарегистрирован: 24 дек 2008, 17:55
Откуда: Актюбинск

Re: прерывание, помогите

Сообщение Michael_K » 04 апр 2010, 21:22

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

Re: прерывание, помогите

Сообщение Angel71 » 04 апр 2010, 21:23

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

Re: прерывание, помогите

Сообщение galex1981 » 04 апр 2010, 23:24

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

Re: прерывание, помогите

Сообщение chinga » 04 апр 2010, 23:53

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

Re: прерывание, помогите

Сообщение galex1981 » 05 апр 2010, 00:11

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

Пред.След.

Вернуться в Новичкам или основы основ роботостроения.

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

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