Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
köszike a segitséget lessz mit tanulgatnom belölle tényleg köszike
Szia,
Letiltottam a PORT B-n analóg bemeneteket,legalább is úgy gondolom,hogy ezzell a FUSE-al lehet: #FUSES NOPBADEN És a főprogramban is beallítottam a következőt: set_tris_b (0x00); /mind kimenet port_b_pullups(TRUE); Sajnos továbbra sem működik. Nemtudom hogyan lehetne működésre bírni ezt a 18F4550-et. Idézet: „Letiltottam a PORT B-n analóg bemeneteket,legalább is úgy gondolom,hogy ezzell a FUSE-al lehet: #FUSES NOPBADEN” Elvileg igen. De próbálkozhatsz helyette azzal is, hogy 0x3F-et írsz az ADCON1-be. Idézet: „port_b_pullups(TRUE);” Ez mire volt jó? A fehúzásnak akkor van értelme/akkor működik, ha bemenetnek használod a portot.
Helyesbítek: nem kell 0x3F csak 0x0F
Elgondolkodtam a dolgon. :smoke:
A következő dolog segített és ezzel a beállítással már működik: Az include-ban: . //PORTB pins are configured as digital I/O #FUSES NOPBADEN . . //Matrix Control on PORT B #locate mxc = getenv("sfr : PORTB") . . A main-ban pedig: setup_adc_ports(AN0_TO_AN4); setup_adc(ADC_CLOCK_INTERNAL); Köszönöm a segíséget icserny!
Egy kis ellentmondást látok a beállításaidban:
1. Ha analóg bemenetet is akarsz használni, akkor ne tiltsd le az ADC a FUSE bittel! 2. Ha pedig egyáltalán nem akarsz analóg bemenetet használni, akkor pedig a setup_adc(adc_off) beállítás kellene. Korábbi beírásaid alapján egyébként úgy értettem, hogy neked egyáltalán nem kell analóg bemenet, ezért javasoltam, hogy mindet tiltsd le 0x0F-et írva az ADCON1 regiszterbe. A setup_adc_ports(AN0_TO_AN4) pedig 0x0A-t ír bele. Ez meghagyja analóg bemenetnek az A0-A4 lábakat, de a B portot ugyanúgy "felszabadítja", mint az általam javasolt 0x0F. Bővebb információt a PIC adatlapján találsz, az ADC-vel foglalkozó 21.0 fejezet 21-2 alfejezetében.
Hello
Lenne egy olyan kérdésem,hogy tömbök elemeit szeretném egymásba shiftelni (tömb[i]>>1; tömb[i+1]>>1, tehát tömb[i] elemének LSB-je tömb[i+1] elemének MSB-jébe legyen, nos a rutin meg is van írva, csak hát a ccs minden shift előtt törli a carry bitet, ami ugyebár így problémát okoz, de más is van még, mivel tömbökről van szó, így egy kicsit sok dolgot ír még elé, haszánlja a carry-t is ott, ami szintén problémát okoz. másik kérdés, hol lehet a compiler beállításait módisítani, pl optimalizálás. válaszokat előre is köszönöm üdv
Hello !
Szerettem volna összehozni egy kis programot ami GPS adatokat jelenít meg egy LCD kijelzőn. Megnéztem egy ilyen projektet , és annak alapján összeraktam a kis programomat , de sajnos már "$" után levő 5 karakter beolvasásánál problémák akadnak. Tiszat fura karakterek jönnek sajnos. Amit azért nem értek mert ha PICKIT2 vel debug modba belenézek a buffer tartalmába , az szépen és tisztán tartalmazza a GPS által küldött karaktereket. Mellékelem a programot, hátha vakakinek van ötlete hogy hol van elrontva.
Igazad van nem említettem,de a program egy másik részében használom az A0-A4 A/D portokat mérés céljából.
A problémát valószínűleg az analóg portok rossz konfigurációja és a PORTB rossz konfigurálása okozta. Az ADC problémát megoldotta a megfelelő konfig érték: setup_adc_ports(AN0_TO_AN4); AN0_TO_AN4-értékét meglehet találni az adott uC include filejában(18F4550.h) én is onnan hasonlítottam ossze az általad megadott értékkel és így jutottam el a jelenlegi beállításhoz. #FUSES NOPBADEN - letiltja az analóg portokat,de csak a PORTB-hez tartozó analóg portokon,hogy használható legyen digitális I/O-ként. Néha ezek a speciális konfig szavak több bajt okoznak,mint seítséget.Érdemeg előtte nemcsak az adatlapot és a fordító helpjét megnézni,hanem a használt processzor include-ját is átnézni.
Nem értek a CCS-hez, így inkább csak kérdezek: a printf utasításban nem kellene még egy formátumstring is? Mint pl. a CCS help alábbi mintapéldájában:
printf(LCD_PUTC, "n=%u",n); Ezenkívül nem kell-e valami várakozást beiktatni?
Nehéz erre jó választ adni, ha nem tudjuk, hogy a tömbelemek milyen típusúak!
Valószínűleg gördülékenyebb a dolog, ha visszafelé haladsz, mint a rák: // Ha 16 bites előjel nélküli egészekkel dolgozol for(i=n; i>0; i--) { a[i]= (a[i] >> 1) + (a[i-1] << 15); } a[0]=a[0]>>1; Idézet: „hol lehet a compiler beállításait módisítani, pl optimalizálás.” MPLAB-ben: Project->Build Options...->Project->CCS C Compiler fül->Categories Pre-processorban is beállítható: "#OPT n"
Szerintem nem kell formátumot megadni , mert karakteres az információ, ki is iródik az 5 karakter, csak nem mindig számok és betük , hanem fura karakterek.
Várakozás meg azért nem kell , mert mindig "$"-t vár sorosportról, úgy gondolom az elég várakozás.
Belefutottam egy másik problémába:
A TIMER0-val akarok mevalósítani egy 50%-kitöltésű PWM-jelet,minek a frekvenciájét nagyom precizen lehet állítani. De valami miatt nem íródik be TIMER0 értéke a set_timer0(TMR0_SET_VALUE); utasítás hatására. Van egy olyan gyanúm,hogy nem lehet használni ezt az utasítás a #int_TIMER0 megszakításon belül.Bár mondjuk az kicsit furcsa lenne. Ha megtörténik a TIMER0 megszakítás akkor új értéket kellene kapnia. Ha valainek van ötlete,hogyan lehene működésre bírni szivesen várom. int TMR0_INT_COUNTER = 0; int TMR0_INT_NUM = 10; int TMR0_SET_VALUE = 0; #int_TIMER0 void TIMER0_isr(void) { set_timer0(TMR0_SET_VALUE); if(TMR0_INT_COUNTER >= TMR0_INT_NUM){ output_toggle(PIN_D0); TMR0_INT_COUNTER = 0; } TMR0_INT_COUNTER++; } . . void main() { setup_adc_ports(AN0_TO_AN4|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_DISABLED|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); TMR0_INT_NUM = 100; /fixem beallítva,csak hogy látható legyen a villogás a LED-en do{ TMR0_SET_VALUE = 0; Delay_ms(1000); TMR0_SET_VALUE = 1000; Delay_ms(1000); TMR0_SET_VALUE = 10000; Delay_ms(1000); TMR0_SET_VALUE = 20000; Delay_ms(1000); }while(!0); Köszönöm.
Jól nézd meg, milyen tipusra definiáltad a TMR0_SET_VALUE változódat! Ez CCS!
Köszi a tippet.
Lehet,hogy rosszul emlékszem de a standard C-be az INT az 16 bites,de itt nem. CCS helpből : Basic and Special types: C Standard Type Default Type int int8 A helpben ezt írja még: Timer 0 (AKA RTCC) gets an 8 bit int except on the PIC18XXX where it needs a 16 bit int. Viszont arról mélyen hallgat,hogy csak a következőképpen fog működni,ha így deklarálod: volatile long TMR0_SET_VALUE = 0; A lényeg pedig: volatile Tells the compiler optimizer that this variable can be changed at any point during execution. Egyébként hiába piszkálod a változót teljesen véletlen szerűen veszi figyelembe. Nem rossz ez a CCS de néha a saját útját járja.... Idézet: „Lehet,hogy rosszul emlékszem de a standard C-be az INT az 16 bites,de itt nem.” Nem emlékszel rosszul. Erről van szó! Itt az"1000"-es értéket egy int változóban már nem annyit jelent.
Tegnap egész nap próbáltam életre kelteni a programomat ,de sajnos nem jártam sikerrel.
Valaki tudna esetleg egy olyan mintamprogramot ajánlani ami sorosprotról olvas be adatokat , és azokat LCD kijelzőn megjeleníti. Hátha sikerülne ellesnem belőle a megoldást. Köszönök előre is minden segítséget !
Sziasztok!
Épitettem egy Potyo féle icd2-t, ami tökéletesen működik az MpLab-ban amíg asm programokat debuggolok. Feltelepitettem a 68-as verziójú ccs c compilert, de ezzel sehogy sem akar sikerülni a mutavány (állitólag ez már kezeli az icd2-t). A rövid kis programom elejére beirtam hogy icd=true, le is forditja hiba nélkül a programot, de amikor átirja a target device-ba, azt irja ki az MPLAB, hogy nem tud összecsatlakozni a célkészülékkel. Tudna valaki adni tanácsot ezzel kapcsolatban? Köszi!
Két-három oldallal korábban az állapítottuk meg, hogy bizonyos esetekben a varázsló rossz FUSE bitet generált.
Nézd meg, hogy nincs-e véletlenül egy #FUSES NODEBUG a .h fájl elején?
Nézd meg az kapcsolásoknál az adóvevős topi féle cikket, abban van lcd is, meg minden. Nekem ugyan nem csinál semmit, de lehet hogy csak nem jól csinálom a fordítást meg a beégetést, mindjárt fel is dobom a kérdésemet ez ügyben.
Sziasztok!
Impulzus hosszt szeretnék pontosan,nagy felbontással mérni két 10-50khz-es jelen. PIC18F4520-al. [b] 1.Eset a két jel szinkronban van egymással 2.Eset a két jel nincs szinkronban van egymással Mint a csatolt képen. Hogyan lehetne pontosan megmérni az impulzus hosszát? Köszönöm.
Volt egy gyenge próbálkozásom a B-port ON-CHANGE interruptal és két TIMER-el,de nem túl nagy a felbontása és sokszor téveszt.
#define INT_IN1 PIN_B6 #define INT_IN2 PIN_B7 long T1_cycle = 0 ,T2_cycle = 0 ; volatile int1 RB_INT_VALUE_UPDATE_T1 = 0, RB_INT_VALUE_UPDATE_T2 = 0; volatile int1 PREV_T1 = 0, PREV_T2 =0; const float ONE_CYCLE= 1E-7; #int_RB void RB_isr(void) { long int_temp_t1,int_temp_t2; if( (input(INT_IN1)== TRUE) && (PREV_T1 == FALSE) && (RB_INT_VALUE_UPDATE_T1 == TRUE) ){ set_timer1(0); PREV_T1 = TRUE; } if( (input(INT_IN1)== FALSE) && (PREV_T1 == TRUE) && (RB_INT_VALUE_UPDATE_T1 == TRUE) ){ int_temp_t1 = get_timer1(); RB_INT_VALUE_UPDATE_T1 =0; PREV_T1 = FALSE; } if( (input(INT_IN2)== TRUE) && (PREV_T2 == FALSE) && (RB_INT_VALUE_UPDATE_T2 == TRUE) ){ set_timer3(0); PREV_T2 = TRUE; } if( (input(INT_IN2)== FALSE) && (PREV_T2 == TRUE)&& (RB_INT_VALUE_UPDATE_T2 == TRUE) ){ int_temp_t2= get_timer3(); RB_INT_VALUE_UPDATE_T2 =0; PREV_T2 = FALSE; } T1_cycle = int_temp_t1; T2_cycle = int_temp_t2; } void main() { long T1_cycle_tmp = 0 ,T2_cycle_tmp = 0, T1_T2_cycle_diff = 0; float T1_T2_time_diff = 0 ,T1_time = 0, T2_time = 0; setup_adc_ports(AN0_TO_AN4|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_12); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_INTERNAL|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); port_b_pullups(TRUE); SET_TRIS_B( 0xC0 ); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); do{ RB_INT_VALUE_UPDATE_T1 = 1; RB_INT_VALUE_UPDATE_T2 = 1; while( (RB_INT_VALUE_UPDATE_T1 ) || (RB_INT_VALUE_UPDATE_T2) ); T1_cycle_tmp = T1_cycle ; T2_cycle_tmp = T2_cycle ; } output_toggle(PIN_D0); //DEBUG led (float)T1_time = 1/(T1_cycle_tmp * ONE_CYCLE); (float)T2_time = 1/(T2_cycle_tmp * ONE_CYCLE); (int)T1_T2_cycle_diff = T2_cycle_tmp - T1_cycle_tmp ; (float)T1_T2_time_diff = T1_time - T2_time; printf("%Lu",T1_cycle_tmp); printf(","); printf("%Lu",T2_cycle_tmp); printf(","); printf("%Lu",T1_T2_cycle_diff); printf(","); printf("%f",T1_time); printf(","); printf("%f",T2_time); printf(","); printf("%f",T1_T2_time_diff); printf("\n\r"); delay_ms(250); }while(!0); } A CCP modult hogyan tudnám felhasználni erre a célra? Köszönöm.
Mondjuk attól is függ, mekkora a minimális periódusidő, de ha a CCPx modulnak mindig átváltod, hogy milyen élre reagáljon, akkor tudsz mérni vele kitöltési tényezőt. Nem olyan hosszú a Compare rész, olvasd el azt, és próbáld ki szimulátorban.
De az ilyet nem CCS-ben kellene csinálni...
Hello
Valaki megtudná mondani miket kell beállítani a PIC-be ha a belső oszcillátorát akarom használni?, amit a CCS feljánlott kódot azt beleírtam ( setup_oscillator(OSC_8MHZ|OSC_INTRC), plusz még a Config bitet is átállítottam, de 2-4s között vélelenszerűen újraindul a pic, de utánna el is téved rendesen a program. Azért gondolom, hogya belsővel van a gond, mert külső 4Mhz kvarcal tökéletesen fut a program. válaszokat előre is köszönöm üdv
Még egy dolog ami megviccelhet. A P Wizarddal készítsd el a projektet.
hát felajánlás alatt a wizardot értettem
|
Bejelentkezés
Hirdetés |