16-04-2019, 21:28
Kod:
void page13PopCallback(void *ptr) { // Nextion test page13 guage
if(on_data_Obr == true){
on_Loop_Obr = true;
attachInterrupt(digitalPinToInterrupt(pinObrotomierz), Obrotomierz, CHANGE); // CHANGE bo w odczycie podwaja impulsy ISR uruchamia przy zmianie stanu
} // ISR zmiana stanu bo daje mi to 0,5s odczytu a rzeczywistosci ilosc impulsu na 1s.
if(read_data_Obr >= 1){
tachometr.setValue(ilosc_Impulsow_Obr);
read_data_Obr= 0;
}
}
void Obrotomierz() {
impulsy_Obr++;
}
void ObrotomierzLoop(){
if(on_Loop_Obr == true){
on_data_Obr = false;
if(millis() - Tims_Obr >= 500){ // zliczanie impusow przez 0,5s 3ms rojechanie przy 150kHz
Tims_Obr = millis(); // ponowne zliczanie impulsow przez 0,5
ilosc_Impulsow_Obr=(impulsy_Obr); // zapisanie licznik impulsow do bufora
impulsy_Obr=0; // zerowanie licznika by od nowa liczylo
read_data_Obr++; // zmienna czy bufor ilosciImulsow jest wykorzystywany
}
if(read_data_Obr >= 10){ // jezeli bufor ilosciImulsow jest nie wykorzystywany wylaczenie przerywania 10s.
detachInterrupt(digitalPinToInterrupt(pinObrotomierz));
read_data_Obr=0;
on_data_Obr = true;
on_Loop_Obr = false;
}
}
}
void page14PopCallback(void *ptr) { // Nextion test page14 guage
if(on_data_Pre == true){
on_Loop_Pre = true;
attachInterrupt(digitalPinToInterrupt(pinPredkosciomierz), Predkosciomierz, CHANGE); // CHANGE bo w odczycie podwaja impulsy ISR uruchamia przy zmianie stanu
} // ISR zmiana stanu bo daje mi to 0,5s odczytu a rzeczywistosci ilosc impulsu na 1s.
if(read_data_Pre >= 1){
speedometr.setValue(ilosc_Impulsow_Pre);
read_data_Pre= 0;
}
}
void Predkosciomierz() {
impulsy_Pre++;
}
void PredkosciomierzLoop(){
if(on_Loop_Pre == true){
on_data_Pre = false;
if(millis() - Tims_Pre >= 500){ // zliczanie impusow przez 0,5s 3ms rojechanie przy 150kHz
Tims_Pre = millis(); // ponowne zliczanie impulsow przez 0,5
ilosc_Impulsow_Pre=(impulsy_Pre); // zapisanie licznik impulsow do bufora
impulsy_Pre=0; // zerowanie licznika by od nowa liczylo
read_data_Pre++; // zmienna czy bufor ilosciImulsow jest wykorzystywany
}
if(read_data_Pre >= 10){ // jezeli bufor ilosciImulsow jest nie wykorzystywany wylaczenie przerywania 10s.
detachInterrupt(digitalPinToInterrupt(pinPredkosciomierz));
read_data_Pre=0;
on_data_Pre = true;
on_Loop_Pre = false;
}
}
}
void page15PopCallback(void *ptr) { // Nextion obrotomierz i predkosciomierz
if(on_data_Obr == true){
on_Loop_Obr = true;
attachInterrupt(digitalPinToInterrupt(pinObrotomierz), Obrotomierz, CHANGE); // CHANGE bo w odczycie podwaja impulsy ISR uruchamia przy zmianie stanu
} // ISR zmiana stanu bo daje mi to 0,5s odczytu a rzeczywistosci ilosc impulsu na 1s.
if(on_data_Pre == true){
on_Loop_Pre = true;
attachInterrupt(digitalPinToInterrupt(pinPredkosciomierz), Predkosciomierz, CHANGE); // CHANGE bo w odczycie podwaja impulsy ISR uruchamia przy zmianie stanu
} // ISR zmiana stanu bo daje mi to 0,5s odczytu a rzeczywistosci ilosc impulsu na 1s.
if(read_data_Obr >= 1){
tacho.setValue(ilosc_Impulsow_Obr);
read_data_Obr= 0;
}
if(read_data_Pre >= 1){
speed.setValue(ilosc_Impulsow_Pre);
read_data_Pre= 0;
}
}
Przerzuciłem zliczanie na pierwszy procesor jest lepiej zlicza prawidłowo ale sie wiesza co chwila na 1s
Kod:
xTaskCreatePinnedToCore( WiFi_conect_Core_0, "CPU_0", 4096, NULL, 1, &CPU_0, 0); // Utworzenie zadania (pentli) dla pierwszego procesora
xTaskCreatePinnedToCore( AC_data_Core_0, "CPU_0", 4096, NULL, 1, &CPU_0, 0); // Utworzenie zadania (pentli) dla pierwszego procesora
xTaskCreatePinnedToCore( Przerywanie_Core_0, "CPU_0", 4096, NULL, 1, &CPU_0, 0); // Utworzenie zadania (pentli) dla pierwszego procesora
xTaskCreatePinnedToCore( Nextion_Core_1, "CPU_1", 8192, NULL, 1, &CPU_1, 1); // Utworzenie zadania (pentli) dla drugiego procesora
void WiFi_conect_Core_0 ( void * pvParameters ){
TickType_t xLastWakeTime;
const TickType_t xFrequency = 4000; // Co jaki cykl procesora uruchomia zadanie
xLastWakeTime = xTaskGetTickCount();
for(;;){
vTaskDelayUntil( &xLastWakeTime, xFrequency );
WiFi_conect();
}
}
void Przerywanie_Core_0 ( void * pvParameters ){
TickType_t xLastWakeTime;
const TickType_t xFrequency = 5; // Co jaki cykl procesora uruchomia zadanie
xLastWakeTime = xTaskGetTickCount();
for(;;){
vTaskDelayUntil( &xLastWakeTime, xFrequency );
ObrotomierzLoop(); // loop wyliczenia przerywania/impulsu obrotomierza
PredkosciomierzLoop(); // loop wyliczenia przerywania/impulsu predkosciomierza
}
}
void AC_data_Core_0 ( void * pvParameters ){
TickType_t xLastWakeTime;
const TickType_t xFrequency = 10;
xLastWakeTime = xTaskGetTickCount();
for(;;){
vTaskDelayUntil( &xLastWakeTime, xFrequency );
AC_data_send();
recvWithEndMarker(); // loop odczytu z Serial2
showNewData(); // loop zapisu serial2 do UDP
}
}
void Nextion_Core_1( void * pvParameters ){
for(;;){
showUdpData(); // loop odczytu udp i zapisu do Serial2
AC_data();
nexLoop(nex_listen_list); // loop wyswietlacza Nextion
}
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.