Detekce náběžné hrany

Detekce náběžné hrany
« kdy: 28. 07. 2016, 18:07:39 »
Zdravim,
potřebuju poradit.
V c++ píšu čítač pulsů s generátorem pulsů.
Jenže se potýkám s problémem čítače pulsů, je mi jasný že je to detekce náběžné a sestupné hrany, že to souvisí se strojovým časem procesoru, ale nemůžu to za boha nějak domyslet. Dělal jste to tu někdo? Nebo se setkal třeba na BOOSTu s touto funkcí???


source

Re:Detekce náběžné hrany
« Odpověď #1 kdy: 28. 07. 2016, 18:29:38 »
Co vím, tak detekce pulsů není jednoznačná. Řešil bych to přes numerický diferenciál a podmínku if |dy|>"hodnota" then začátek/konec pulsu.

Re:Detekce náběžné hrany
« Odpověď #2 kdy: 28. 07. 2016, 18:35:34 »
Co vím, tak detekce pulsů není jednoznačná. Řešil bych to přes numerický diferenciál a podmínku if |dy|>"hodnota" then začátek/konec pulsu.

Já mám fyzický DO, takže si zatím jen zobrazuji 0 nebo 1, ale potřebuju spočítat délku trvání pulzu. A nemůžu na to za boha přijít a ani na BOOSTu jsem nic nenašel :-/

gl

Re:Detekce náběžné hrany
« Odpověď #3 kdy: 28. 07. 2016, 19:16:21 »
Co vím, tak detekce pulsů není jednoznačná. Řešil bych to přes numerický diferenciál a podmínku if |dy|>"hodnota" then začátek/konec pulsu.

Já mám fyzický DO, takže si zatím jen zobrazuji 0 nebo 1, ale potřebuju spočítat délku trvání pulzu. A nemůžu na to za boha přijít a ani na BOOSTu jsem nic nenašel :-/

Z čeho chceš počítat délku pulzu? Z té tvé otázky to není úplně jasné.

Re:Detekce náběžné hrany
« Odpověď #4 kdy: 28. 07. 2016, 19:22:19 »
No a nemáš tam třeba nějaké přerušení? Pokud to budeš počítat tímhle stylem, tak budeš pálit 100% výkonu jen na tomhle výpočtu.


Re:Detekce náběžné hrany
« Odpověď #5 kdy: 29. 07. 2016, 10:21:29 »
Co vím, tak detekce pulsů není jednoznačná. Řešil bych to přes numerický diferenciál a podmínku if |dy|>"hodnota" then začátek/konec pulsu.

Já mám fyzický DO, takže si zatím jen zobrazuji 0 nebo 1, ale potřebuju spočítat délku trvání pulzu. A nemůžu na to za boha přijít a ani na BOOSTu jsem nic nenašel :-/

Z čeho chceš počítat délku pulzu? Z té tvé otázky to není úplně jasné.

Jo, psal jsem to včera ve spěchu.
Z rozdílu času, prostě přijde nábežná hrana nějaká proměnná si zapamatuje čas, odejde nábežná hrana zase si nějaká proměnná zapamatuje čas a pak z toho udělám rozdíl.

PetrM

Re:Detekce náběžné hrany
« Odpověď #6 kdy: 29. 07. 2016, 11:03:31 »
Dělal, fyzicky. 1b shift register na vstupu + xor vstup - výstup. Tam je to prkotina.

Ale tvůj dotaz je asi tak konkrétní, jako se ptát doktora, proč tě bolí noha, když jsi včera cestoval 3km pěšky.

Re:Detekce náběžné hrany
« Odpověď #7 kdy: 29. 07. 2016, 11:05:00 »
Pritom je to také jednoduché. Preto na to asi nie je funkcia. To by potom musela byť aj na 1 + 1.

Potrebuješ dve premenné. Stav teraz a stav predchádzajúcej vzorky. Potom urobíš xor týchto dvoch premenných. Ak je nenulový bola hrana, ak nulový tak nebola. Takto som to robieval v čase mladosti. Teraz to robí HW kdejakého MCU bez nutnosti striehnuť na to pomocou sw. Aby ti náhodou voľačo neutieklo.

Re:Detekce náběžné hrany
« Odpověď #8 kdy: 07. 08. 2016, 12:30:39 »
Prosím o kontrolu kódu;

Tady je fce délku pulsu, zatím pro jeden bit.
Kód: [Vybrat]
void delka_impulsu(int CAS){


u STAV, ps;

ps.status = 0;

while(true)

{

ptime current_time = microsec_clock::local_time();


ICO300_get_DI(&STAV.status);

if (STAV.b.bit0 != ps.b.bit0)

{
if(STAV.b.bit0 == 1)

{
times[0].start_time = current_time;
}
else

{
times[0].end_time = current_time;
}
}

wait(CAS);




}
}

v mainu potřebuji spočítat délku trvání pulsu, s boostem teprve začínám tak bych potřeboval poradit jestli na to jdu správně.
Mám to tam jako ptime a rozdíl jako time_duration diff

Kód: [Vybrat]
int b;
cout << "Zadejte cas v [ms]: " << endl;
cin >> b;
 
  std::thread t{threadf, b}; //Inicializace vlakna


cout << "Pro odpojeni vlakna stisknete lib. klavesu od 'Q'" << endl;
cin >> c;

if (c != 'Q')
{

endflag = true;


}

t.join();

delka_impulsu(b);

ptime t1 = times[0].start_time;
ptime t2 = times[0].end_time;
time_duration diff = t1 - t2;


cout << "Delka pulsu je: " << diff <<  endl;

gl

Re:Detekce náběžné hrany
« Odpověď #9 kdy: 07. 08. 2016, 15:23:33 »
Nechtěl bys poslat celý kód?

Re:Detekce náběžné hrany
« Odpověď #10 kdy: 07. 08. 2016, 17:07:21 »
Nechtěl bys poslat celý kód?

Ok, tady je:

Kód: [Vybrat]
#include <stdio.h> //g++ -o scanner_vstupu vstupy-vystupy.cpp -m32 -std=c++11 -I /usr/include/i386-linux-gnu/ -L . -lico300 -pthread
#include <unistd.h>
#include <cstdint>
#include <thread>
#include <iostream>
#include <iomanip>
#include "boost/date_time/posix_time/posix_time.hpp"



extern "C" {

#include "libico300.h"
}

using namespace std;
using namespace boost::posix_time;







void wait(int milli_seconds)
{
  this_thread::sleep_for(chrono::milliseconds(milli_seconds));
}

bool endflag = false;





void threadf(int cas)
{
int a = 0;




  while(true)
  {


wait(cas);

std::uint8_t stav; //preda referenci stav jednotlivych bitu

ICO300_get_DI(&stav); //ziska stav DI pinů

if (stav != a )

{

cout << " PULS " << " " << " hexadecimalni cislo: " << hex << " " <<  (int)stav << " dekadicke cislo: " << dec << (int)stav << endl;

}

else

{
cout << " MEZERA " << " " << " hexadecimalni cislo: " << hex << " " <<  (int)stav << " dekadicke cislo: " << dec << (int)stav << endl;
}

a = stav;

/*
for(int i =0; i < 8; ++i){ //Daviduv optimalizacni algoritmus
  cout << (int)(stav & 1);
  stav >>= 1;
 }

*/

if(endflag)
break;
       
  }
}


struct bits
{
   
unsigned bit0 : 1;
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned bit4 : 1;
unsigned bit5 : 1;
unsigned bit6 : 1;
unsigned bit7 : 1;

};



union u  {
    unsigned char status;
    bits b;
};

struct time
{
  boost::posix_time::ptime start_time, end_time;
int posledni_hodnota;

} times[8];

void delka_impulsu(int CAS){


u STAV, ps;

ps.status = 0;





while(true)

{

ptime current_time = microsec_clock::local_time();


ICO300_get_DI(&STAV.status);

if (STAV.b.bit0 != ps.b.bit0)

{
if(STAV.b.bit0 == 1)

{
times[0].start_time = current_time;
}
else

{
times[0].end_time = current_time;
}
}

wait(CAS);




}
}


int main()

{ char c;  
ICO300_set_DIO_mode(0xff); //Vsechny piny jsou vstupni
int b;
cout << "Zadejte cas v [ms]: " << endl;
cin >> b;
 
  std::thread t{threadf, b}; //Inicializace vlakna


cout << "Pro odpojeni vlakna stisknete lib. klavesu od 'Q'" << endl;
cin >> c;

if (c != 'Q')
{

endflag = true;


}

t.join();

delka_impulsu(b);

ptime t1 = times[0].start_time;
ptime t2 = times[0].end_time;
time_duration diff = t1 - t2;


cout << "Delka pulsu je: " << diff << endl;


return 0;  
}

Mirek

Re:Detekce náběžné hrany
« Odpověď #11 kdy: 24. 08. 2016, 15:03:31 »
Zdravim,
potřebuju poradit.
V c++ píšu čítač pulsů s generátorem pulsů.
Jenže se potýkám s problémem čítače pulsů, je mi jasný že je to detekce náběžné a sestupné hrany, že to souvisí se strojovým časem procesoru, ale nemůžu to za boha nějak domyslet. Dělal jste to tu někdo? Nebo se setkal třeba na BOOSTu s touto funkcí???

Bylo by fajn vždycky srozumitelně popsat s čím potřebuješ poradit. Jestli jsem to ze zdrojáků a dalších informací správně pochopil, věc se má takto:

1. máš za úkol na HW ICO300 (http://www.axiomtek.com/Default.aspx?MenuId=Products&FunctionId=ProductView&ItemId=1151&upcat=134) čítat pulzy

2. Programuješ to v C++ a používáš (mimo jiné?) i knihovnu BOOST (http://www.boost.org/)

3. Netušíme jaké pulzy a z jakého zařízení počítáš
   - časování (minimální, maximální trvání pulzu, střída, ...)
   - jde o běžný signál v průmyslovém zařízení? Tj. je nutné předpokládat rušení a eliminovat jeho vlivy a nebo máš ten luxus že můžeš počítat s ideálním signálem

4. vytváříš jednoúčelový program, který jen měří pulzy a výsledek někam posílá (roura, soubor, ...) a nebo jde o část komplexního programu?

5. a případně další a další...

Potom se dá nějak fundovaně radit.

Tommy Angelo

Re:Detekce náběžné hrany
« Odpověď #12 kdy: 24. 08. 2016, 17:01:14 »
Male zlepsenie pri pouzivani vlakien odporucam pouzivanie mutex-u (ostrenie do buducna pri pouziti viacerych vlakien). V odkaze je upravenejsia verzia a taktiez male logicke vylepsenie vo funkcii void threadf(int cas) kde sa definicia premennej stav presunula mimo cyklus, aby sa urychlil cyklus.
http://pastebin.com/GxFmXxnh

Celkovy navrh programu je divny. Vo funkcii void delka_impulsu(int CAS) sa vyskytuje cyklus while (true) ktory vlastne nidky neskonci => nekonecna slucka!
Pri praci s casom je mozne pouzit aj chrono z std http://en.cppreference.com/w/cpp/chrono namiesto boost.