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   14 / 118
(#) Tys23 válasza icserny hozzászólására (») Okt 1, 2008 /
 
köszike a segitséget lessz mit tanulgatnom belölle tényleg köszike
(#) m2attila válasza icserny hozzászólására (») Okt 1, 2008 /
 
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.
(#) icserny válasza m2attila hozzászólására (») Okt 1, 2008 /
 
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.
(#) icserny válasza icserny hozzászólására (») Okt 1, 2008 /
 
Helyesbítek: nem kell 0x3F csak 0x0F

  1. ADCON1 = [color=blue]0x0F[/color];
(#) m2attila válasza icserny hozzászólására (») Okt 4, 2008 /
 
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!
(#) icserny válasza m2attila hozzászólására (») Okt 4, 2008 /
 
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.



(#) source2 hozzászólása Okt 4, 2008 /
 
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
(#) pepe33 hozzászólása Okt 4, 2008 /
 
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.

main.c
    
(#) m2attila válasza icserny hozzászólására (») Okt 5, 2008 /
 
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.


(#) icserny válasza pepe33 hozzászólására (») Okt 5, 2008 /
 
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?
(#) icserny válasza source2 hozzászólására (») Okt 5, 2008 /
 
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;
(#) MPi-c válasza source2 hozzászólására (») Okt 5, 2008 /
 
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"
(#) pepe33 válasza icserny hozzászólására (») Okt 5, 2008 /
 
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.
(#) m2attila hozzászólása Okt 5, 2008 /
 
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.
(#) MPi-c válasza m2attila hozzászólására (») Okt 5, 2008 /
 
Jól nézd meg, milyen tipusra definiáltad a TMR0_SET_VALUE változódat! Ez CCS!
(#) m2attila válasza MPi-c hozzászólására (») Okt 5, 2008 /
 
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....
(#) MPi-c válasza m2attila hozzászólására (») Okt 5, 2008 /
 
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.
(#) pepe33 hozzászólása Okt 6, 2008 /
 
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 !

(#) kukac_24 hozzászólása Okt 8, 2008 /
 
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!
(#) icserny válasza kukac_24 hozzászólására (») Okt 8, 2008 /
 
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?
(#) gulasoft válasza pepe33 hozzászólására (») Okt 9, 2008 /
 
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.
(#) m2attila hozzászólása Okt 9, 2008 /
 
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.

MWSnap120.png
    
(#) potyo válasza m2attila hozzászólására (») Okt 9, 2008 /
 
Használd a CCP modult.
(#) m2attila válasza potyo hozzászólására (») Okt 9, 2008 /
 
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.
(#) potyo válasza m2attila hozzászólására (») Okt 9, 2008 /
 
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...
(#) source2 hozzászólása Okt 11, 2008 /
 
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

(#) vicsys válasza source2 hozzászólására (») Okt 11, 2008 /
 
  1. #FUSES INTRC_IO     //Internal RC Osc, no CLKOUT

(#) source2 válasza vicsys hozzászólására (») Okt 11, 2008 /
 
írtam hogy beállítottam
(#) vicsys válasza source2 hozzászólására (») Okt 11, 2008 /
 
Még egy dolog ami megviccelhet. A P Wizarddal készítsd el a projektet.
(#) source2 válasza vicsys hozzászólására (») Okt 11, 2008 /
 
hát felajánlás alatt a wizardot értettem
Következő: »»   14 / 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