Нужна помощь, зашел в тупик с DS1307
- Войдите на сайт для отправки комментариев
Пт, 31/03/2017 - 13:59
Добрый день, пытаюсь сделать измерительный прибор с функцией сохранения значений. Опрос ацп происходит каждые 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;
}
}
cerceli, вы столько напихали в прерывание, что никакая другая работа, требующая соблюдения временных параметров невозможна. И зачем вам Due? У него огромные возможности, из которых вы не ничего используете.
Due и еще пакетик железяк досталась бесплатно, имеется желание все это освоить, даташит англоязычный что вызывает сумбур в голове. Вчера скетч работал, но то ли он не сохранился в нужной форме то ли еще что. К сожалению в моем городе нет никаких кружков и платных курсов по данной тематике, да и в сети не много инфы по ней поэтому огромные возможности не задействованы) .В loop организовал через flprog циклический вывод данных на lcd+ добавлю запись данных на сд карту.Хочется разобраться.
#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; }имеется желание все это освоить
Освойте, для начала, вот это :)
Спасибо,буду знать.