You are here

PIC programozás CCS-ben printf ciklusba szervezése

13 posts / 0 new
Last post
Markhazy
Markhazy picture

Sziasztok,

Többször találkoztam már ezzel a jelenséggel és szeretném megtudni hogy mi okozhatja. Elsőre általánosan próbálom leírni röviden, hátha találkozott már más is hasonlóval.

PIC16F874A a fordító CCS, verzió ha szükséges megnézem. De a tippem az hogy a legújabb.

A jelenség az hogy a printf() illetve sprintf() függvények ciklusba szervezve valamiért furcsán működnek, az általuk portra vagy stringbe nyomtatott float értékek hibásak. Viszont ha kivesszük ezeket az utasításokat a ciklusból akkor teljesen jól működnek.

például

Verzió 1 (Hibás a stringbe nyomtatott érték)

char ptr[32];
...
do{
sprintf(ptr,"%f5.1",var);
...
to do..
...
}while(1);

Verzió 2 (A stringbe nyomtatott érték jó)

char ptr[32];
..
sprintf(ptr,"%f5.1",var);
do{
...
to do
...
}while(1);

Bármilyen ciklussal is próbálom a jelenség ugyan az. Illetve ha egy cimke + goto  páros van a ciklus helyett akkor is előjön. Egyértelműen device vagy fordítóspecifikus a dolog mivel standard C ben PC-n működik a verzió 1-es kódszerkezet is.

Szerintetek mi okozhatja?

Köszönöm
M.
 

Comments
kovacsna
kovacsna picture
*

0

agressiv
agressiv picture
*

Régóta programozok a CCSC-ben, de ilyen módon írt kódot még életemben nem láttam benne. Mi az a kapcsos zárójel után lévő while (1)? Lehet valami olyan könyvtárban van ilyen, amit én nem hazsnálok, de nekem ez az egész furcsa do meg to do-t, sem láttam még ccsc programban..

0

Markhazy
Markhazy picture

Igazad van, rosszul írtam, itt a javított változat

például

Verzió 1 (Hibás a stringbe nyomtatott érték)

float var;
char ptr[32];
//...
do{
sprintf(ptr,"%f5.1",var);

/*...
to do..
...*/
}while(1);

Verzió 2 (A stringbe nyomtatott érték jó)

float var;
char ptr[32];
//..
sprintf(ptr,"%f5.1",var);
do{

/*...
to do
...*/
}while(1);

0

Oszi11
Oszi11 picture

Szia Markhazy!Azt szeretnéd hogy 5 az egész rész 5 széles mezőbe kerüljön a tört rész 1 széles legyen akkor annak a formátum sztringje "%5.1f". Egyébként egyszerűbb lenne ha látnánk mi a hiba milyen változóérték milyen alakban jelenik meg.

Üdv,
    Oszi

File csatolás: 

0

Markhazy
Markhazy picture

Szia

Megvan a probléma. Az sprintf() meghívása után illetve a függvény futása közben is több tmr1 interrupt is történik. De úgy is írhatnám hogy az sprintf() futása közben megszakításokat generál a tmr1 és ezen megszakítások okozzák a problémát. Ha az sprintf() előtt letiltom a megszakításokat illetve utána engedélyezem, akkor minden ok. Viszont ez nem jelent megoldást sajnos mivel ezalatt az idő alatt nem kapok tmr1 megszakításokat.

"Azt szeretnéd hogy 5 az egész rész 5 széles mezőbe kerüljön a tört rész 1 széles legyen akkor annak a formátum sztringje "%5.1f""

Ezt tudom, csak valamilyen fórumon olvastam azt hogy az 5.1 követi a %f-et, ami nem a standard mód. Itt a topic, 2. hsz.

http://www.ccsinfo.com/forum/viewtopic.php?p=78494

A feladat az hogy van egy float érték, aminek a decimális helyeit kell külön kiküldeni a PIC B portjára mert ott van egy 4 digites 7 szegmenses kijelző multiplex üzemmódban. Erre elsőnek azt találtam ki hogy a floatot belenyomtatom egy stringbe és a karaktereket már külön tudom kezelni, de nem jött be sajna.

0

Jaca
Jaca picture
*****

Szia!

Tedd be a megszakításba a kiíratást. Az első megszak az első digitet, a következő a másodikat, a harmadik a harmadikat, negyedik a negyedik digitet írja, aztán kezdődhet előlről.

0

kovacsna
kovacsna picture
*

Szia!

Ilyet nem szoktak megszakításba tenni.
Alap, hogy a megszakító rutin a lehető legrövidebb legyen.

Kell egy kiiró rutin simán, amit mondjuk triggerel egy felfutó él, amit meg a timer indít.

Üdv,

KN

0

agressiv
agressiv picture
*

Szerintem ahhoz lassú lesz a kiíratás, ehhez valami saját rutin kellene.

0

kovacsna
kovacsna picture
*

Szia!

A megszakítás rutinban mi van?
Ez nekem inkább programszervezési hibának tűnik.

Üdv,
KN

0

agressiv
agressiv picture
*

A tmr-ben van a kijelző vezérlése ugye és elakad, ha letiltod?

0

agressiv
agressiv picture
*

Biztos én vagyok lemaradva, de nálam az ilyesmi így néz ki péládul. Ha while az if helyére kerül akkor is ugyanez, eleve nem értem a kódodat.

if (mute==0)
          {
           i2c_start();
           i2c_write(0b10001000);
           delay_us(10);
           i2c_write(0b11111001);
           delay_us(10);
           i2c_stop();
           printf(lcd_putc,"\f      MUTE  \n       ON");
           mute=1;
          }

0

Jaca
Jaca picture
*****

Uhh. Nekem tele lenne BTFSC-vel, meg MOVLW-vel, meg MOVWF-fel laugh

0

Sponsored links