Страница 6 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 51 по 60 из 73
  1. #51
    Новичок
    Регистрация
    18.06.2012
    Сообщений
    6
    Вес репутации
    155

    По умолчанию Re: Прерывания в Arduino.

    Вот только добрался до експерементов и оказалось что ms timer2 таки считается в мс а вот таймер импульса почему то в микро сек. т.е. чтоб поставить допустим импульс длит 1сек на нем нужно поставить 100000, я что то не так делаю???
    void flash_led() //обработчик прерывания
    {
    digitalWrite(ledPin, HIGH);
    delay(100000); //длительность импульса 1 сек
    digitalWrite(ledPin, LOW) ;
    }

    void setup() {

    // declare the ledPin as an OUTPUT:
    pinMode(ledPin, OUTPUT);

    MsTimer2::set(1000, flash_led); // будет срабатывать каждые 1 сек.
    MsTimer2::start(); //включить таймер

  2. #52
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Таймер импульса, это что?

  3. #53
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Прерывания в Arduino.

    Зачем в flash_led находится делэй?
    Код неверный.

    PHP код:

    boolean LedStatus
    =false//триггер состояния Led

    void flash_led() //обработчик прерывания 
    {
      
    LedStatus = !LedStatus//переключаем триггер
      
    if (LedStatus//проверяем состояние триггера 
      

        
    digitalWrite(ledPinHIGH); //включаем, если триггер в true
      
    }
      else
      { 
        
    digitalWrite(ledPinLOW) ; // выключаем, если триггер в false
      



    void setup() {

    // declare the ledPin as an OUTPUT:
    pinMode(ledPinOUTPUT);

    MsTimer2::set(1000flash_led); // будет срабатывать каждые 1 сек. 
    MsTimer2::start(); //включить таймер 
    Код сознательно упрощен для понимания.

  4. #54
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    В твоем коде скважность 50/50, а ему требуется http://www.compcar.ru/forum/showpost...4&postcount=48

  5. #55
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Прерывания в Arduino.

    Сча изобрАзим

    PHP код:
    volatile int led_time 5//5 сек из 60 будет гореть
    volatile int led_counter 0//счетчик

    void flash_led() //обработчик прерывания 
    {
      if (
    led_time>led_counter// 
      

        
    digitalWrite(ledPinHIGH); //горит, пока счетчик считает до 5
      
    }
      else
      { 
        
    digitalWrite(ledPinLOW) ; // не горит оставшееся время (55 сек в твоем случае)
      
    }
      
    led_counter++; 
      if (
    led_counter==60led_counter=0//обнуляем счетчик

    Последний раз редактировалось BlkDem; 26.06.2012 в 21:01.

  6. #56
    Новичок
    Регистрация
    18.06.2012
    Сообщений
    6
    Вес репутации
    155

    По умолчанию Re: Прерывания в Arduino.

    Цитата Сообщение от BlkDem Посмотреть сообщение
    Сча изобрАзим

    PHP код:
    volatile int led_time 5//5 сек из 60 будет гореть
    volatile int led_counter 0//счетчик

    void flash_led() //обработчик прерывания 
    {
      if (
    led_time>led_counter// 
      

        
    digitalWrite(ledPinHIGH); //горит, пока счетчик считает до 5
      
    }
      else
      { 
        
    digitalWrite(ledPinLOW) ; // не горит оставшееся время (55 сек в твоем случае)
      
    }
      
    led_counter++; 
      if (
    led_counter==60led_counter=0//обнуляем счетчик

    Прошу прощения что не появлялся....
    Дело в том что длина "high"(импульс) и длина "low"(пауза), величины регулируемые 5-50МС и 5-50с соответственно...
    Так же столкнулся с такой проблемой при подаче питания на МК и до окончания инициализации на ledPin присутствует "1" тем самым открыт клапан почти 4 сек (льёт житкость рекой), можно ли изначально задать "0" на нужной ноге?

  7. #57
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Схему и скетч выложи, посмотрю что можно сделать

  8. #58
    Пользователь
    Регистрация
    05.03.2009
    Сообщений
    29
    Вес репутации
    199

    По умолчанию Re: Прерывания в Arduino.

    У меня в механическом спидометре, на TLC-80, обнаружился геркон, который замыкается 4 раза за 1 оборот вала (одной ногой сидит на земле).
    Я подозревал, что геркон может дребезжать, поэтому решил сначала потренироваться на кошках велосипеде. Там так же имеется геркон.

    Т.к. срабатывание геркона приводит к появлению логического нуля я решил использовать attachInterrupt(0, int_on, LOW);

    Беру второй пример, немного модифицирую для вывода значений:
    PHP код:
    #define PinA  2
    static boolean output HIGH;
    int pulse 0;

    void setup() 
    {   
      
    pinMode(PinAINPUT); 
      
    digitalWrite(PinAHIGH);     // подключить подтягивающий резистор
      
    attachInterrupt(0int_onLOW);  // настроить прерывание interrupt 0 на pin 2
      
      
    Serial.begin(9600);


    void loop()
    {
      
    delay(100);
      
    Serial.println(pulse);
    }

    // обработка прерывания
    void  int_on()
    {
      
    digitalWrite(13, (output==HIGH) ? output=LOW output=HIGH);
      
    pulse++;

    Кручу колесо рукой и выясняется, что при прохождении магнита около геркона фиксируется от 2 000 - 15 000 вызовов прерывания, в зависимости от скорости вращения.

    Меняем работу с прерыванием на attachInterrupt(0, int_on, CHANGE), получаем от 1 до 5 вызовов за одно прохождение.

    RISING дает 2 вызова: первый когда геркон замыкатеся, второй когда размыкается и, наконец FALLING стабильно дает 2 вызова при замыкании геркона.

    Интересно получается. Судя по описанию:
    LOW - вызов прерывания когда пин устанавливается в 0.
    CHANGE - пин меняет состояние (0->1 или 1->0)
    RISING - 0 -> 1
    FALLING - 1 -> 0

    Т.е. по всех случаях кроме CHANGE должен происходить один вызов прерывания за один проход магнита мимо датчика.


    В итоге дорабатываю код таким образом, что бы получать один вызов в момент замыкания геркона.
    PHP код:
    #define PinA  2
    static boolean output HIGH;
    int pulse 0;
    bool prev false;

    void setup() 
    {   
      
    pinMode(PinAINPUT); 
      
    digitalWrite(PinAHIGH);     // подключить подтягивающий резистор
      
    attachInterrupt(0int_onFALLING);  // настроить прерывание interrupt 0 на pin 2
      
      
    Serial.begin(9600);


    void loop()
    {
      
    delay(100);
      
    Serial.println(pulse);
    }

    // обработка прерывания
    void  int_on()
    {
      
    digitalWrite(13, (output==HIGH) ? output=LOW output=HIGH);
      if(!
    prev)
      {
        
    pulse++;
      }
      
    prev = !prev;

    Завтра по дороге на работу опробую это в машине.

  9. #59
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Прерывания в Arduino.

    Я бы в обработчике прерывания выключал прерывание на момент обработки:

    PHP код:
    void  int_on() 

      
    detachInterrupt(int_on);
      
    digitalWrite(13, (output==HIGH) ? output=LOW output=HIGH); 
      
    pulse++; 
      
    attachInterrupt(0int_onFALLING);


  10. #60
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Лучше поставить конденсатор 0,1мкф параллельно геркону

Страница 6 из 8 ПерваяПервая 12345678 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)

Ваши права

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