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.
Szia!
Hm?
https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/485180?sprintf-function-in-ccs
https://ccsinfo.com/forum/viewtopic.php?p=41220
KN
0
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
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
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
0
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
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
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
Szerintem ahhoz lassú lesz a kiíratás, ehhez valami saját rutin kellene.
0
Szia!
A megszakítás rutinban mi van?
Ez nekem inkább programszervezési hibának tűnik.
Üdv,
KN
0
A tmr-ben van a kijelző vezérlése ugye és elakad, ha letiltod?
0
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
Uhh. Nekem tele lenne BTFSC-vel, meg MOVLW-vel, meg MOVWF-fel
0