Fórum témák
» Több friss téma |
Sziasztok!
Van egy problémám. Van egy projektem, aminél digitális értéket kell feszültségértékre alakítani. Én MCP4921-es DAC-vel valósítottam meg az analog átalakítást, hogy a programnak csak spi vonalon keljen folyamatosan írnia. Ez eddig nem is gond, program meg van írva, és működik is. Amire viszont rádöbbentem hogy nem lineáris. Már kínomban azt hittem a programmal van gond, ezért a gyári mikroelektronikás példával megnéztem, amit le is filmeztem hogy lássátok mi a problémám. Röviden ugye 12 bites a dac. 4095-ös digitális értéknél 5V, mivel a referencia is 5V. 0-nál pedig 0. Ez eddig istenes is. Arra viszont nem gondoltam hogy 2048-as digitális értéknél nem 2,5V lesz a DAC kimeneten. ![]() készített videó
Szia Hp41C!
Megjött az analizátor csatolom a forrást és az analizátor által készített fájlt. Neked biztos mond mint nekem. Azt vettem észre, hogy ha csak egyszer fut le, akkor semmit nem mutat az analizátor, ezért 10× futtatom le.
Ilyet nem használtam még, de az adatlapja szerint max. +/-12LSB azaz +/-15 mV lehet az integrális nonlinearitás. Ennél jobban nem térhetne el az ideális egyenestől. Apropo lineáris: ugye 0-ba fut a görbe, és nincs egy 0.4 V körüli eltolás?
Az MCP4921 környékének kapcsolási rajzát jó lenne látni! (Vref táplálása, kimeneti terhelés, stb.)
Az adatlapban mindenhol csak 2V körüli Vref példák vannak, és a Vref csak unbuffered módban lehet Vdd.
Azért próbáltam ki mikroelektronikás demóval hogy biztos legyek benne nem a program viccel meg. Demo csak nem hibádzik...
![]() A hozzászólás módosítva: Okt 20, 2015
Igen valószínűleg referencia gond van itt. MCP4821-el ezért volt jó Simpi-nek, mert az belső referenciás.
Próbáltad a BUF bitet állítani, hogy mit csinál?
Kimeneti terhelés 10K. Vref 5V tápról közvetlenül. LDAC test, SCK, SDI közvetlenül mikrovezérlőre, többi adott.
És igen van 0,4V-os eltolás. (0,481) A hozzászólás módosítva: Okt 20, 2015
Sziasztok!
Egy float számot kellene átalakítanom karaktertömbbé, hogy LCD-n megjeleníthessem két tizedes jegyig. De az XC8-ban lévő ftoa függvény nem igazán akar működni, pontosabban le sem fordul. Így kellene használni, de még arra se jöttem rá, hogy mi az a status és miért nincs neki értéke: #include <stdlib.h> #include <stdio.h> void main (void) { char * buf; float input = 12.34; int status; buf = ftoa(input, &status); printf("The buffer holds %s\n", buf); } A következő feladat meg karaktertömb visszaalakítása float-tá lenne. Számolgatni kellene velük, tehát nem lenne jó egész számokban tárolni őket, memória meg van bőven. ![]() Gyorsan kellene a megoldás. ![]() A hozzászólás módosítva: Okt 21, 2015
Megoldódott, más volt a hiba, viszont a status változót továbbra se tudom, hogy mire jó. Továbbá nem tudom hogy lehetne korlátozni két tizedes jegyre a kiírt számot. (az utána lévők már úgyis pontatlanok)
Ismét itt...
Ezekben a percekben rájöttem mi volt a hiba. Nem program hiba volt, hanem az hogy a 7 lábon nem volt GND kapcsolat. 5-ös lábról volt átvive wire to wire vezetékkel Bread Boardon megépítve és az 5-ös 7-es közötti vezeték szakadt volt. Kívülről jó volt, innentől kezdve egyesével meg kell mérnem ezeket a már régóta használt vezetékeket. Sosem jártam még így, elnézést érte. A DAC ic most már remekül megy! Üdv! Geri12
printf utasításnál a paramétereknél meg lehet adni, hogy a váltózót hogy jelenítse meg...
pl: printf("Voltage %6.3fV\r\n", voltage); // Result: Voltage 1.125V a súgóban biztos megtalálod, a %-jel utáni résznél tudod megadni ...
És a printf-fel hogy írjak az LCD-re? Nem volt még szükségem rá PIC programozásnál, nem nagyon értem hova ír. Én mindig a saját LCD-re író függvényemmel írom ki amit kell.
![]() Pl. WriteLCD(line, "text"); A text helyére kellene betennem a printf sorodat? Vagy hogy?
Szia!
továbbra is használhatod a saját WriteLCD() függvényedet, csak a dekralációban ( char , char* ) legyen. Ekkor már csak egy mutatót kell átadni ahol az adott szöveg van. Pl.: WriteLCD(1,buf); Természetesen ez ott lévő szöveget is nullával kell lezárni.
Az sprintf függvény ugyanúgy működik mint a printf, csak string-be (akarom mondani karaktertömbbe) teszi a kiírandó szöveget.
Ez is lehet megoldás:
Uraim, kérnék egy kis segítséget.
PIC18F46K22-es MCU beállításaival kapcsolatban. Még mindig a DS18B20-al szívok és mivel nem akar működni meg kell minden eddigi beállításomat kérdőjeleznem. Az 1ms és az 1us-al is lehet, gond mivel a DS nagyon kényes az időzítésre. A lényeg: 16MHz-es kristályt használok, 4xPLL bekapcsolva ami elvileg 64MHz-et eredményez. Regiszterek:
Konfigurációs beállítások:
És végül a késleltetés:
Valami tuti nem kerek, de nem értem, hogy eddig ezzel nem volt gondom, de ez a DS hőérzékelő teljesen keresztbe vág. Előre is köszi az észrevételeket.
Nem igazán akar működni.
float f1 = 123.4567; char *buf1; buf1 = printf("Voltage: %.2fV", f1); WriteLCD(2, buf1); Ez nem ír ki semmit csak egy véletlen karaktert; Bell, a tiedet meg nem igazán értem. Hol adom, hogy melyik sorba, oszlopba írja ki a karaktertömböt? Az Open_str(LCDstr)-t csak egyszer kell meghívni, utána már a printf szolgál WriteLCD függvényként?
A printf helyett nem sprintf-ről volt szó?
Meg printf-ről is. A printf nem az eredmény karaktertömb címével kellene, hogy visszatérjen amit az LCD függvény is vár bemeneteként?
Mindjárt kipróbálom sprintf-fel, mert eddig rosszul használtam és nem tudtam miért nem fordul le. ![]()
A printf az stdout-ba ír ki formázott stringet amit xc8-ban a void putch(char c)végkimenetli függvénynek hívnak a C18-ban nem emlékszem, hogy hogy kel/hogy hívják. És a putch-ból kell a karaktert kiírni az lcd-re.
Itt egyszerűen arról van szó, hogy putc_fn arra a függvényre fog mutatni, ahol ahol a saját függvényed kezdődik. Akár így is lehetne:
Ahol LCDstr a saját LCD-re író függvényed. Az eredeti putch-t, aminek a printf adogatja a karaktereket, átdefiniáltuk.
Sprintf-fel már működik, köszi nektek a segítséget.
![]() De egy kicsit még értetlenkednék. ![]() Tehát ha a putch függvényt bebűvészkedem a saját LCD-re író függvényemben, akkor a printf-fel tudnék egyből az LCD-re írni? Max az előtte lévő sorban adok még egy utasítást az LCD-nek, hogy melyik sorba, oszlopba írjon. De ha nincs visszatérési értéke és egy karaktert vár bemenetként, akkor hogy működik? void putch(char c) { } Ennyi a .c állománya, nem vágom, vagy a c az most a printf által generált kimeneti tömb első karaktere? Az LCD függvényem ilyen, ebbe hogy lehet betenni?: void WriteLCDbyte(char rs_pin, char data) { // Itt beállítom az RS pin-t és szétosztom az adatot a megfelelő kimenetekre. // Enable, delay stb. }; Ide hogy kell a putch-t betenni? Bell: Így már érthetőbb, de az eredetire még nem jöttem rá. ![]() A hozzászólás módosítva: Okt 22, 2015
Nem hosszú, próbáld ki és írd meg, mire nem jöttél rá
![]() Én értékadással használom, de azt gondoltam logikusabb open-nel.
Sziasztok!
PIC32-vel hogyan kell Rx interruptot kezelni? Egyenlőre csak azt akarom hogy amit küldök neki küldje vissza, de nem hívódik meg az interrupt.
Uraim, hogy tudok egy stabil késleltetést készíteni C18-ban?
18F46K22 PIC + 16MHz kristály + 4xPLL bekapcsolva, 64MHz az órajelem. Csak a fontosabb beállításokat linkelem:
Ugyan beállítottam a Fosc-ot is ahogyan Hp41C említette, de észlelhető eredményt nem hozott.
Az inicializálásnál a PIC összes lába digitális és az interrupt kikapcsolva, és persze minden egyéb, PWM, ADC. Fontosabb regiszterek az óra jel miatt:
Sajnos a mérések alapján (Proteusban mivel nincs oszcillátorom) az időzítések nem pontosak. Ha beállítok mondjuk egy 1us-t egy rutinnal pl:
Akkor az viszonylag kis ciklusokra jó, de ha mondjuk emelem akkor nagy akár dupla eltéréseket is mutathat. Képeket töltök fel, hogy érthető legyen. Az első kép ahol 1us látható a mérésekkel a fentebb látható "unsigned int i = us*1;" kóddal érem el. Ezt a kódot most hagyom is de változtatom a us változót. (ki is emeltem, hogy melyik az) Delay_Us(1);-ről Delay_Us(100);-ra. A 2. képen látható, hogy 100us helyett 22.5us a késleltetés. Ez egyébként egy port egy bit magas majd alacsony szintre való állítása. Hogy tudom ezt megoldani, hogy egységes időzítést kapjak, mert a DS18B20 eléggé kényes az ilyenre. Előre is köszönöm.
Már leírtam, hogy mi a problémája, olvasd már el és gondolkodj rajta egy kicsit
![]()
Félre értesz, az már megvan.
És megy is a DS, mutatja az értékeket, de maga az időzítés elcsúszik akár mit csinálok. 10000, 1000 is meg van.. ![]() A hozzászólás módosítva: Okt 22, 2015
|
Bejelentkezés
Hirdetés |