Помогите с кодом!

Тема в разделе "Arduino & Shields", создана пользователем stalker_kz, 2 янв 2016.

  1. stalker_kz

    stalker_kz Нерд

    Всем привет и с Новым Годом!

    Такая проблема, есть две ардуинки на обоих стоит nrf24, первая посылает на вторую трехзначное значение, вторая ловит его и должна включать диммер по полученному значению, но возникает проблема... не работает nrf24. Все из-за функции внешнего прерывания, включаешь ее не работает, отключаешь работает.. или работает не стабильно. просто жутко нестабильно, чаще просто не работает.
    вот код.
    Код (C++):
    #include <CyberLib.h> //Библиотека от Cyber-Place.ru
    volatile uint8_t tic, Dimmer1=255;
    uint8_t data;

    #include "FastLED.h"
    #define NUM_LEDS 1
    #define DATA_PIN 3

    CRGB leds[NUM_LEDS];

    int incomingInt = 255;

    #include<SPI.h>
    #include<nRF24L01.h>
    #include<RF24.h>
    const uint64_t pipe =0xF0F1F2F3F4LL;
    RF24 radio(9, 10);

    void setup()
    {
      radio.begin();
      delay(2);
      radio.setChannel (120);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openReadingPipe(1, pipe);
      radio.startListening();
     
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
     
      D4_Out; D3_Out;//Настраиваем порты на выход
      D4_Low; D3_High;//установить на выходах низкий уровень сигнала
      D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль  
      attachInterrupt(0, detect_up, LOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
      StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
      StopTimer1(); //остановить таймер
    //  UART_Init(9600); //инициализация порта
      Serial.begin(9600);
    }
    //********************обработчики прерываний*******************************
    void halfcycle()  //прерывания таймера
    {
      tic++;  //счетчик  
      if(Dimmer1 < tic ) D4_High; //управляем выходом
    }

    void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
    {  
    tic=0;             //обнулить счетчик
    ResumeTimer1();   //запустить таймер
    attachInterrupt(0, detect_down, HIGH);  //перепрограммировать прерывание на другой обработчик
    }  

    void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
    {  
    StopTimer1(); //остановить таймер
    D4_Low;       //логический ноль на выходы
    tic=0;       //обнулить счетчик
    attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
    }
    //*************************************************************************
    void loop()
    {Start
    //  if (UART_ReadByte(data))
        if (radio.available()>0)
    {
    //   if(data>47 && data<58)
    //    {
    //      byte inByte = data;
    //      if(inByte>48 && inByte<58){
    //        int jarkost = map(inByte,48,57,3,255);    
    //        leds[0] = CHSV(255,255,jarkost);
    //        FastLED.show();
    //      }
    //      if(inByte == 48){
    //        leds[0] = CHSV(100,255,255);
    //        FastLED.show();
    //      }
          radio.read(&incomingInt, sizeof(incomingInt));
          Serial.println(incomingInt);
          if(incomingInt>=0 && incomingInt<212){
            leds[0] = CHSV(255,255,incomingInt);
            FastLED.show();
            }
          if(incomingInt>212 && incomingInt<216){
            leds[0] = CHSV(100,255,255);
            FastLED.show();
          }
         
    //      data=225-(data-48)*25;
    //      Dimmer1=data;
          Dimmer1=incomingInt;
    //    }
    }
    End}