Trebate pomoć unos hvatanje koristeći DSPIC

A

Angeline

Guest
Ja sam novi korisnik koristeći DSPIC30F3010.Ja sam težak korištenje ulaznih hvatanje modul za hvatanje razdoblje squarewave koristeći MPLAB IDE to učiniti moje programiranje.Ja sam koristeći ICD2 da biste vidjeli rezultat moje registra koji je IC7BUF.Ja sam ne dobivanje bilo kakve promjene u tampon, ali sam stavio LED kako bi provjerili da moj broj unijeti ulazni snimanje prekinuti i to mi pokazuje da.Nadam se da mogu dobiti neki savjet.

Šifra:

# Include <p30f3010.h>

# Include <math.h>

# Include <stdio.h># define LED LATDbits.LATD0/************* Globalne varijable i konstante *************/

unsigned int period = 0, captureresult1 = 0, captureresult2 = 0; / * Varijable koje se koriste za razdoblje obračuna * /void __attribute__ ((__interrupt__)) _IC7Interrupt (void);/**** FUNKCIJA prototipova ****/

void IC_SETUP (void);

void TIMER2_SETUP (void);/****** Glavno tijelo ******/

int main (void)

(

TRISD = 0; / * Podešavanje Port D kao izlaz * /

PORTD = 0; / * Vrati LED * /

PORTD = 0xff / * Light LED, testirati PIC je rad * /

TRISB = 0x003f / * Postavljanje PortB kao ulaz * /

ADPCFG = 0xffff / * Podešavanje analognog pinski kao digitalni ulaz * /TIMER2_SETUP () / * Pozivanje Timer Funkcija Setup * /

IC_SETUP () / * Pozivanje Unos Snimi postavke funkcija * /

while (1)

(

)return (0);

)

/ *** SETUP_IC ****/

void IC_SETUP (void)

(

IC7CONbits.ICM = 3; / * Hvatanje diže svaki rub * /

IC7CONbits.ICBNE = 0; / * Input capture buffer prazan * /

IC7CONbits.ICOV = 0; / * No prelijevanje ulazni hvatanje dogodila * /

IC7CONbits.ICI = 0; / * Prekid na svako hvatanje događaja * /

IC7CONbits.ICTMR = 1; / * TMR2 sadržaji su uhvaćeni na zarobljeni događaj * /

IC7CONbits.ICSIDL = 0; / * Input capture modul će nastaviti raditi u CPU Idle modu * /

IFS1bits.IC7IF = 0; / * Prekid bit je izbrisan * /

IEC1bits.IC7IE = 1 / * Postavljanje IC7 prekinuti omogućiti bit * /)/**** Prekid ZA IC7 ****/

void __attribute__ ((__interrupt__)) _IC7Interrupt (void)

(

volatile unsigned int * ptr;ptr = &IC7BUF; / * Initialise IC7BUF pokazivač * /

captureresult1 = * ptr;

captureresult2 = * ptr ;

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

/ * IFS1bits.IC7IF = 0; / * Prekid bit je izbrisan * /

)/ *** *** TIMER_SETUP /

void TIMER2_SETUP (void)

(

T2CONbits.TCS = 1; / * Upotreba Internal Clock (Fosc / 4) * /

T2CONbits.T32 = 1; / * TMRx i TMRy obliku 32-bitni timer * /

T2CONbits.TCKPS = 0; / * Upotreba 1:1 prescale vrijednost * /

T2CONbits.TGATE = 0; / * Odbrojavanje vrata Akumulacija Disabled * /

T2CONbits.TSIDL = 0; / * Nastavi u stanje mirovanja * /

T2CONbits.TON = 1; / * Pokreće Timer * /

)
)Hvala
 
odbojnika ne bi trebalo čitati preko ICD2.trebate pregledati vašu varijablama - oni promjene ili su alwaysl 0?odbojnika obično pokazuju 0 u ICD2.da je hardver ograničenje i pretpostaviti.vjerojatno da bih izgubio sadržaj tampon ako ICD2 bih pročitati da.

još jedna stvar - zašto koristiti mjerače 32bit?postavka da se može napraviti stvari u neredu - prekidač koji off!
; /*TMRx and TMRy form a 32-bit timer*/

T2CONbits.T32 = 0.; / * TMRx i TMRy obliku 32-bitni timer * /

jedan - da stvar te činiti s pokazivačima u HRV je ...ludo ...[; To definitivno će učiniti nešto što nije namijenjen ...ICbuffer je FIFO, ali ne možete pristupiti različitim elementima s pokazivačima - samo čitanje u nizu ...to je sve ...

Ovdje je primjer iz dspic33 Datasheet:

Šifra:/ / Initialize Hvatanje Module

IC1CONbits.ICM = 0b00; / / Disable Unos Hvatanje 1 modul

IC1CONbits.ICTMR = 1; / / Select Timer2 kao osnova IC1 Vrijeme

IC1CONbits.ICI = 0b00; / / Prekid na svaki drugi hvatanje događaja

IC1CONbits.ICM = 0b001; / / Generiraj snimanje događaja na svim Rising rubu

/ / Capture Interrupt Enable I Timer2

IPC0bits.IC1IP = 1; / / Postavljanje IC1 prekid razinu prioriteta

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

IEC0bits.IC1IE = 1; / / Enable IC1 prekid

/ / Capture Interrupt Service Rutina

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;

drugi

timePeriod = (PR2 - t1) T2

)

 
Hvala Freddie Choppin.

Ja sam pokušao to maknuti pokazivač i sada kada sam iskoristiti debug mod Ja sam u mogućnosti da biste dobili rezultat u oba IC7 i IC8 da sam koristeći kao TMR2 i TMR3 registrirati.Međutim, moj deklarirani varijabla kao što je prikazano u nastavku kod, primjerice, current_value, previous_value_new_value, kad sam ga pogledom kroz prozor gledati debugger kaže ograničene memorije.Mogu li znati zašto?

U nastavku je moj broj:

Šifra:/************* Globalne varijable i konstante *************/

/ * Varijable koje se koriste za razdoblje obračuna * /

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);/**** FUNKCIJA prototipova ****/

void IC7_SETUP (void);

void IC8_SETUP (void)

void TIMER2_SETUP (void);

void TIMER3_SETUP (void);/****** Glavno tijelo ******/

int main (void)

(

TRISD = 0; / * Podešavanje Port D kao izlaz * /

PORTD = 0; / * Vrati LED * /

PORTD = 0xff / * Light LED, testirati PIC je rad * /

TRISB = 0x003f / * Postavljanje PortB kao ulaz * /

ADPCFG = 0xffff / * Podešavanje analognog pinski kao digitalni ulaz * /TIMER2_SETUP () / * Pozivanje Timer Funkcija Setup * /

TIMER3_SETUP ();

IC7_SETUP () / * Pozivanje Unos Postava Funkcija * /

IC8_SETUP ();while (1)

(

)

return (0);

)

/ *** SETUP_IC ****/

void IC7_SETUP (void)

(

IC7CONbits.ICM = 3; / * Hvatanje diže svaki rub * /

IC7CONbits.ICBNE = 0; / * Input capture buffer prazan * /

IC7CONbits.ICOV = 0; / * No prelijevanje ulazni hvatanje dogodila * /

IC7CONbits.ICI = 0; / * Prekid na svako hvatanje događaja * /

IC7CONbits.ICTMR = 1; / * TMR2 sadržaji su uhvaćeni na zarobljeni događaj * /

IC7CONbits.ICSIDL = 0; / * Input capture modul će nastaviti raditi u CPU Idle modu * /

IFS1bits.IC7IF = 0; / * Prekid bit je izbrisan * /

IEC1bits.IC7IE = 1 / * Postavljanje IC7 prekinuti omogućiti bit * /

)void IC8_SETUP (void)

(

IC8CONbits.ICM = 3; / * Hvatanje diže svaki rub * /

IC8CONbits.ICBNE = 0; / * Input capture buffer prazan * /

IC8CONbits.ICOV = 0; / * No prelijevanje ulazni hvatanje dogodila * /

IC8CONbits.ICI = 0; / * Prekid na svako hvatanje događaja * /

IC8CONbits.ICTMR = 0; / * TMR3 sadržaji su uhvaćeni na zarobljeni događaj * /

IC8CONbits.ICSIDL = 0; / * Input capture modul će nastaviti raditi u CPU Idle modu * /

IFS1bits.IC8IF = 0; / * Prekid bit je izbrisan * /

IEC1bits.IC8IE = 1 / * Postavljanje IC7 prekinuti omogućiti bit * /)/**** Prekid ZA IC7 ****/

/ / Capture Interrupt Service Rutina

/ / timePeriod unsigned int = 0;

void __attribute__ ((__interrupt__)) _IC7Interrupt (void)

(

previous_value = current_value;

current_value = IC7BUF;

if (current_value> previous_value)

(

timePeriod = current_value-previous_value;

)

drugi

(

timePeriod = (PR2 - previous_value) current_value;

)

)/**** Prekid ZA IC8 ****/

/ / Capture Interrupt Service Rutina

/ / timePeriod unsigned int = 0;

void __attribute__ ((__interrupt__)) _IC8Interrupt (void)

(

new_value = IC8BUF;

IFS1bits.IC8IF = 0;

)/ *** *** TIMER_SETUP /

void TIMER2_SETUP (void)

(

/ / T2CON = 0x00; / / Zaustavlja Timer2 i vraćanje kontrole reg..

T2CONbits.TCS = 1; / * Upotreba Internal Clock (Fosc / 4) * /

T2CONbits.T32 = 0; / * TMRx i TMRy obliku 16-bitni timer * /

T2CONbits.TCKPS = 0; / * Upotreba 1:1 prescale vrijednost * /

T2CONbits.TGATE = 0; / * Odbrojavanje vrata Akumulacija Disabled * /

T2CONbits.TSIDL = 0; / * Nastavi u stanje mirovanja * /

T2CON = 0x00; / / Zaustavlja Timer2 i vraćanje kontrole reg..

TMR2 = 0x00; / / Očisti sadržaj timer registrirati

PR2 = 0xFFFF; / / Load period prijaviti vrijednost 0xFFFF

/ / IPC0bits.T2IP = 0x01; / / Timer2 Postava prekidati za željeni prioritet leve

/ / (Ovaj primjer dodjeljuje prioritet razina 1)

IFS0bits.T2IF = 0; / / Clear Timer1 prekid statusa flag

IEC0bits.T2IE = 1; / / Enable Timer1 prekida

T2CONbits.TON = 1; / / Start Timer1 s prescaler postavkama na 1:1 i

/ / sat izvor postavljen na interne ciklus instrukcija

)/ * Primjer koda za Timer1 ISR * /

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

(

/ * Prekid Usluga Rutina kod ide ovdje * /

IFS0bits.T2IF = 0; / / Reset Timer1 prekinuti zastavu i povratak iz ISR

)/ *** *** TIMER_SETUP /

void TIMER3_SETUP (void)

(

T3CONbits.TCS = 1; / * Upotreba Internal Clock (Fosc / 4) * /

T3CONbits.TCKPS = 0; / * Upotreba 1:1 prescale vrijednost * /

T3CONbits.TGATE = 0; / * Odbrojavanje vrata Akumulacija Disabled * /

T3CONbits.TSIDL = 0; / * Nastavi u stanje mirovanja * /

T3CON = 0x00; / / Zaustavlja Timer2 i vraćanje kontrole reg..

TMR3 = 0x00; / / Očisti sadržaj timer registrirati

PR3 = 0xFFFF; / / Load period prijaviti vrijednost 0xFFFF

/ / IPC0bits.T2IP = 0x01; / / Timer2 Postava prekidati za željeni prioritet leve

/ / (Ovaj primjer dodjeljuje prioritet razina 1)

IFS0bits.T3IF = 0; / / Clear Timer1 prekid statusa flag

IEC0bits.T3IE = 1; / / Enable Timer1 prekida

T3CONbits.TON = 1; / / Start Timer1 s prescaler postavkama na 1:1 i

/ / sat izvor postavljen na interne instrukcije ciklus

)/ * Primjer koda za Timer1 ISR * /

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

(

/ * Prekid Usluga Rutina kod ide ovdje * /

IFS0bits.T3IF = 0; / / Reset Timer1 prekinuti zastavu i povratak iz ISR

)

 
promijeniti način graditi u mplab od JAVNOST do DEBUG.u novim verzijama nalazi se padajući izbornik u centru vrhu alatne trake.u starijih mplab morate pronaći neke opcije graditi i promijenite ih kako 'graditi za ICD2'.ICD2 koristi prvi 80b RAM-a, taj 'zašto ne možete vidjeti varijable koje su postavljene tamo.vidi slici ispod (MPLAB v8)<img src="http://images29.fotosik.pl/170/17e2659caf0345cam.gif" border="0" alt="Need help with input capture using DSPIC" title="Trebate li pomoć s unos hvatanje koristeći DSPIC"/> trebali graditi u DEBUG načinu rada za ispravljanje pogrešaka, te u MEDIJE način za samostalan rad (konačan broj, test bez debugger, i sl.)

trebate obavijestiti Linker direktno, da li se koristi icd2, tako da će staviti iznad varijable ICD2 ograničen raspon (0x800 - 0x850).

Vaše rezultati nisu u HEX, oni su samo cijelih brojeva.možete učiniti tip lijevanja do pretvoriti ih s pomičnim zarezom.

Šifra:float var_float;

int var_int;var_int = 1234;

var_float = (float) var_int;

 
Hvala opet za sve vaše savjete i osigurati mene određeni član zaslon metak ...I ll pokušati potvrditi moje kodiranja pogreške koje ste spomenuli.

I did it in debug mode ...ali ja dont shvatiti ...Kako mogu znati linker izravno kao što se spominje u svoj odgovor?

haha ...ya ..I ll probati matematike operacije vidjeti kako to ide =)

 
po 'direktno' mislim na to polje mijenja do DEBUG [;, tu je i indirektni način - morate odrediti varijablu pseudo stol, i to pod locirati adresu 0x800.to je veličina treba biti 80bytes (40 riječi).no prebacivanje graditi način da je pametnije DEBUG [;

potvrditi adresu varijable - kad koristite ICD2 varijabla ne bi trebao biti smješten ispod adresa 0x850

0x41 0x56 0x45!

 
hvala opet ...

ja uspio dobiti već =) ja je to sve u cijeli ...uzrok točnost razini nneed ja svoj ne da visoke ... pa sam skale gore moj čitanje ...

međutim moja debugger i dalje prikazivati resreicted memorije ...sada koristim MPLAB SIM ...i gledati ga gledati kroz prozor ...

hvala puno =)

 
halo imam problem sa input hvatanje modula vaše komentare, ali mi ne pomažu.prekida ne rade.Ovo je dio mog koda, koji se ne uspijeva:

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;
while (1) (

)
return 1;
)void __attribute__ ((__interrupt__)) _IC2Interrupt (void) (
IFS0bits.IC2IF = 0;
putsUART1 ( "Interrupt");
)Problem je u tome što "Interrupt" je samo napisati prvi put, tako, ne postoji prekid
i ja se ne mogu razumjeti zašto.bilo koji ideja?

hvala tiAdded after 1 minute:Žalostan JA je zaboravio staviti na funkciju CONFIGtimer ove linije:

OpenTimer3 (configT3, 0xffff);

Hvala opetDodano nakon 59 sekundi:T3CONbits.TON = 1;

 

Welcome to EDABoard.com

Sponsor

Back
Top