Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Nalam ugy szokott lenni, hogy TMR0 IT szamol 200-500 mS ideig, es bebillent egy jelzobitet. Amikor van jelzobit kiolvasom az AD-t, majd valtom a csatornat, es torlom a jelzobitet. Ezt csinalom a kivant csatornaszamig, majd kezdem elolrol. Gondolom nem olyan folyamatot mersz amit 10 mS idonkent kell leolvasni. A meresi eredmenyt en egy tombben tarolom, aminek az indexe ugyanaz, mint a csatorna index. Ja meg annyit hogy az AD bemenetet en egy 1k, 100nF RC taggal szoktam szurni. Az R soros a feszforrassal, a C a lab es a GND koze. Ez annyiban is segit, hogy az AD mintavetelkor kis forrasellenallast fog latni.
Adtál egy jó ötletet az előbb, eddig úgy csináltam, hogy közvetlenül a port kiolvasása előtt állítottam át a csatornát, és ez volt a baj, most leolvasom az egyik analóg bemenetet, majd ezután csatornát váltok, és így várok pár ms-ig, így már minden gond nélkül kiolvassa az adatot. Kösz a segítséget!
Ja jobban megneztem most a forrast. Haaat.. Az elso: Te beallitittad az AD-t 8 bitesre, erre van 2 16 bites valtozod, ahova beolvasod. Vagy az AD 10 (16) bites, vagy a valtozo 8 bites. Masodik: Az AD beallitashoz az includeban megtalalhatok a szabvany def-ek, amire hallgat a fordito.
Harmadik : a [/code] lcd_putnum (Anal1); lcd_gotoxy (1,2); lcd_putnum (Anal2); delay_ms (20); lcd_putc ("\f");
lcd_putnum (Anal1); lcd_gotoxy (1,2); lcd_putnum (Anal2); delay_ms (20); [code=c] Igy eloszor torlod a kepernyot, kiirod az eredmenyt, es a kovetkezo ciklusig igy marad a kep.
Mar nem sikerult javitani, de remelem latszik a lenyeg. Szolj ha nem ertem, majd ujra leirom a veget.
Köszönöm mindenkinek, most már rendesen működik!
Helló!
A megbízhatóság érdekében változtattam a mérés mikéntjén. Mivel PWM-el generált áram méréséről van szó, egy R-C szűrővel megoldottam, hogy a mérést bármikor végre lehessen hajtani amikor épp van rá idő. Így jelenleg csak egyetlen egy megszakítás van a programban ez pedig az SSP -hez tartozik. A mérést a főhurokban végzem el. A baj az, hogy a fagyás még így is megmarad. A mért adat nem fér bele egy bájtba ezért először szerettem volna egy huzamban egymás után kettőben elküldeni. Igen ám, de a második bájt kiolvasásakor az SSP modul egyszerűen csak lefogja a busz mindkét adatvonalát és többé el sem engedi. A kiolvasás így nem lehetséges. Így ezután úgy döntöttem, hogy a két bájtot külön-külön megcímezve olvasom ki őket. (természetesen csak akkor mérek újra, ha már mindkettő elment) Ez így működik, de így is befagy a busz rövid időn belül. Erre azt a nem túl elegáns megoldást találtam ki, hogy a főhurokban időnként ellenőrzöm, hogy nem alacsony-e esetleg mindkét adatvonal. Ilyenkor nyomok egy SSPEN=0 majd SSPEN=1 -et. Így a busz "életben" marad. Ez nem jó, mert néha bezavar az adatok fogadásába is, de legalább nem fagy ki emiatt minden. Valami oka biztos van annak, hogy váratlanul megfagy a busz, de eddig nem jöttem rá. Valami megoldás nagyon jó lenne, mert jelenleg a rádiós kapcsolat is stabilabb mint az vezetékezett I2C. A teljes slave program:
a master ide vonatkozó részei:
Idézet: „Valami oka biztos van annak, hogy váratlanul megfagy a busz, de eddig nem jöttem rá. Valami megoldás nagyon jó lenne,” Beindítod debuggerrel, megvárod, míg befagy, megállítod (pause), és kiolvasod a regisztereket a debuggerrel. Ugyanezt eljátszod a másik oldallal is (feltételezve, hogy nincs két illesztőd, ezért nem tudod egyszerre debuggolni mindkét végét), reménykedve, hogy mindig kb. ugyanazért fagy be. Ezen a ponton még lehet azzal is kísérletezni, hogy amelyik oldalnál CKP = 0-ban vár, ott nyomsz kézzel egy CKP = 1-et, majd megpróbálod kitalálni, hogy ez honnan hiányzik a kódodból...
Szia!
A slave 41. és 53. sora ellentmondásban van. Egy ötlet: Mit csinálhat a slave 45. sorában az incoming = i2c_read(); sor? Ha abból indulok ki, ami a masterben van, az i2c_write(device_adress); , akkor megvárja, míg elkészül a vétel és kiolvassa a SSPBUF regisztert. Cseréld ki incoming = SSPBUF; sorra.
Sziasztok, eltudnátok küldeni a teljes progit az emailcímemre?? (profilomban benne van) , vagy ha feltöltitek valahova az is jó!
Köszi!
sziasztok
segitsetek lécci hogy mértnem tudom a ra0-án ,mérni a potit, és azt kiirni lcdre? Köszönöm #include <16F690.h> #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOCPD //No EE protection #FUSES NOPROTECT //Code not protected from reading #FUSES NOMCLR //Master Clear pin used for I/O #FUSES PUT //No Power Up Timer #FUSES NOBROWNOUT //No brownout reset #use delay(clock=4000000) #ZERO_RAM #include //====================================== //Változók dekralálása //====================================== float volt=0 ; void main() { setup_adc_ports( RA0 ); set_tris_a(0b00000001); setup_adc(ADC_CLOCK_INTERNAL ); // setup_adc_ports(AN0); // setup_vref(FALSE); //lcdinit delay_ms(2000); output_high(PIN_A0); output_low (LCD_RW);//LCD_RW lehúzás testre delay_us(2); lcd_init(); delay_us(20); printf(lcd_putc, "\fABCDEFGHIJKLMNOPQRST"); printf(lcd_putc, "\nabcdefghijklmnopqrst"); printf(lcd_putc, "\n12345678901234567890"); printf(lcd_putc, "\n!@#$^&*(){}[]:;<>?/="); delay_ms(3000); printf(lcd_putc, "\f"); //============================================================== //főpprogram innen indul //============================================================== while(1) { set_adc_channel(0); delay_us(100); volt=(read_adc()); setup_adc( ADC_OFF ); printf(lcd_putc,"A/D volt = %2x\n\r", volt); delay_ms(2000); } }//end main
A volt ne float, hanem int8 legyen.
Valamint, az AD-t nem muszáj kikapcsolni.
Hát, ez tényleg nem fogja megmérni a potidon levő feszejt. A fordító nem anyázódott? Mert van néhány szintaktikai hiba, ami miatt le sem kellene fordulnia.
pl. #include itt mit akartál includézni? vagy a volt=(read_adc()) itt kicsit sok a zárójel. Meg néhány szemantikai probléma is van. Az RA0 lábat mintha LCD vezérlésre használnád, mert az LCD ini előtt magasra állítod a kimenetet output_high(PIN_A0). El kellene dönteni, hogy analog, vagy digitális láb lesz, azon belül bemenet, vagy kimenet. Nem mindegy! A comparátort le kellene kapcsolni az RA0 lábról, az ADC-t még el sem indítottad és máris lekapcsoltad (örökre). Hirtelen ennyit látni a programodból. CCS Reference Manual 2011, july. Hogy segítsek is egy kicsit: CCS 4.128 vagy ujabb feltételezve. ezzel a néhány sorral inicializáld az ADC-t.
A mainban már csak volt=read_adc(); kell. Sok szerencsét.
Az int sem jó a voltnak, mert 10bit nem fér bele a 8bitbe.
Inkább long legyen az. Utána ha nagyon lebegőpontosan akarja használni lehet castolni.
Bocsánat, most látom, hogy csak 8 bitesnek használja az ADC-t.
hi
köszi, de igyse műkzik.. random számokat dobál csak fel a potiállástól függetlenül... Lcd-n longot nem birok kiíratni. Az include után lemaradt az lcd behivása bocsi, az alap progiba benne van. most igy néz ki a javításokkal a progi:
Ezt ne használd így:
setup_comparator(NC_NC_NC_NC); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); set_adc_channel(0); Hanem: setup_comparator(NC_NC_NC_NC); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); A főprogramban pedig: set_adc_channel(0); delay_us(100); volt=read_adc(); printf (lcd_putc,"-%u",volt); delay_ms(2000); És jó lenne tudni, hogy az LCD melyik lábakra van bekötve.
Köszönöm szépen a segitséget mindenkinek, mellédugtam a próbanyákon az ellenálást:S és a picit2-tőt mérte..
köszönöm mégegyszer
Miért ne használja úgy, ahogy ajánlottam és miért jobb a te megoldásod. Komolyan érdekelne, mert magyarázatot nem fűztél hozzá.
CCS -el szívtam emiatt. Bugos volt a progi. Viszont ha így konfigoltam fel akkor tökéletes volt. Mellesleg ha több A/D bemenetet használsz látod hol nyitod meg.
Ebben az esetben viszont mindegy.
Ezen ne vesszetek má össze.. a második verzzi letisztultabb amugy.. Köszönöm mindkettőtőknek!
Hogy tudom ugyanazzel a progival a pontos feszültséget kiiratni? ha 5 volt a referencia(tápfesz) 2 tizedesjegyre kéne lécci
köszönöm
A 8 bites AD felbontasnal, 5 volt Vref-nel az egy lepes az 19,6 mV, 10 bites felbontas eseten 4,88 mV. Tehat ez a maximalis felbontas amit a PIC belso AD-vel el tudsz erni. Persze jobb lenne egesz ertekkel szamolni, pl a Vref 5,12 V, mert igy egy AD osztas (10 bites) 5 mV. A PIC elviseli a 5,12 Volt tapot, tehat ez is mehetne. A program valahogy igy nezne ki (csak a lenyeg):
Dehogy veszekszünk!
![]() Csak érdekelt volna, hogy az ő megoldása mennyivel jobb, gyorsabb, kényelmesebb az általam ajánlottnál. Nem szégyen tanulni, ha tényleg valami megmagyarázza, hogy így kell csinálni.
Szia!
Idézet: „Tehat ez a maximalis felbontas amit a PIC belso AD-vel el tudsz erni.” Ha a mérendő jelhez 1 lsb amplitúdójú, 0 várható értékű zajt keverünk, a AD mérési értékeit átlagoljuk, a felbontáson javíthatunk. Ez ugyan Atmel leírás, de alkalmazható más kontrollerekre is.
Van egy másik metódus a felbontás növelésére, az oversampling. Erről viszont nem találtam megfelelő leírást, vagy csak nem tudtam a kulcsszót rendesen megadni a googlenak. Erről tudsz valami infót?
Idézet: Ez ugyanaz, mint amit Hp41C kolléga említett, és belinkelt. „Van egy másik metódus a felbontás növelésére, az oversampling.”
Na, akkor mégegyszer elolvasom, kissé jobban odafigyelve az a doksit. Köszi mindenkinek.
Biztos jo lehet, de a kolleganak egyenlore a sima egyszeru AD->Volt konverzio jelenti a fo problemat nem az oversampling.
Ráadásul még a 10 bites felbontást is levette 8 bitesre.
![]()
Sziasztok!
Megint írok nektek, mert szeretném megkérdezni, hogy a CCS C fordítóhoz kellene lennie egy EX_FAT.c nevű példaprogramnak, ez benne van a nem teljes verzióban is? Valamilyen okból nekem nincs benne az examples mappában... A válaszokat köszönöm! |
Bejelentkezés
Hirdetés |