Fórum témák
» Több friss téma |
Az fname tömb nem dinamikus, egyszerű statikus tömb. A sizeof utasítás a paraméterül kapott tömbök méretével tér vissza fordítási időben. Egyébként az ilyesmit nem így szokás megoldani. Legegyszerűbb, ha létrehozol egy lokális tömböt, amely elegendő méretű ahhoz, hogy a karakterek elférjenek benne. Mivel lokális, a stack-en jön létre, tehát a függvényből való kilépés után megszűnik és nem foglalja tovább a helyet. Ezután már ezen a lokális tömbön lehet végezni a string műveleteket.
Az alábbi eljárás 32 bites előjeles (long) típusú paramétert alakít karakterekké és ír ki.
lcd_putc() helyére az egy karakter kiíró eljárásod nevét helyettesítsd be!
Kis módosításokkal, ugyanezzel az eljárással, felskálázott értékeket adott tizedesjegyre is kiírathatunk (pl. millivoltokra átszámított feszültséget 3 tizedesre, vagy tizedfokokban mért hőmérsékletet 1 tizedesre):
Ha megkérlek írsz erre egy példát? Én sem szeretném túlbonyolítani.
ezt szeretném feltölteni, akkor strcat jó lesz nekem? Egyébként próbálkoztam így is, de valahogy nem stimmelt. Pl.: Az strcat visszatérési értékével kell folytatnom, azaz ha további strcat -ot hívok, akkor valahogy így?
Amiket hozzáfűzök, azokba van másik char[] és az RTCC miatt lenne BYTE is. Ezeket cast-oljam char-ra, hogy az strcat működjön? (vagy legalább a BYTE-ot?) RTCC-vel kapcsolatban én is belefutottam a fenti problémába, de nekem úgy sem működik az év megadásával a 14, hogy 0x14..
Közben látom, hogy az strcat visszatérési értékével nem kell csinálnom semmit!
Szerintem ez már jól működik, a gond lehet, hogy inkább az RTCC-vel van! Ha van egy ilyenem:
Miként fűzöm hozzá a fname char tömbhöz? char -ra való cast nem igazán sikerült, próbáltam beletenni egy char tömbbe az yr változót és azt hozzáfűzni az fname -hez strcat-al Itt 2 gond van (és időnként nem vagyok benne biztos, hogy MPLAB alatt azt látom ami a valóság) simulator-ban próbálkozom:
ha az év 14 akkor belekerül, hogy 14, de utána:
futása után az fname 145 -el bővül, a vicc, hogy az 5 az a hónap ami utána van egy a yrarr-hoz hasonló mtharr tömbbe! Érdekelne mi lehet.. túlcsordul és az azt követő memóriacím alatt éppen a rákövetkező tömb tartalma található?
Az persze probléma, hogy az yarr mérete 2 byte, amibe bele kéne férnie az yr értéknek megfelelő karaktereknek (ez BYTE esetén legrosszabb esetben 3 is lehet), plusz a lezáró 0-byte-nak is. Szóval minimum 4-nek kéne ott lennie. A végtelen sok strcat-olgatás helyett pedig egyben kéne előállítani az egész stringet, pl.:
Persze az fname tömbnek akkorának kell lennie, hogy bármi is van az egyes mezőkben, a végeredmény elférjen benne. A hozzászólás módosítva: Máj 21, 2013
Hát igen talán az elsők között volt az sprintf ilyen használata, csak oda %s -et írtam, könnyen lehet, hogy azért volt rossz az egész utána!
Szia!
Itt mindenki bináris számokkal gondolkodik, de az RTC -d pakold BCD -ben adja az évet, hónapot, napot, órát percet és a másodpercet. Ha ezeket ez adatokat szeretnéd string -be konvertálni, egyszerűen a %d helett alkalmazz %x -et. (Az RTC nem fog 9 nél nagyobb digitet adni ezeknél az adatoknél, bár elképzelhető, hogy más adatot kaphatunk a nem használt biteken. Ekkor maszkolással lehet eltávolítani a nem kívánt adatot.) Miért kell ennyit számolgatni?
Ráadásul a fordító a >>4 műveletet swapf -re fordítja, nem osztásra. A hozzászólás módosítva: Máj 21, 2013
A fentebb leírt sprintf működik remekül, köszönöm!
Igen a másik gondom az RTCC.. láttam, hogy BCD és, hogy miként lehetne neki kezdő értéket adni, de nem működik. Amit Te írtál, ahhoz miként kell beállítani? Erre gondolok:
Ez nem jó, de 0x14 -el sem megy, az a helyzet, hogy amikor itt debugolok, és megnézem mi van az RtccTimeDate struct -ba, látom, hogy a decimal érték 14.. Aztán amikor lekérem akkor nem ezt adja vissza. Az általad leírt kódnál a date tömbbe az év helyén 17 áll ilyenkor. Gyanítom nem így kell megadni neki..
Szia!
A 14 decimális érték 0x0E, azaz nem egy BCD szám. Ahhoz, hogy beírd az értéket az RTC -be előbb BCD kódra kell konvertálni. A year változó tárolja az évszámot évszázad nélkül (0..99). byte year_BCD; year_BCD = year + (year / 10) * 6; Ezt írd be az RTC éveknek megfelelő helyére. Ugyan így a többi dátum és idő résszel. Vizsgálatkor nem decimálisan, hanem hexadecimális formában nézd és az értéket pakolt BCD formában értsd - ugyan úgy néznek ki. Kiolvasáskor ne decinális kiíratást használj. Pl. 13.05.21 dátumot véve: year = 13 = 0x0D, month = 5 = 0x05, day = 21 = 0x15. BCD -re konvertálva, year_BCD = 0x13 = 19, month_BCD = 0x05 = 5, day_BCD = 0x21 = 33. Tehát az RTC -be évnek 19 -et, hónapnak 5 -öt, napnak 33 -at kell beírni. Kiolvasni is ezt fogod. Ha hexadecimális formában íratod ki a sprintf vel, akkor 0x13 0x05 0x021 -et kapsz, ha a date stringbe konvertálod akkor "13.05.21" lesz az eredmény. A hozzászólás módosítva: Máj 21, 2013
Sziasztok !
Tudom nem a reklám helye ,de tettem az apróba egy hirdetést ,aki C -ben ,PIC-ben otthon van ,hátha érinti a dolog. Köszönettel ! -istván A hozzászólás módosítva: Máj 21, 2013
Szia!
Sajnos még mindig nem az igazi. Így állítom be:
aztán kiolvasás:
Erre ráhúztam a Te string-es példádat fentebb és a Watch ablak szerint 0x05 hexa, decimal 5 van benne, a date string pedig: "05.07.05" -öt adott még mindig nem 13 az év
Úgy tűnik a szimulátoral való próbálkozással van a gond.
Így olvasom ki a dátumot, és ugye rossz értékek vannk benne, viszont az előző függvényben beállított változóból:
olvasva OK, a date string tartalmazza a 13 -as évet!
Szia!
Sajnos nem tudom, hogy mit is csinál egy ilyen sor: RtccTimeDate.f.min = 7;. Az RTC idő regisztereit a RCFGCAL regiszter RTCPTR<1:0> bitjeivel címezve lehet az RTCVAL regiszteren keresztül: RTCVAL<15:8>: RTCVAL<7:0>: 11 = Reserved 11 = YEAR 10 = MONTH 10 = DAY 01 = WEEKDAY 01 = HOURS 00 = MINUTES 00 = SECONDS Szóval, a dátum és az idő beállítása (nincs nagy gyakorlatom ezzel a típussal):
A hozzászólás módosítva: Máj 21, 2013
Egyébként a szimulátorról csak annyit, hogy az általad választott kontroller béta szupportált a szimulátorban, tehát nincs garancia arra, hogy jó értékeket mutat a SIM. Ezért az lenne a legjobb, ha a valós kontrolleren, debugger segítségével nézegetnéd az értékeket. Az is lehet, hogy teljesen jó amit csináltál, csak a szimulátor ad megtévesztő eredményt!
Ebből kiindulva megoldottam a problémát egy IntToStr függvénnyel. Ha olyat szeretnék, hogy pl. A=234, azt hogy tudom kiíratni?
Én így álltam neki: int a=234; char szam[4]; ... IntToStr(a,szam); LCD_OUT(1,1,szam); Ekkor megjelent a 234 két hellyel jobbra, tehát úgy, mint ha az LCD_OUT(1,3,szam); parancsot adtam volna ki. Én viszont azt gondoltam, hogy így jó lesz, de nem: LCD_OUT(1,1,"A = " ); LCD_OUT(1,5,szam); Ekkor megzavarodik az egész. Kétszer jelenik meg a felirat, egyszer a második sorban és a számot, ha éppen négy jegyű a kijelző két szélén jeleníti meg szétbontva. Most próbálok áttérni PIC Basic Pro-ról C-re, úgyhogy ez a rész még elég új. A hozzászólás módosítva: Máj 22, 2013
A válaszhoz látni kellene az IntToStr() és az LCD_OUT() függvényed forrását. Például nem tudom, hogy az előjelet (vagy szóközt) kiíratod-e külön karakterként?
Sziasztok!
Újra előkerült EZ a probléma, tehát konstansokat pakolnék a program memóriába szekciókba, de nem megy azzal a technikával ahogy a függvényeknél működik. MPLAB C30. A .gld:
És a forrásban:
Hiba nélkül lefordul.. Mit csinálok rosszul?
A DS51317 dokumentum 10. fejezét kellene megérteni hozzá (nekem még nem sikerült...). Itt a 10.4.1, illetve 10.4.2 alfeezetekben beszél hasonló dolgokról. Ami bonyolítja a megértést: bekavar a képbe a PSV elérhetőség is, no meg az is, hogy a mintapéldák assembly-ben vannak.
Sziasztok!
Kellene egy kis segítség. Kezdő vagyok nagyon a C18-ban (persze ASM-ben is) ezért megakadtam egy ponton. Lenne egy változóm ami 1 byte hosszú lenne egy kezdeti értéke mondjuk 11001100 majd ez léptetném vagy balra, vagy jobbra. Az alsó négy bithez hozzá rendelném valahogy négy I/O portot. volt egy kísérletem, de hibával száll ki: header részlet:
a program részlet:
valamit nagyon benéztem csak nem tudom mit.
A hozzászólás módosítva: Máj 30, 2013
Szia!
A linkernek az a baja, hogy nem találja az x_motbits változót, azaz nem definiáltad le sehol. A másik, hogy gondolom az x_mot az x_motbits-et is akarná jelenteni. A harmadik, hogy hiába rakod be a LATA0 jelzést a struktúrába, az nem a LATA-t fogja állítani, hanem az x_motbits.LATA0 bitjét (x_motbits.LATA0 megegyezik x_motbits.b0-al). Szerintem erre gondolhattál: Header:
c:
Persze a LATA így még mindig nincs átállítva, azt mindenképp külön kell megtenni. volatile, near tuti kell? Megszakításból használod? Az extern azt jelzi, hogy az utána következő változó már le van definiálva egy .c fájlban, és csak az elérhetőségét adja meg. Header-be "extern char i;" .c-be "char i;". A union-ból létrehozott változó mérete a unionban lévő legnagyobb típus mérete lesz, és a sorrendben megadott típusok a memória ugyanazon helyére mutatnak. Tehát a fenti kódban az x_mot.b0 az xmot.Value nulladik bitje. Idézet: Pontosítás: a "4 I/O port" az csak egy I/O port kimeneti adatregiszterének négy bitje.„Lenne egy változóm ami 1 byte hosszú lenne egy kezdeti értéke mondjuk 11001100 majd ez léptetném vagy balra, vagy jobbra. Az alsó négy bithez hozzá rendelném valahogy négy I/O portot.” Az uniókkal való cirkusz helyett egyszerűbb így:
Forgatod az adatbájtodat, majd amikor kell, akkor "kiíratod":
Igen a megszakítás lenne a megoldás, de itt a project: http://www.hobbielektronika.hu/forum/topic_post_1447055.html#1447055
A lábakat azért akatam "linkelni" a változó egyik bitjéhez mert eleve tévedtem most ebben a pillanatban jöttem rá. hmm Végül is csak a 0-ik bit kell, és a byte-nak pedig "forogni" kell, azaz ami a léptetés során elveszne érték, az a másik oldalon jelenjen meg. Tömböt lehet így "forgatni"?
Remélem nem tévedek nagyot.
csak az első azaz X ilyen szabályos az Y az RA4,RA5,RC0,RC1 a Z RC2, RC7, RC6,RB3
A hozzászólás módosítva: Máj 31, 2013
Idézet: „x_mot[4]>>1 // amikor is mind a négy érték egyet lép egyszerre” x_mot[4] >>= 1; Szerintem csak a tömb 4. elemét lépteti.
Ahogy a kollega mondja.
A >>, << egy bitmozgató művelet, tömbökön, egyebeken nem műkszik. Ezen kívül jó tudni, hogy ez nem a pic-féle rlncf, azaz az egyik oldalon kieső bit nem kerül a másik oldalra, hanem minden esetben 0-ák jönnek be.
Nekem most pont ez a hátrány, hogy 0-ák jönnek.
Igazából erre van szükségem:
igaz ez ASM, de pont azt csinálja ami nekem kell. Viszont C-ben minden fontosabb lépésnél ASM-et használni, nem túl elegáns és a C-t akarom megtanulni. A hozzászólás módosítva: Máj 31, 2013
A C18 -ban vag rá gyári macro:
Rlncf(var, dest, access); Rrncf(var, dest, access); dest 0 -> eredmény a WREG -ben, dest 1 -> eredmény a var -ban. access 0 -> ACCESS bank szerint, access 1 -> BSR bank szerinti bank választás. Ha valaki megnézi az assembly kódot is, rájön erre is: x >>= 1; if (STATUSbits.C) x |= 0x80; A hozzászólás módosítva: Máj 31, 2013
|
Bejelentkezés
Hirdetés |