Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Teodor 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í???
-
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.
-
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 :-/
-
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é.
-
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.
-
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.
-
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.
-
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.
-
Prosím o kontrolu kódu;
Tady je fce délku pulsu, zatím pro jeden bit.
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
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;
-
Nechtěl bys poslat celý kód?
-
Nechtěl bys poslat celý kód?
Ok, tady je:
#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;
}
-
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.
-
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 (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.