Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   107 / 118
(#) potyo válasza Lamprologus hozzászólására (») Márc 6, 2015 /
 
Steinhart-Hart egyenlet, wikipedian megtalálod, nem tudok telefonról linkelni. De az NTC eleve nem túl pontos, kalibrálnod kell majd szerintem
(#) sysy válasza Lamprologus hozzászólására (») Márc 6, 2015 /
 
Szerintem luxus a tizedfokos hőmérséklet mérés NTC-vel. Bár magának megcsinálja az ember fia. A digitális hőmérők egymás mellett is más-más hőmérsékletet mérnek. Az NTC-nek meg legalább egy klasszissal nagyobb a szórása. Ráadásul, ha egyszer jól megmelegíted a thermistort, akkor az már nem fog visszaálni az eredeti ellenállás értékére. Nem is beszélve a görbe karakterisztikáról és az öregedésről.
Ámbár, meg kell hagyni, amatőr viszonylatokban jól néz ki a tizedes fok kijelzés.
A potyo listatársunk által idézett Steinhart-Hart összefüggéssel jól lehet kezelni az NTC görbe karakterisztikáját. Ajánlatos lenne felvenni az egész méréshatárra vonatkozó BETA értékét, mert a katalógus csak egy kis tartományban adja meg. pl. 25-50C között. Ezért negatív hőmérsékleteknél nagy hibával fog mérni a szerkezet. Igy a két végén lesz pontos a mérés, a közepén meg több foknyi eltérés.
Vagy ahogy te is gondoltad, kell csinálni egy nagy táblázatot és azokat az értékeket olvasgatni. Lehet, hogy elég lenne 2 fokonként tárolni a táblázatban. A kettő között meg "kitalálni" a hiányzó hőfokot.

Egyébként: Steinhart-Hart

A Tx hőmérséklet Celsiusban:

Tx=1/(1/BETA)*Ln(Rt/R25)+1/T25)

ahol:
Rt=thermistor pillanatnyi értéke (ohm)
R25=thermistor értéke 25C nál (ohm)
BETA= katalógusból kiolvasva (vagy kézzel felvéve/kiszámolva)
T25=25C Kelvinben (298.15K)

behelyettesítve egy példában:
10k tehermistor, Beta=4400

Tx =1/( 2.272*1e-4*Ln(0.0001*Rt) + 3.354*1e-3))- 273.15

Ide már csak be kell helyettesíteni az Rt thermistor pillanatnyi értékét és megkapod a hőfokot Celsiusban.

Melegen (höhö... érted, ugye) ajánlom:

Dogan Ibrahim
Micrkontroller-based Temperature Monitoring and Control című könyvet.
ISBN: 0750655569

Erről a témáról szinte mindent elmond, szájbarágós és PIC példaprogramok vannak benne.
Én is a 125. oldal környékétől vagyok ennyire okos.
Nekem több példányban is jól mért ezzel az összefüggéssel a thermistoros megoldás.
Persze, a tizedfokos mérés csak ábránd maradt.
(#) Lamprologus válasza sysy hozzászólására (») Márc 6, 2015 /
 
Na, végülis azt a megoldást választottam, hogy táblázatba beirogattam az értékeket, egyelőre 5 fokos felbontásban, a köztes értékeket meg kiszámoltatom a PIC-cel a köztes szakasz meredeksége és eltolása alapján. Majd megnézem a gyakorlatban mennyire pontos.

Úgy gondolom, hogy az 10k-s NTC-t sorba kötöm egy 10k-s ellenállásal, NTC lesz a föld felé, másik ellenállás megy a +5V-ra, a közös pont meg megy az analóg bemenetre. Remélem a bemenet nem viszi el észrevehetően az így kialakított feszültségosztót.

Igazából a tized fokokra nem a mérés pontossága miatt van szükség, hanem a szabályozás finomhangolásához.
(#) Lamprologus válasza sysy hozzászólására (») Márc 6, 2015 /
 
Ha valaki tud okosságot a könyvhöz megköszönném... nekem nem sikerült találnom!
(#) sysy válasza Lamprologus hozzászólására (») Márc 6, 2015 /
 
Valami ilyesmit akartam javasolni én is. A PIC analóg bemenete nem nagyon terheli a 10k feszültségosztót. Pontosabban, nem változik dinamikusan a terhelése. Így nem eget verően fontos elválasztó erősítőt alkalmazni.
(#) sysy válasza Lamprologus hozzászólására (») Márc 6, 2015 / 1
 
Küldtem.
(#) vicsys válasza Lamprologus hozzászólására (») Márc 7, 2015 /
 
Miért pont NTC? Ha analóg jelet akarsz mérni, arra is vannak olcsó szenzorok, amivel akár a tizedes pontosság is elérhető. Ezeknek 1 nagy előnye van, tényleg lineáris a karakterisztikájuk.
A hozzászólás módosítva: Márc 7, 2015
(#) Lamprologus válasza vicsys hozzászólására (») Márc 8, 2015 /
 
Meglévő rendszerben ilyen szenzorok vannak...
(#) kurucz_peter hozzászólása Márc 9, 2015 /
 
Helló!

beszereztem egy PIC16F1788-as kontrollert, de sajna a PICkit2 nem ismeri.
Az lenne a kérdés, hogy ilyenkor mit lehet így utólag tenni. Nem szeretném a PICkit3-at is megvenni, inkább valami 5letes megoldás lenne jó....

köszi!

Üdv:
P
(#) Hp41C válasza kurucz_peter hozzászólására (») Márc 9, 2015 /
 
Átnézni a másik topikba.
(#) kurucz_peter válasza Hp41C hozzászólására (») Márc 9, 2015 /
 
....upps, köszi! Máris.
(#) Lamprologus hozzászólása Márc 11, 2015 /
 
Írtam egy szép hosszú programot ...
Fordításkor kiírta hogy a ROM=80% ...
Beszúrtam még négy sort és ezt az üzenetet kaptam:


*** Error 71 "main.c" Line 994(0,1): Out of ROM, A segment or the program is too large KijelzoValtas
Seg 01000-017FF, 079B left, need 081E
Seg 01800-01FFF, 0800 left, need 081E
Seg 00000-00003, 0000 left, need 081E
Seg 00004-00030, 0000 left, need 081E
Seg 00031-007FF, 0012 left, need 081E
Seg 00800-00FFF, 0046 left, need 081E


A programban már szerepelt hasonló kódrészlet mint amit a végén beírtam és ott max 1-2%-al növelte az elfoglalt ROM -ot.
Ez mitól lehet?
(#) Hp41C válasza Lamprologus hozzászólására (») Márc 11, 2015 / 1
 
Van legalább egy függvény, aminek 2078 utasíáshely kellene, de a 16F -eken egy program memória lap 2048 utasítás méretű. Ezeket a függvényeket fel kell "vágni" több kisebbre.
(#) Lamprologus válasza Hp41C hozzászólására (») Márc 11, 2015 /
 
Hm ... Nekem ránézésre úgy tűnik, hogy rövidke függvényeket írtam ... igaz abból jó sokat...
Ha egy függvényből újabb függvényt hívok, majd abból újabb függvény stb. az jó lesz, vagy az egymásba ágyazott függvényeket is "összeadódnak"?
(#) Lamprologus hozzászólása Márc 13, 2015 /
 
Hogyan tudom CCS-C-ben lekérdezni egy kimenet állapotát?

if (blabla) output_high(PIN_A1); //ezzel beállítom hogy 1 legyen

ha jól tudom akkor az input_state(pin) az átállítja bemenetnek, és azt figyeli hogy kivülről mit küldök rá ... de nekem az kéne, hogy mit küldtem ki... Van erre C parancs?



Továbbá köszönöm az eddigi segítségeket, egész jól alakul a hőmérőm...
Mindenféle kaplibráció nélkül a szobai hőmérőhöz képest 1 fok az eltérés, a vizforralóban felforralt vizet 97 fokosnak méri (miután kikapcsolt és besétáltam vele a szobába), a jeges vízes próba még hátra van...
A hozzászólás módosítva: Márc 13, 2015
(#) Lamprologus válasza Lamprologus hozzászólására (») Márc 13, 2015 /
 
Megvolt a jeges vizes próba is ... 0,4fok eltérés!

Úgy látszik jól számolgattam!
(#) Tas84 válasza Lamprologus hozzászólására (») Márc 13, 2015 /
 
input_state: This function reads the level of a pin without changing the direction of the pin as INPUT() does.
(#) Lamprologus válasza Tas84 hozzászólására (») Márc 14, 2015 /
 
igen ... ezt én is megtaláltam a súgóban...
... de zero angol tudással a google translate sem győzőtt meg róla, hogy ez az ami nekem kell...
(#) vicsys válasza Lamprologus hozzászólására (») Márc 14, 2015 /
 
Szerintem nyugodtan próbáld ki és/vagy szimuláld le.
(#) Lamprologus hozzászólása Ápr 1, 2015 /
 
LCD kijelzőn szeretnék megjeleníteni egy egész típusú változót bináris alakban. van erre valami egyszerű módszer vagy nekem kell meghatározni az egyes bitek értékét és bitenként kitenni az LCD-re?
(#) sysy válasza Lamprologus hozzászólására (») Ápr 1, 2015 /
 
Erre programot kell írnod.
(#) kistee hozzászólása Ápr 2, 2015 /
 
Sziasztok,

Egy órát építek, DS1302 RTC-vel és PIC16F876A-val. CCS-C compilerrel. 6 digites hétszegmenses LED kijelző lesz a megjelenítő és azt szeretném, ha egy nyomógomb megnyomásakor az időkijelzés átváltana a dátumra. Eddig megy is minden, csak azt nem tudom megoldani, hogy a nyomógomb elengedése után pár másodpercig még a dátumot mutassa, és csak utána váltson vissza az idő kijelzésre. A vonatkozó programrészlet a következő:

  1. void main()
  2. {
  3. rtc_init();
  4. While (TRUE)
  5. {
  6. if(!input(KEY1))
  7. {
  8. display7seg_date();      //Dátum kijelzése
  9. delay_ms(3000); //Ez akar lenni a késleltetés...
  10. }
  11. else
  12. display7seg_time();    //Idö kijelzése
  13. }
  14. }


Ezzel azt értem el, hogy a gomb megnyomásakor elment minden érték a kijelzőről... for ciklussal is próbáltam, de az sem az igazi (villog a kijelzés) Van valakinek ötlete, hogyan csináljam?

Előre is kösz.
(#) kistee válasza kistee hozzászólására (») Ápr 2, 2015 /
 
Közben megvilágosodtam és a for ciklus finomításával elértem, amit szerettem volna. Hátha valaki hasznát veszi:

  1. if(!input(KEY1))
  2.             {
  3.             for (i=1;i<=800;++i)    //"i" értéke adja a késleltetést, int16 tipusú legyen
  4.             {
  5.               display7seg_date();      //Dátum kijelzése
  6.               delay_ms(1);
  7.             }
  8.             }
  9.             else
  10.               display7seg_time();    //Idö kijelzése
(#) Lamprologus hozzászólása Ápr 4, 2015 /
 
Az 5-ös compilernél olvastam valami olyasmiről, hogy a printf függvény után gondok vannak a megszakítássokkal... van erre valami okosság?
(Lécci ne valami angol szöveget adjatok mert abból nem sokat értek!)
(#) subi válasza kistee hozzászólására (») Ápr 7, 2015 /
 
Még jó megoldás a lenyomott gomb figyelése, hogy csak felengedés után induljon a késleltető ciklus. Pl. While(KEY1); Ezzel a kis programrésszel addig itt áll a program futása, amíg el ne engeded a gombot.
(#) sysy válasza Lamprologus hozzászólására (») Ápr 7, 2015 /
 
Milyen gondok vannak a megszakítással?
(#) Tas84 válasza Lamprologus hozzászólására (») Ápr 7, 2015 /
 
CCS IDE verzió: 5.011, PIC16F690

  1. #include <16F690.h>
  2. #device ADC=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #use delay(crystal=4000000)
  7. #use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B5,bits=8,stream=PORT1)
  8.  
  9. #bit GIE_BIT = 0xB.7
  10.  
  11. static long tmr0_ctr;
  12.  
  13. #int_timer0
  14. void timer0_isr() {
  15.    tmr0_ctr++;
  16.    output_toggle(PIN_C0);
  17. }
  18.  
  19. void main()
  20. {
  21.    output_drive(PIN_C0);   // C0 kimenet
  22.    
  23.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);      //65,5 ms overflow
  24.    
  25.    enable_interrupts(INT_TIMER0);
  26.    enable_interrupts(GLOBAL);
  27.  
  28.    while(TRUE)
  29.    {
  30.       // 6550ms
  31.       if(tmr0_ctr >= 100) {
  32.          tmr0_ctr = 0;
  33.          printf("1. print! GIE = %u\n\r", GIE_BIT);
  34.          printf("2. print! GIE = %u\n\r", GIE_BIT);
  35.          enable_interrupts(GLOBAL);
  36.       }
  37.    }
  38.  
  39. }
  40.  
  41. Kimenet:
  42. 1. print! GIE = 1
  43. 2. print! GIE = 0


Nálam ez a szitu, a printelés ideje alatt le van tiltva a GIE, majd úgy is marad!
(#) Lamprologus válasza sysy hozzászólására (») Ápr 7, 2015 /
 
Tán pont ebben a fórumban olvastam, hogy a printf függvény letiltotta a megszakításokat az 5-ös verzióban ...
Multkor véletlenül az 5 össel fordítottam le egy programot és nem működött a PIC ... aztán a 4-essel fordítva tökéletesen ment... azt sajnos nem tudom hogy hol fagyott le a program mert debuggerem nincs... de van egy LED amit a Timer1 megszakításából kapcsolgatok és az sem ment ... szóval eszembe jutott hogy lehet valami ilyesmi gond lehet ...
(#) kurucz_peter hozzászólása Ápr 10, 2015 /
 
Hahó!

PIC16F1788-al akarok AD konverziót csinálni.
Sajna a CCS függvényei nem jók ennél az típusnál így a regisztereket direkbe állítgatom.
Az a tapasztalatom, hogy ha a pozitív referencia a tápfesz (+5V) akkor szépen megy a ADC de ha a FVR-et (4.096V) akarom referenciának használni akkor nagyon zajos az ADC (3-4%).
A regiszterbeállítások a következők:
FVRCON = 0b11000011;
ADCON0 = 0b00000101;
ADCON1 = 0b11010011;
ADCON2 = 0b00001111;
van esetleg valami 5let, tapasztalat a fixed voltage reference használatával kapcsolatban?

Köszi!
P
(#) don_peter válasza kistee hozzászólására (») Ápr 10, 2015 /
 
Szerintem inkább használj pergésmentesítőt.
A for() ciklusod folyamatosan újra frissíti a kijelzőt kb 1ms-os időközönként.
subi már javasolta is a jó megoldást:
  1. While(KEY1);

A te megoldásod hibás, mert ameddig KEY1 alacsony szinten van addig a feltétel folyamatosan teljesül.
Persze itt feltételezzük, hogy több mint 800ms ideig tartod nyomva a nyomógombot.
Következő: »»   107 / 118
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem