[elektro] C tesztsor makróban

hg12345 hg12345 at freemail.hu
Mon Dec 21 17:55:58 CET 2015


Hi!

most ez láb/port vagy változó? mert nem mindegy.
A port esetén van egy global-os includ-od, amit betöltesz és mindenűt használod, míg a változó esetén ezt neked kell megcsinálni.
A macro-hoz így-úgy is szükséges egy globális inlcude ahol a macrot definiálod ebbe már az extern hivatkozásokat a debug változokhoz is beleteheted, innen kezdve már minden úgy működik, mint a port esetén. A main-ban meg meghatározod a változókat 

#ifdef DEBUG   (debugnak lehet értéket adni is,így többszintű befordítás is megoldható
    int dbgvaltozo;
#endif

Most a teszt változók amiről írsz miért használod bitenként? Nem egyszerűbb elemi méretben változóként használni? Egy 16 bites változóban amikor nézed hogyan fogod látni, mikor mi mozgott?

Nézd amit leírtam az pont azt csinálja amit szeretnél. Elnézést, de szerintem kevered a tömböt a struct-urával.  Az egyik változó[index]   míg a másik változó.tag csak ezzel tudsz bitekre hivatkozni. C-ben nincs bites tömb!  A legkisebb tömb egység amit tudsz definiálni az a "char"!

Nem tudom, hogyan van megoldva a MCHIP.ben hogy a struktura tag név szám legyen (nagyon rég használtam de emlékeim között nem szerepel, asm lehetséges az biztos, de C-ben !?!), de ha ez lehetséges
akkor csak ennyi dolgod:

#define    btoggle(port,no)     port.##no^=1

behelyettesítve
    btoggle(PORTH,1) ;     //    PORTH.1^=1;    

(((szerintem ez inkább így van:  btoggle(PORTH,b1)  =>  PORTH.b1^=1;))))

ez biztos átváltja port megfelelő lábát az inverzére, teljes felesleges a feltételes megadás, de ha már szeretnéd akkor is jobban olvasható inkább ez

   PORTH.1=(PORTH.1) ? 0: 1;         ez is invertálja a port lábat, csak egy kicsit komplikáltabban :-)
ha ez jobban tetszik akkor ezt is macro-zhatod
#define btoggle(port,no)     port.##no##=(port.##no##)?0:1

a morzézéshoz meg a macrok egymásba fűzhetőek
  btoggletime(port,no,nops)   port.##no^=1; \
                                          nops

ha dinamikusan szeretnéd feldolgozni ezt akkor a MACRO-ba tetszőleges számú elem tartalmazhat,  
 btoggletime(port,no,##__VA_ARGS)  port.##no^=1; \
                                          __VA_ARGS
ezt aztán lehet korlátlanul folytatni.

-------------------------------------------------------------------------------------------------------------------------------------

Nyomkövetéshez, ha ICD3-t használnál (PIC) esetén ott van utasítás trace 2x128 bejegyzésre, amihez a PC oldalom az mplab-ban időhöz kötött tárolással lehet utána keresni.
Ha ilyen nincs akkor még mindig marad a listázó kimenet maximális sebesség és az állapot kiküldhető sorosan, egy direct USB-USART átalakítóval 2 vagy 3Mbit sebesség mellett tudod loggolni mi történt a programban, egy egyszeri listázóval, vagy pl.: putty"-al....







elight <elight at gmail.hu> írta:
>nem.
>
>Nekem az a gondom,
>hogy egy programban macerás sok sok
>tesztsor sorozatot  kiremezni időnként,
>utána meg visszatenni...
>
>Az IFDEF Testfase_x  ekbe meg
>    előbbutóbb belekavarodok..
>
>És mos éppen akadna sok tesztváltozóm..
>Szubrutinnal vagy makróval lehet a
>problémát kilőni, mert az egy sorban beírható
>és kiremezhető.
>A szubrutinnál sajnos minden modulban, hogy működjön ,
>  kellenek máshol definiált globál változók.
>Tehát a makró ilyesmihez jobb lokalizáltabb lenne,
>és minden tesztfázis után úgyis mindent újra fordítok.
>Illetve ezetket a teszsorokat benne is hagynám kiremezve
>a forrásban , hogy később ha valamiért kell ,
>vissza lehessen emelni.
>Az meg hogy melyik mit csinál , úgyis ott marad
>a kommentje mellette.
>
>
>Tehát mondjuk beírom tesztsorba
>
>   tst_togle_B(6);   // RX preambe megérkezett
>
>
>akkor a makró a következőre fejtené ki, és rakná a programba:
>
>
>
>      if( tst_B6_togle  == 0 )
>      {
>          tst_B6_togle   = 1;
>          LATB.6  = 1;
>      }
>      else
>      {
>          tst_B6_togle   = 0;
>          LATB.6 = 0;
>      {
>
>Vagy mondjuk
>
>tst_togle_B(2);
>
>akkor
>
>      if( tst_B2_togle  == 0 )
>      {
>          tst_B2_togle   = 1;
>          LATB.2  = 1;
>      }
>      else
>      {
>          tst_B2_togle   = 0;
>          LATB.2 = 0;
>      {
>
>
>A togle azért kell, mert a rövid tüskék nem jól
>láthatók egy komplex jelfolyamban , és
>hosszabb isőzítéseket most nem tehetek be..   !!!
>Egyébként sűrűn használtam eddig a mondjuk:
>
>#Debug_F0___________PULSE_10US__()   LATH.3 = 1 ; Delay_us(10); LATH.3 = 0 ; Delay_us(10);LATH.3 = 1 ; Delay_us(10);LATH.3 = 0
>
>vagy lehet cifrázni még jobban, akár mint a morzejelet..:-)
>pl.  két rövid és egy  hosszulépés nekem.;-)
>És ez a markerezés több eseménynél több spúron
>roppant látványosan de jól kiértékelhetően alakulhat
>többirányú párhuzamos kommunikáció esetén is...
>
>
>  Amit írtál másodszor azzal a toggle is  majdnem létrehozható
>
>de már látom hülyeségemet,
>mert a globális változók létrehozását
>mindenképpen el kell végezni minden olyan modulban
>amelyikben használni szeretném,
>mert különben nem kapom vissza az előző értékét..
>( szóval valami ilyesmit szeretnék mégis koncentrálni,  megkerülni )
>
>Üdv István
>
>
>
>
>
>
>
>
>2015-12-21 16:30 keltezéssel, hg12345 írta:
>> biteket csak strukturában tudsz kezelni C-ben "korrekten"
>>
>> typedef struct {
>> 					unsigned	b00:1;					
>> 					unsigned	b01:1;
>> 					unsigned	b02:1;
>> 					unsigned	b03:1;
>> 					unsigned	b04:1;
>> 					unsigned	b05:1;
>> 					unsigned	b06:1;
>> 					unsigned	b07:1;	
>>         } uint8bits_t
>>
>> gondolom ezt ismerted.
>>
>> innen kezdve már csak egy ugrás a bit művelet, de azért érdemes vigyázni a "cast"-lásokkal
>>
>> #define    bitdef(value,bname)     ((uint8bits_t*)&value)[0].##bname
>>
>> #define    btoggle(value,bname)  bitdef(value,bname) ^=1;
>> #define    bset(value,bname)      bitdef(value,bname) =1
>> #define    bclr(value,bname)       bitdef(value,bname) =0
>>
>> ez tetszőlegesen kiterjeszthető, akárhány bites változóra, néhány fordító csak az int hosszúságáig engedélyezi.
>>
>> használat :
>> int AAA;
>> btoggle(AAA,b03);
>>
>> hogy mennyire olvasható, az már ízlés kérdése :-()
>>
>> Szintén vigyázni kell az optimalizálásra, mert azok a változók amit nem használsz tovább ott -O3 esetén kidobásra kerülnek a műveletek, ez nem túl jó a nyomkövetésben, gondolom erre szeretnéd használni.
>> Ez esetben használj "volatile" módosítót a változó definiálásánál, a perifériáknál ezt a gyári includokban megcsinálják.
>>
>> Erre gondoltál?!
>>               
>>
>> -----------------------------------------
>>            elektro[-flame|-etc]
>
>-----------------------------------------
>          elektro[-flame|-etc]



More information about the Elektro mailing list