Fórum témák
» Több friss téma |
Próbáltam, de nem működik. Nem ír ki semmilyen számot. Ha benne hagyom a °C akkor csak annyit, ha nem akkor a szám helye üres. Bár én nem LCD_putc-t használok, hanem user_putc de ettől függetlenül működnie kéne.
Egyébként jobb is lenne ha működne, mert jelenleg csak a tizedespont utáni értékeket tárolom a táblázatban és van 5-6 if függvény amivel vizsgálom mikor milyen számot kell elé írni + a tizedespont, ami kicsit zavaró és felesleges. A változóm unsigned char volt de átírtam unsigned intre, de úgy sem jó. A másik gondolom, hogy még mindig nem jöttem rá miért kell a POT1-nek unsigned int-nek lennie a char helyett. Csak nem működik unsinged charral a fentebb említett hiba még mindig fennáll. A hozzászólás módosítva: Márc 12, 2016
esetleg itoa () függvény és ezután bebiggyeszted a pontot és sztringként kiírod.
Az itoa-t nem ismerem, majd megnézem, de jobb lenne ha működne a printf-el ez a tizedes kiírás, hátha a kolléga meg tudja mondani mit rontottam el.
Neked kellene utánanézni pontosan, hogy a printf függvény hogyan működik... Szerintem.
A hozzászólás módosítva: Márc 13, 2016
POT1 azért kell, hogy unsigned int legyen, mert a C mindig annyi biten képzi az eredményt, ahány bitje a legszélesebb operandusnak van. Két 8 bites szám szorzatát ezért 8 biten képzi, ezzel gyakorlatilag levágva a felső 8 bitjét az eredménynek. Ezért vagy eleve a POT1 kell, hogy 16 bites legyen, vagy helyben kell castolni 16 bitesre.
A hozzászólás módosítva: Márc 13, 2016
Oh, így már világos. Kösz!
Akkor már csak a printf-es problémát kellene megoldani.
Most néztem még meg az excel tábládat, kb én is így csináltam a lényege, hogy a kíván érék százszorosával számolsz, de valahogy kiíratni így is ki kell a tizedespontot én erre lennék kíváncsi.
Írsz rá egy rutint...
A hozzászólás módosítva: Márc 13, 2016
Én mindig 'frame buffer'-t szoktam használni az LCD-hez, ott meg csak odébb kell pakolni 1-2 karaktert, utána meg a pontot beletenni.
Mindegy megoldottam printf-en belül ezzel:
printf("%d.%02d", POT_2/100, POT_2%100); Most már csak optimalizálni kéne a programot, amin lehet gyorsítani, bár még lehet így is jó lenne, sajnos nem tudom hogy lehet szimulálnia program futását C18-ban, nem fogalmam sincs milyen gyors a progi. A disassemblyt még nem néztem. A hozzászólás módosítva: Márc 13, 2016
debugger->settings órajelet beállítani és ezután break pontokat teszel a program bizonyos részeire és méred az időt . ( stopWatch)
A hozzászólás módosítva: Márc 14, 2016
Sajnos akadt egy kis problémám a debug-al. Elindítom, majd nyomok egy szünetet és nem látom a zöld nyilat, hol jár. Ha nyomom a lépkedést lépked valamerre, de hogy éppen hol jár azt nem mutatja. Valami nincs jól beállítva?
A C-ben beírt egy utasítás gépi kódban általában több...ott lépked ( megláthatod, ha a disassembly ablakot nézed
![]() ![]() A hozzászólás módosítva: Márc 14, 2016
Disassembly: !Source not found, file: E:/3.46/pic18-lt/cxx-framework/src/traditional/delays/d10ktcyx.asm
View --> Disassembly Listing ( MPLAB IDE-nél, MPLABX-nél nem tudom
![]()
Megtaláltam, de ott sem lépked és a zöld nyilat még mindig nem látom.
Ráadásul jó hosszú kódot generált majdnem 10x annyi mint c-ben. A hozzászólás módosítva: Márc 14, 2016
Pedig ott már kell, hogy lépkedjen, ha jó a projekted !
Akkor valami nem stimmel. Lefordulni lefordul és proteusban működik.
Idézet: „Elindítom, majd nyomok egy szünetet és nem látom a zöld nyilat, hol jár.” Ha magas szintű nyelven végzed a nyomkövetést, a beépített eljárásokat és függvényeket nem tudod nyomkövetni. Ekkor néhányszor addj ki "lépés" parancsot. Ha az optimalizálás be volt kapcsolva a fordításkor, a kódban rendszertelenül fog lépkedni a nyomkövetés, de előbb - utóbb eljut a keresett sorra. Célszerűbb a vizsgálni kívánt sorra töréspontot tenni.
Ilyen akkor is szokott lenni, ha pl. nem törölsz egy megszakítás jelet és beragad egy megszakításba, vagy a megszakítás indoka állandóan él(soros port, timer stb). Elvileg a megszakításban kéne forognia, még sem azt látom az X-ben. Biztosan sok időt tölt a megszakításhoz szükséges mentések, visszatöltések között a szál és azt nem mutatja...
Üdv!
Továbbra is az a kérdésem, meg tudom e oldani valahogy, ha SFR tömböt szeretnék létrehozni, pl: PWM_DC[] = { OC1R, OC2R, ..., OC6R } ? Próbáltam többféle képpen, de nem sikerült az értéket átadni az SFR-nek. Megoldható ez valahogyan? A hozzászólás módosítva: Márc 16, 2016
Szerintem nem lehet így tömböt csinálni belőlük. Esetleg egy mutató tömb, aminek elemei az SFR -ekre mutatnak...
Idézet: „Próbáltam többféle képpen, de nem sikerült az értéket átadni az SFR-nek.” Mivel a FSRx eleve egy memóriára mutató regiszter, ezért csak mutatót tudsz neki átadni. Ha valahol van egy char tomb[10] tömböd, akkor dekralálsz egy függvényt: void blabla( char * mut); megvalósítás: void blabla(char* mut) { FSR0=(unsigned int) mut; // itt már használhatod a FSR0 az adott címre mutat } meghívása: blabla(&tomb); üdv.: Foxi
Fel szeretném venni a pwm frekvenciát 20-25kHz közé, de hiába a PTMRPS=1 (prescale) így is 20kHz-nél 250 25kHz-nél 200-ig kell elszámolni, így 50 egység marad 5000Hz-re én pedig legalább 10Hz-es léptékkel szeretném állítani a kimeneti frekvenciát egy potival.
Erre van megoldás? Csak az up/down count mód lenne jó nekem, de akár hogy gondolkodok még a 8 bites adc-t sem tudom kihasználni nemhogy a 10-est. Ennyit tudna a 18F4431? A hozzászólás módosítva: Márc 16, 2016
Fejből valami ilyesmivel próbálkoznék:
Használata meg így:
Szia!
Nemegészen értem.. Powerpwm modul 14bit áll rendelkezésre, nem pedig 8. A hozzászólás módosítva: Márc 16, 2016
utána néztem, és igen de a ppwm modul motorvezérlésre lett kitalálva oda meg jó ez.
Nem teljesen arra akarom használni, de mindegy. Most már ez van.
Ha mehetne 80MHz-ről akkor egész jó lenne. |
Bejelentkezés
Hirdetés |