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.