Trenger du hjelp med skriving fangst bruker DSPIC

A

angeline

Guest
Jeg er en ny bruker ved hjelp DSPIC30F3010.Jeg prøver å bruke skriving fange modul å fange perioden squarewave bruker MPLAB IDE å gjøre mitt programmering.Jeg bruker ICD2 å vise resultat av register som IC7BUF.Jeg er ikke noen endringer i bufferen, men jeg satt en LED å sikre at min koden angir skriving fange avbruddsordrelinje og viser meg ja.Håper kan få noen råd.

Code:

# Include <p30f3010.h>

# Include <math.h>

# Include <stdio.h># define LED LATDbits.LATD0/************* Globale variabler og Konstanter *************/

unsigned int tid = 0, captureresult1 = 0, captureresult2 = 0; / * Variablar brukes for perioden beregning * /void __attribute__ ((__interrupt__)) _IC7Interrupt (void);/**** FUNCTION prototyper ****/

void IC_SETUP (void);

void TIMER2_SETUP (void);/****** Hoveddelen ******/

int main (void)

(

TRISD = 0; / * Sette Port D som utgang * /

PORTD = 0; / * Reset LED * /

PORTD = 0xff; / * Tenn lyset, for å teste PIC fungerer * /

TRISB = 0x003f; / * Sette PortB som input * /

ADPCFG = 0xFFFF; / * Innstilling av analoge pin som digital inngang * /TIMER2_SETUP (); / * Ringe tidtakeren Setup Funksjon * /

IC_SETUP (); / * Ringe INPUT Capture Setup Funksjon * /

mens (1)

(

)return (0);

)

/ *** SETUP_IC ****/

void IC_SETUP (void)

(

IC7CONbits.ICM = 3; / * Capture hvert stigende kanten * /

IC7CONbits.ICBNE = 0; / * Input fange bufferen er tom * /

IC7CONbits.ICOV = 0; / * No input fangst overflyten inntraff * /

IC7CONbits.ICI = 0; / * Interrupt på hver fange hendelsen * /

IC7CONbits.ICTMR = 1; / * TMR2 innholdet er tatt på fanget hendelsen * /

IC7CONbits.ICSIDL = 0; / * Input fange modul vil fortsette å operere i CPU Inaktiv modus * /

IFS1bits.IC7IF = 0; / * Interrupt bit tømmes * /

IEC1bits.IC7IE = 1; / * Sett IC7 avbruddsordrelinje aktivere bits * /)/**** Avbruddsordrelinje FOR IC7 ****/

void __attribute__ ((__interrupt__)) _IC7Interrupt (void)

(

flyktige unsigned int * ptr;ptr = &IC7BUF; / * Initialise IC7BUF peker * /

captureresult1 = * ptr;

captureresult2 = * ptr ;

LED = ~ LED;captureresult1 = IC7BUF;perioden = captureresult2-captureresult1;

/ * IFS1bits.IC7IF = 0; / * Interrupt bit tømmes * /

)/ *** TIMER_SETUP *** /

void TIMER2_SETUP (void)

(

T2CONbits.TCS = 1; / * Bruke Intern Klokke (Fosc / 4) * /

T2CONbits.T32 = 1; / * TMRx og TMRy danne et 32-bits tidtaker * /

T2CONbits.TCKPS = 0; / * Bruke 1:1 prescale verdi * /

T2CONbits.TGATE = 0; / * Tidsur Gate opphopning funksjonshemmede * /

T2CONbits.TSIDL = 0; / * Fortsett i inaktiv modus * /

T2CONbits.TON = 1; / * Starts Tidtaker * /

)
)Takk
 
på buffere ikke bør leses via ICD2.må du undersøke variabler - gjør de endres eller alwaysl 0?den buffere vanligvis viser 0 i ICD2.som er en hardware begrensning jeg.sannsynligvis du mistet innholdet i buffer dersom ICD2 ville lese det.

En annen ting - hvorfor bruke 32bit tidtakere?at innstillingen kan få ting rotete - slå den av!
; /*TMRx and TMRy form a 32-bit timer*/

T2CONbits.T32 = 0;
/ * TMRx og TMRy danne et 32-bits tidtaker * /

en annen - som du gjør med pekere i ISR er ...sprø ...[; Det vil definetely gjøre noe du ikke har tenkt ...den ICbuffer er FIFO, men du kan ikke få tilgang til ulike elementer med pekere - du leser sekvensielt ...det
er alt ...

Her er et eksempel fra dspic33 Dataark:

Code:/ / Initialiser Capture Module

IC1CONbits.ICM = 0b00; / / Disable Input Capture 1 modul

IC1CONbits.ICTMR = 1; / / Velg Timer2 som IC1 Time base

IC1CONbits.ICI = 0b00; / / Interrupt på hvert sekund fange hendelse

IC1CONbits.ICM = 0b001; / / Generer fange begivenheten på hver Rising kanten

/ / Enable Capture Interrupt Og Timer2

IPC0bits.IC1IP = 1; / / Setup IC1 avbruddsordrelinje prioritetsnivå

IFS0bits.IC1IF = 0; / / Clear IC1 Interrupt Status Flag

IEC0bits.IC1IE = 1; / / Enable IC1 avbruddsordrelinje

/ / Capture Interrupt Service Rutine

unsigned int timePeriod = 0;

void __attribute__ ((__interrupt__)) _IC1Interrupt (void)

(

unsigned int t1, t2;

t2 = IC1BUF;

t1 = IC1BUF;

IFS0bits.IC1IF = 0;

if (t2> t1)

timePeriod = t2-t1;

ellers

timePeriod = (PR2 - t1) t2

)

 
Takk Freddie Choppin.

Jeg har forsøkt å fjerne pekeren og nå når jeg bruker feilsøkingsmodus jeg kunne få et resultat under både IC7 og IC8 at jeg bruker samt TMR2 og TMR3 register.Men min erklært variabel som vist i koden nedenfor eksempel current_value, previous_value_new_value, når jeg viser det gjennom feilsøkingsprogram watch vinduet står det begrensede minnet.Kanskje jeg vet hvorfor?

Her er min kode:

Code:/************* Globale variabler og Konstanter *************/

/ * Variablar brukes for perioden beregning * /

unsigned int timePeriod = 0;

unsigned int current_value = 0, previous_value = 0;

unsigned int new_value = 0;void __attribute__ ((__interrupt__)) _IC7Interrupt (void);

void __attribute__ ((__interrupt__)) _IC8Interrupt (void);

void __attribute__ ((__interrupt__, __shadow__)) _T2Interrupt (void);

void __attribute__ ((__interrupt__, __shadow__)) _T3Interrupt (void);/**** FUNCTION prototyper ****/

void IC7_SETUP (void);

void IC8_SETUP (void)

void TIMER2_SETUP (void);

void TIMER3_SETUP (void);/****** Hoveddelen ******/

int main (void)

(

TRISD = 0; / * Sette Port D som utgang * /

PORTD = 0; / * Reset LED * /

PORTD = 0xff; / * Tenn lyset, for å teste PIC fungerer * /

TRISB = 0x003f; / * Sette PortB som input * /

ADPCFG = 0xFFFF; / * Innstilling av analoge pin som digital inngang * /TIMER2_SETUP (); / * Ringe tidtakeren Setup Funksjon * /

TIMER3_SETUP ();

IC7_SETUP (); / * Ringe INPUT Setup Funksjon * /

IC8_SETUP ();mens (1)

(

)

return (0);

)

/ *** SETUP_IC ****/

void IC7_SETUP (void)

(

IC7CONbits.ICM = 3; / * Capture hvert stigende kanten * /

IC7CONbits.ICBNE = 0; / * Input fange bufferen er tom * /

IC7CONbits.ICOV = 0; / * No input fangst overflyten inntraff * /

IC7CONbits.ICI = 0; / * Interrupt på hver fange hendelsen * /

IC7CONbits.ICTMR = 1; / * TMR2 innholdet er tatt på fanget hendelsen * /

IC7CONbits.ICSIDL = 0; / * Input fange modul vil fortsette å operere i CPU Inaktiv modus * /

IFS1bits.IC7IF = 0; / * Interrupt bit tømmes * /

IEC1bits.IC7IE = 1; / * Sett IC7 avbruddsordrelinje aktivere bits * /

)void IC8_SETUP (void)

(

IC8CONbits.ICM = 3; / * Capture hvert stigende kanten * /

IC8CONbits.ICBNE = 0; / * Input fange bufferen er tom * /

IC8CONbits.ICOV = 0; / * No input fangst overflyten inntraff * /

IC8CONbits.ICI = 0; / * Interrupt på hver fange hendelsen * /

IC8CONbits.ICTMR = 0; / * TMR3 innholdet er tatt på fanget hendelsen * /

IC8CONbits.ICSIDL = 0; / * Input fange modul vil fortsette å operere i CPU Inaktiv modus * /

IFS1bits.IC8IF = 0; / * Interrupt bit tømmes * /

IEC1bits.IC8IE = 1; / * Sett IC7 avbruddsordrelinje aktivere bits * /)/**** Avbruddsordrelinje FOR IC7 ****/

/ / Capture Interrupt Service Rutine

/ / unsigned int timePeriod = 0;

void __attribute__ ((__interrupt__)) _IC7Interrupt (void)

(

previous_value = current_value;

current_value = IC7BUF;

if (current_value> previous_value)

(

timePeriod = current_value-previous_value;

)

ellers

(

timePeriod = (PR2 - previous_value) current_value;

)

)/**** Avbruddsordrelinje FOR IC8 ****/

/ / Capture Interrupt Service Rutine

/ / unsigned int timePeriod = 0;

void __attribute__ ((__interrupt__)) _IC8Interrupt (void)

(

new_value = IC8BUF;

IFS1bits.IC8IF = 0;

)/ *** TIMER_SETUP *** /

void TIMER2_SETUP (void)

(

/ / T2CON = 0x00; / / stopper Timer2 og tilbakestille kontroll reg.

T2CONbits.TCS = 1; / * Bruke Intern Klokke (Fosc / 4) * /

T2CONbits.T32 = 0; / * TMRx og TMRy danne et 16-bits tidtaker * /

T2CONbits.TCKPS = 0; / * Bruke 1:1 prescale verdi * /

T2CONbits.TGATE = 0; / * Tidsur Gate opphopning funksjonshemmede * /

T2CONbits.TSIDL = 0; / * Fortsett i inaktiv modus * /

T2CON = 0x00; / / stopper Timer2 og tilbakestille kontroll reg.

TMR2 = 0x00; / / Tøm innholdet i tidtaker register

PR2 = 0xFFFF; / / Load perioden register med verdien 0xFFFF

/ / IPC0bits.T2IP = 0x01; / / Setup Timer2 avbruddsordrelinje for ønsket prioritet leve

/ / (Dette eksemplet tildeler nivå 1 prioritet)

IFS0bits.T2IF = 0; / / Tøm Timer1 avbruddsordrelinje status flagg

IEC0bits.T2IE = 1; / / Enable Timer1 avbryter

T2CONbits.TON = 1; / / Start Timer1 med prescaler innstillinger på 1:1 og

/ / klokke kilde satt til intern undervisning syklus

)/ * Eksempel koden for Timer1 ISR * /

void __attribute__ ((__interrupt__, __shadow__)) _T2Interrupt (void)

(

/ * Interrupt Service Rutine code her * /

IFS0bits.T2IF = 0; / / Reset Timer1 avbruddsordrelinje flagg og Retur fra ISR

)/ *** TIMER_SETUP *** /

void TIMER3_SETUP (void)

(

T3CONbits.TCS = 1; / * Bruke Intern Klokke (Fosc / 4) * /

T3CONbits.TCKPS = 0; / * Bruke 1:1 prescale verdi * /

T3CONbits.TGATE = 0; / * Tidsur Gate opphopning funksjonshemmede * /

T3CONbits.TSIDL = 0; / * Fortsett i inaktiv modus * /

T3CON = 0x00; / / stopper Timer2 og tilbakestille kontroll reg.

TMR3 = 0x00; / / Tøm innholdet i tidtaker register

PR3 = 0xFFFF; / / Load perioden register med verdien 0xFFFF

/ / IPC0bits.T2IP = 0x01; / / Setup Timer2 avbruddsordrelinje for ønsket prioritet leve

/ / (Dette eksemplet tildeler nivå 1 prioritet)

IFS0bits.T3IF = 0; / / Tøm Timer1 avbruddsordrelinje status flagg

IEC0bits.T3IE = 1; / / Enable Timer1 avbryter

T3CONbits.TON = 1; / / Start Timer1 med prescaler innstillinger på 1:1 og

/ / klokke kilde satt til intern undervisning syklus

)/ * Eksempel koden for Timer1 ISR * /

void __attribute__ ((__interrupt__, __shadow__)) _T3Interrupt (void)

(

/ * Interrupt Service Rutine code her * /

IFS0bits.T3IF = 0; / / Reset Timer1 avbruddsordrelinje flagg og Retur fra ISR

)

 
endre bygge i mplab fra RELEASE å feilsøke.i nye versjoner er det en rullegardinmeny i midten av øverste verktøylinjen.i eldre mplab må du finne noen bygge alternativer og endre dem til å "bygge på ICD2 '.ICD2 bruker første 80b RAM, det
er grunnen til at du ikke kan se de variablene som ble plassert der.se skjermbildet nedenfor (MPLAB v8)<img src="http://images29.fotosik.pl/170/17e2659caf0345cam.gif" border="0" alt=""/> bør du bygge i feilsøkingsmodus for feilsøking, og i RELEASE for frittstående drift (endelige koden test uten feilsøkingsprogram, etc.)

må du informere Linker direkte, som du bruker icd2, slik at det vil sette variablene ovenfor ICD2 begrenset utvalg (0x800 - 0x850).

resultatene ikke er i HEX, de er bare heltall.du kan gjøre type avstøpning å konvertere dem til flytende punktet.

Code:float var_float;

int var_int;var_int = 1234;

var_float = (float) var_int;

 
Takk for alle råd og gi meg skjermbilde ...Jeg vil prøve å kontrollere kodefeil du har nevnt.

Jeg gjorde det i feilsøkingsmodus ...men jeg ikke forstå ...Hvordan kan jeg fortelle linker direkte som du har nevnt i svaret ditt?

haha ...ya ..Jeg vil prøve på matte drift se hvordan det går =)

 
etter "direkte" Jeg mener å endre dette feltet til DEBUG [;, er det også en indirekte måte - du må spesifisere en tilleggskonto tabellen variabel, og finn den under adressen 0x800.det må være 80bytes (40 ord).imidlertid veksling bygge for å DEBUG er smartere [;

bekrefte adressen din variabler - ved bruk ICD2 ingen variabel skal plasseres under adressen 0x850

0x41 0x56 0x45!

 
takk igjen ...

Jeg klarer å få allerede =) Jeg gjorde alt i heltall ...forårsake nøyaktigheten nivå i nneed sin ikke så høy ... så jeg skalere opp mine leser ...

Men min feilsøkingsprogram fortsatt vises resreicted minne ...nå i bruk MPLAB SIM ...og se det gjennom Sjekk vinduet ...

Takk =)

 
Hei jeg har et problem med input fange modulen men dine kommentarer ikke hjelpe meg.de avbryter ikke fungerer.Disse er del av min kode som mislykkes:

void CONFIGcapture (void) (
CloseCapture2 ();
unsigned int configIC2 = IC_DLE_STOP & IC_TIMER3_SRC & IC_INT_1CAPTURE & IC_EVERY_EDGE;
OpenCapture2 (configIC2);
)

void CONFIGtimers (void) (
unsigned int configT3 = T3_OFF & T3_IDLE_CON & T3_GATE_OFF &
T3_PS_1_64 & T3_SOURCE_INT;
)

int void (main) (
CONFIGcapture ();
CONFIGtimers ();
TRISDbits.TRISD9 = 1;
mens (1) (

)
return 1;
)void __attribute__ ((__interrupt__)) _IC2Interrupt (void) (
IFS0bits.IC2IF = 0;
putsUART1 ( "Interrupt");
)Problemet er at "Interrupt" er bare skrive den første tiden, så er det ingen en avbruddsordrelinje
og jeg kan ikke forstå hvorfor.noen ide?

takkLagt etter 1 minutt:Beklager at jeg glemte satt på den funksjonen CONFIGtimer denne linjen:

OpenTimer3 (configT3, 0xFFFF);

Takk igjenLagt til etter 59 sekunder:T3CONbits.TON = 1;

 

Welcome to EDABoard.com

Sponsor

Back
Top