Нужна помощь, зашел в тупик с DS1307

cerceli
Offline
Зарегистрирован: 19.08.2016

Добрый день, пытаюсь сделать измерительный прибор с функцией сохранения значений. Опрос ацп происходит каждые 100 микросекунд, затем при наборе необходимого числа точек осуществляется обсчет действующих значений при этом часы реального времени начинают дико врать и показывать фигню (дата - 85.29.2161 время- 31:54:52). Ставил 1000 мкс показывает нормально (31.03.2017 -- 12:56:37), но наблюдается мерцание на lcd 16x2.

#include <DueTimer.h>
#include <DS1307.h>
DS1307 rtc(SDA, SCL);
long Uism_U = 0;// PIN A0
double MAPUism_U = 0;
double Usq=0;
double  SUMMA_U = 0;
double Usrednee=0;
 
long Uism_V = 0;// PIN A1
double MAPUism_V = 0;
double Vsq=0;
double SUMMA_V = 0;
double Vsrednee=0;
 
long Uism_W = 0;// PIN A2
double MAPUism_W = 0;
double Wsq=0;
double SUMMA_W = 0;
double Wsrednee=0;
 
double Iism_U = 0;// PIN A3
double MAPIism_U = 0;
double IUsq=0;
double SUMMA_IU = 0;
double IUsrednee=0;
 
double Iism_V = 0;// PIN A4
double MAPIism_V = 0;
double IVsq=0;
double SUMMA_IV = 0;
double IVsrednee=0;
 
double Iism_W = 0;// PIN A5
double MAPIism_W = 0;
double IWsq=0;
double SUMMA_IW = 0;
double IWsrednee=0;
 
int i = 0;
void setup() {
Serial.begin (9600);
Timer3.attachInterrupt(firstHandler).start(100); 
delay(10);
rtc.begin();
rtc.halt(false);
ADC->ADC_MR |= 0x80;  // установка free running mode 
ADC->ADC_CHER=0x3cff; // включение каналов АЦП A0 - A11  
ADC->ADC_CR=2;
}
 
void loop() {
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
  Serial.println(rtc.getTimeStr());
}
 void firstHandler(){
Uism_U=ADC->ADC_CDR[7];
MAPUism_U = map(Uism_U, 0, 4095, -2048, 2047);  
MAPUism_U=(MAPUism_U*0.0007989825)+0.0002130097;
Usq=0.0001*sq(MAPUism_U);
SUMMA_U=SUMMA_U+Usq;
 
Uism_V=ADC->ADC_CDR[6];
MAPUism_V = map(Uism_V, 0, 4095, -2048, 2047);  
MAPUism_V=(MAPUism_V*0.0007989825)+0.0002130097;
Vsq=0.0001*sq(MAPUism_V);
SUMMA_V=SUMMA_V+Vsq;
 
Uism_W=ADC->ADC_CDR[5];
MAPUism_W = map(Uism_W, 0, 4095, -2048, 2047);  
MAPUism_W=(MAPUism_W*0.0007989825)+0.0002130097;
Wsq=0.0001*sq(MAPUism_W);
SUMMA_W=SUMMA_W+Wsq;
 
Iism_U=ADC->ADC_CDR[4];
MAPIism_U = map(Iism_U, 0, 4095, -2048, 2047);  
MAPIism_U=(MAPIism_U*0.0007989825)+0.0002130097;
IUsq=0.0001*sq(MAPIism_U);
SUMMA_IU=SUMMA_IU+IUsq;
 
Iism_V=ADC->ADC_CDR[3];
MAPIism_V = map(Iism_V, 0, 4095, -2048, 2047);  
MAPIism_V=(MAPIism_V*0.0007989825)+0.0002130097;
IVsq=0.0001*sq(MAPIism_V);
SUMMA_IV=SUMMA_IV+IVsq;
 
Iism_W=ADC->ADC_CDR[2];
MAPIism_W= map(Iism_W, 0, 4095, -2048, 2047);  
MAPIism_W=(MAPIism_W*0.0007989825)+0.0002130097;
IWsq=0.0001*sq(MAPIism_W);
SUMMA_IW=SUMMA_IW+IWsq;
i=i+1;
 
  if (i==199){
SUMMA_U=SUMMA_U/0.02;   
Usrednee =sqrt(SUMMA_U);
Usrednee=Usrednee*381;
 
 
SUMMA_V=SUMMA_V/0.02;  
Vsrednee =sqrt(SUMMA_V);
Vsrednee=Vsrednee*381;
 
SUMMA_W=SUMMA_W/0.02;  
Wsrednee =sqrt(SUMMA_W);
Wsrednee=Wsrednee*381;
 
SUMMA_IU=SUMMA_IU/0.02;  
IUsrednee =sqrt(SUMMA_IU);
IUsrednee=IUsrednee*381;
 
 
SUMMA_IV=SUMMA_IV/0.02;  
IVsrednee =sqrt(SUMMA_IV);
IVsrednee=IVsrednee*381;
 
 
i=0;
SUMMA_U=0;
SUMMA_V=0; 
SUMMA_W=0; 
 
SUMMA_IU=0;
SUMMA_IV=0; 
SUMMA_IW=0; 
  }
}
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

cerceli, вы столько напихали в прерывание, что никакая другая работа, требующая соблюдения временных параметров невозможна. И зачем вам Due? У него огромные возможности, из которых вы не ничего используете.

cerceli
Offline
Зарегистрирован: 19.08.2016

Due и еще пакетик железяк досталась бесплатно, имеется желание все это освоить, даташит англоязычный что вызывает сумбур в голове. Вчера скетч работал, но то ли он не сохранился в нужной форме то ли еще что. К сожалению в моем городе нет никаких кружков и платных курсов по данной тематике, да и в сети не много инфы по ней поэтому огромные возможности не задействованы) .В loop   организовал через flprog циклический вывод данных на lcd+ добавлю запись данных на сд карту.Хочется разобраться. 

cerceli
Offline
Зарегистрирован: 19.08.2016
Есть еще такой вариант) Как лучше организовать прерывание)?
 
#include <DueTimer.h>
long Uism_U = 0;// PIN A0
double MAPUism_U = 0;
double Usq=0;
double  SUMMA_U = 0;
double Usrednee=0;

long Uism_V = 0;// PIN A1
double MAPUism_V = 0;
double Vsq=0;
double SUMMA_V = 0;
double Vsrednee=0;

long Uism_W = 0;// PIN A2
double MAPUism_W = 0;
double Wsq=0;
double SUMMA_W = 0;
double Wsrednee=0;

double Iism_U = 0;// PIN A3
double MAPIism_U = 0;
double IUsq=0;
double SUMMA_IU = 0;
double IUsrednee=0;

double Iism_V = 0;// PIN A4
double MAPIism_V = 0;
double IVsq=0;
double SUMMA_IV = 0;
double IVsrednee=0;

double Iism_W = 0;// PIN A5
double MAPIism_W = 0;
double IWsq=0;
double SUMMA_IW = 0;
double IWsrednee=0;

int i = 0;

void setup()
{
Serial.begin(9600);
Timer3.attachInterrupt(firstHandler).start(100); // Every 500ms
delay(10);
ADC->ADC_MR |= 0x80;  // установка free running mode 
ADC->ADC_CHER=0x3cff; // включение каналов АЦП A0 - A11  
ADC->ADC_CR=2;
}
void loop()
{
  if (i==199)
  {
SUMMA_U=SUMMA_U/0.02;   
Usrednee =sqrt(SUMMA_U);
Usrednee=Usrednee*381;

Serial.println (Usrednee);
SUMMA_V=SUMMA_V/0.02;  
Vsrednee =sqrt(SUMMA_V);
Vsrednee=Vsrednee*381;

SUMMA_W=SUMMA_W/0.02;  
Wsrednee =sqrt(SUMMA_W);
Wsrednee=Wsrednee*381;

SUMMA_IU=SUMMA_IU/0.02;  
IUsrednee =sqrt(SUMMA_IU);
IUsrednee=IUsrednee*381;


SUMMA_IV=SUMMA_IV/0.02;  
IVsrednee =sqrt(SUMMA_IV);
IVsrednee=IVsrednee*381;

SUMMA_IW=SUMMA_IW/0.02;  
IWsrednee =sqrt(SUMMA_IW);
IWsrednee=IWsrednee*381;
i=0;
SUMMA_U=0;
SUMMA_V=0; 
SUMMA_W=0; 

SUMMA_IU=0;
SUMMA_IV=0; 
SUMMA_IW=0;
  }

}

void  firstHandler ()
  {
Uism_U=ADC->ADC_CDR[7];
MAPUism_U = map(Uism_U, 0, 4095, -2048, 2047);  
MAPUism_U=(MAPUism_U*0.0007989825)+0.0002130097;
Usq=0.0001*sq(MAPUism_U);
SUMMA_U=SUMMA_U+Usq; 

Uism_V=ADC->ADC_CDR[6];
MAPUism_V = map(Uism_V, 0, 4095, -2048, 2047);  
MAPUism_V=(MAPUism_V*0.0007989825)+0.0002130097;
Vsq=0.0001*sq(MAPUism_V);
SUMMA_V=SUMMA_V+Vsq;

Uism_W=ADC->ADC_CDR[5];
MAPUism_W = map(Uism_W, 0, 4095, -2048, 2047);  
MAPUism_W=(MAPUism_W*0.0007989825)+0.0002130097;
Wsq=0.0001*sq(MAPUism_W);
SUMMA_W=SUMMA_W+Wsq;

Iism_U=ADC->ADC_CDR[4];
MAPIism_U = map(Iism_U, 0, 4095, -2048, 2047);  
MAPIism_U=(MAPIism_U*0.0007989825)+0.0002130097;
IUsq=0.0001*sq(MAPIism_U);
SUMMA_IU=SUMMA_IU+IUsq;

Iism_V=ADC->ADC_CDR[3];
MAPIism_V = map(Iism_V, 0, 4095, -2048, 2047);  
MAPIism_V=(MAPIism_V*0.0007989825)+0.0002130097;
IVsq=0.0001*sq(MAPIism_V);
SUMMA_IV=SUMMA_IV+IVsq;

Iism_W=ADC->ADC_CDR[2];
MAPIism_W= map(Iism_W, 0, 4095, -2048, 2047);  
MAPIism_W=(MAPIism_W*0.0007989825)+0.0002130097;
IWsq=0.0001*sq(MAPIism_W);
SUMMA_IW=SUMMA_IW+IWsq;
i=i+1;
}  
  

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cerceli пишет:

имеется желание все это освоить

Освойте, для начала, вот это :)

cerceli
Offline
Зарегистрирован: 19.08.2016

Спасибо,буду знать.