You are here

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

13 posts / 0 new
Last post
Markhazy
Markhazy's 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_mb

0

Vote up!

You voted ‘up’

agressiv
agressiv's 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

Vote up!

You voted ‘up’

Markhazy
Markhazy's 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

Vote up!

You voted ‘up’

Oszi11
Oszi11's 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

Vote up!

You voted ‘up’

Markhazy
Markhazy's 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

Vote up!

You voted ‘up’

Jaca
Jaca's 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

Vote up!

You voted ‘up’

kovacsna_mb

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

Vote up!

You voted ‘up’

agressiv
agressiv's picture

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

0

Vote up!

You voted ‘up’

kovacsna_mb

Szia!

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

Üdv,
KN

0

Vote up!

You voted ‘up’

agressiv
agressiv's picture

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

0

Vote up!

You voted ‘up’

agressiv
agressiv's 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

Vote up!

You voted ‘up’

Jaca
Jaca's picture

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

0

Vote up!

You voted ‘up’

More similar content