Показано с 1 по 10 из 315

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    17.12.2009
    Возраст
    47
    Сообщений
    34
    Вес репутации
    198

    По умолчанию Re: AC dimmer 220V 50Hz

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

  2. #2
    Новичок
    Регистрация
    19.07.2012
    Возраст
    34
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Re: AC dimmer 220V 50Hz

    Цитата Сообщение от awtoap Посмотреть сообщение
    Обработка ИК диода должна построена быть на прерывании! Соответственно должен быть подключен к лапе контролера с фиксацией факта изменения уровня на входе.
    Добавил прерывание на 3 цифровой порт (attachInterrupt(1, irReceive, FALLING)). Функция один раз вызывается. Почему только один?

    И при добавлении второго прерывания у меня перестает работать первое прерывание, контролирующее якрость лампы. По умолчанию она должна включаться. Если второе прерывание отключить - лампа включается, если вернуть второе прерывание - лампа не включается. Нельзя использовать сразу 2 прерывания?

    Код:
    int AC_pin = 10;  // выход для симистора     
    volatile uint16_t dim = 33 * 5;      
    uint8_t dimmer;// уровень димирования (0-255)  0 = max, 255 = min 
    int irPin = 3;
    
    int start_bit = 2200; //Start bit threshold (Microseconds)
    int bin_1 = 1000; //Binary 1 threshold (Microseconds)
    int bin_0 = 400; //Binary 0 threshold (Microseconds)
    
    void setup()     
    { 
      Serial.begin(9600);
      pinMode(AC_pin, OUTPUT);
      attachInterrupt(1, irReceive, FALLING);
      // attachInterrupt(0, FrontUp, RISING);
    }     
    
    // Функция обработки прерывания на подъем       
    void FrontUp()       
    {     
      Serial.println("FrontUp");
      detachInterrupt(0);     
      delayMicroseconds(dim+1200);  // отсекаем лишнее  
      digitalWrite(AC_pin, HIGH);  // включить симистор     
      delayMicroseconds(20);      // короткая пауза, чтобы обеспечить включение симистора     
      digitalWrite(AC_pin, LOW);   // выключение симистора(он выключится когда полупериод достигнет нуля)      
      attachInterrupt(0, FrontDown, FALLING);       
    }     
    
    // Функция обработки прерывания на спад      
    void FrontDown()       
    {      
      detachInterrupt(0); 
      delayMicroseconds(dim);  // отсекаем лишнее     
      digitalWrite(AC_pin, HIGH);  // включить симистор     
      delayMicroseconds(20);      // короткая пауза, чтобы обеспечить включение симистора     
      digitalWrite(AC_pin, LOW);   // выключение симистора(он выключится        
      attachInterrupt(0, FrontUp, RISING);       
    }    
    
    void irReceive()
    {
      Serial.println("irReceive");
      /*int key = getIRKey();	
      
      if (key != 0)
      {
        if (key == 144)
        {
           dim = 33 * 2;
           Serial.println("HIGH");
        }
        else if (key == 145)
        {
           dim = 33 * 255;
           Serial.println("LOW");
        }
        delay(15);
      }*/
    }
    
    void loop()     
    { 
    }  
    
    int getIRKey() {
      int data[12];
      int i;
    
      while(pulseIn(irPin, LOW) < start_bit); //Wait for a start bit
      
      for(i = 0 ; i < 11 ; i++)
        data[i] = pulseIn(irPin, LOW); //Start measuring bits, I only want low pulses
      
      for(i = 0 ; i < 11 ; i++) //Parse them
      {	    
        if(data[i] > bin_1) //is it a 1?
          data[i] = 1;
        else if(data[i] > bin_0) //is it a 0?
          data[i] = 0;
        else
          return -1; //Flag the data as invalid; I don't know what it is! Return -1 on invalid data
      }
    
      int result = 0;
      for(i = 0 ; i < 11 ; i++) //Convert data bits to integer
        if(data[i] == 1) result |= (1<<i);
    
      return result; //Return key number
    }
    И подскажите, для чего переменной dim volatile? Разве не один поток проходит через прерывания?
    Последний раз редактировалось oxilor; 20.07.2012 в 21:37.

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

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

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

Ваши права

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