• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zliczanie impulsów prosty przykład
#21
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ą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości