Страница 6 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 51 по 60 из 73

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Новичок
    Регистрация
    18.06.2012
    Сообщений
    6
    Вес репутации
    165

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

    Цитата Сообщение от Chip Посмотреть сообщение
    Возьми пример с MsTimer2
    Спасибо огромное, по моему то что нужно....

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

    По умолчанию 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(); //включить таймер

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

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

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

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

    По умолчанию 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(); //включить таймер 
    Код сознательно упрощен для понимания.

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

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

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

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

    По умолчанию 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.

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

    По умолчанию 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" на нужной ноге?

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

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

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

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

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

    Извиняюсь что не писал долго, проект был отложен и теперь снова к нему вернулся и наступил на грабли,
    #include <LiquidCrystal.h>
    #include <MsTimer2.h>

    const int sensorPin = A1; // select the input pin for the potentiometer
    const int sensor1Pin = A2;


    int ledPin = 13; // select the pin for the LED

    int sensorValue = 0; // variable to store the value coming from the sensor
    int sensor1Value = 0;

    int ledValue = 0;
    int led1Value = 0;

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    void flash_led() //обработчик прерывания
    {
    digitalWrite(ledPin, HIGH);
    delay(led1Value); //длительность импульса
    digitalWrite(ledPin, LOW) ;
    }

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

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

    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    }

    void loop() {

    // read the value from the sensor:
    sensorValue = analogRead(sensorPin);
    sensor1Value = analogRead(sensor1Pin);


    lcd.setCursor(0, 1);

    // map it to the range of the analog out:
    ledValue = map(sensorValue, 0, 1023, 5000, 60000);
    led1Value = map(sensor1Value, 0, 1023, 6, 60);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Pause ");
    lcd.print(1000 / ledValue);
    lcd.print(" ");

    lcd.setCursor(0, 1);
    lcd.print("impuls ");
    lcd.print(led1Value);
    lcd.print("ms ");

    }
    показания на дисплее появляются по буквенно с паузой в 1сек, pin13 светится всё время, уже запутался полностью с этим прерыванием...

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

    По умолчанию 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;

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

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

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

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

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

Ваши права

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