Нужда от помощ за въвеждане на улавянето използвайки DSPIC

A

angeline

Guest
Аз съм нов потребител използвайки DSPIC30F3010.Аз съм се опитват да използват входа улавяне модул за улавяне на периода на squarewave използвайки MPLAB IDE към моите програмиране.Аз съм с помощта на ICD2 за да видите резултата от моите регистър, който е IC7BUF.Аз не съм получава никакви промени в буфер, обаче аз се сложи светодиодна за да сте сигурни, въведете кода си приноса улавяне прекъсват и тя показва ми да.Надявам се да получите някои съвети.

Код:

# Включват <p30f3010.h>

# Включват <math.h>

# Включват <stdio.h># определят LED LATDbits.LATD0/************* Глобални променливи и константи *************/

неподписан INT период = 0, captureresult1 = 0, captureresult2 = 0; / * Променливи, използвани за изчисляване периода * /недействителни __attribute__ ((__interrupt__)) _IC7Interrupt (нищожна);/**** ФУНКЦИЯ прототипи ****/

недействителни IC_SETUP (нищожна);

недействителни TIMER2_SETUP (нищожна);/****** Основното тяло ******/

INT главната (недействителни)

(

TRISD = 0; / * Определяне Port D като продукция * /

PORTD = 0; / * нулиране на LED * /

PORTD = 0xff; / * LED светлина, за да се тества PIC работи * /

TRISB = 0x003f; / * Определяне PortB като вход * /

ADPCFG = 0xffff; / * Въвеждане на ПИН аналог като цифров вход * /TIMER2_SETUP (); / * Повикващата Таймерът за инсталиране Длъжност * /

IC_SETUP (); / * Повикващата приноса улавянето Настройване Длъжност * /

докато (1)

(

)възвращаемост (0);

)

/ *** SETUP_IC ****/

недействителни IC_SETUP (недействителни)

(

IC7CONbits.ICM = 3; / * улавянето на всеки нарастващите край * /

IC7CONbits.ICBNE = 0; / * Въвеждане улавяне буфер е празна * /

IC7CONbits.ICOV = 0; / * Няма вход улавяне преливат настъпили * /

IC7CONbits.ICI = 0; / * Прекъсване на всеки улавяне случай * /

IC7CONbits.ICTMR = 1; / * TMR2 съдържанието са заловени в плен случай * /

IC7CONbits.ICSIDL = 0; / * Въвеждане улавяне модул ще продължи да работи в CPU свободен режим * /

IFS1bits.IC7IF = 0; / * Прекъсване късче се изчиства * /

IEC1bits.IC7IE = 1; / * Задайте IC7 прекъсне позволи битов * /)/**** Прекъсне ЗА IC7 ****/

недействителни __attribute__ ((__interrupt__)) _IC7Interrupt (недействителни)

(

летливи неподписан INT * PTR;PTR = &IC7BUF; / * Initialise IC7BUF показалка * /

captureresult1 = * PTR;

captureresult2 = * PTR ;

LED = ~ LED;captureresult1 = IC7BUF;период = captureresult2-captureresult1;

/ * IFS1bits.IC7IF = 0; / * Прекъсване късче се изчиства * /

)/ *** TIMER_SETUP *** /

недействителни TIMER2_SETUP (недействителни)

(

T2CONbits.TCS = 1; / * Използване на вътрешния часовник (Fosc / 4) * /

T2CONbits.T32 = 1; / * TMRx и TMRy формата на 32-битови таймер * /

T2CONbits.TCKPS = 0; / * Използване 1:1 prescale стойност * /

T2CONbits.TGATE = 0; / * Таймер Gate Натрупването инвалидите * /

T2CONbits.TSIDL = 0; / * Продължи в свободен режим * /

T2CONbits.TON = 1; / * Стартира Таймер * /

)
)Благодаря
 
на буфери, не трябва да се чете през ICD2.Вие трябва да се разглежда променливи - те се променят или се alwaysl 0?на буфери обикновено показва 0 в ICD2., който е хардуерно ограничение предполагам.Вероятно бихте загубили съдържанието на буфер, ако ICD2 ще прочете това.

още нещо - защо използването 32bit таймери?тази настройка може да прави неща, разхвърлян - преминаване че ти!
; /*TMRx and TMRy form a 32-bit timer*/

T2CONbits.T32 = 0;
/ * TMRx и TMRy формата на 32-битови таймер * /

друг - че нещо, което правите с насоки в ISR е ...луда ...[; Definetely ще направя нещо, което не е предназначено ...на ICbuffer е FIFO, но нямат достъп до различни елементи с насоки - вие просто четат последователно ...Това
е всичко ...

Ето един пример от dspic33 дейташитове:

Код:/ / Инициализиране улавянето Модул

IC1CONbits.ICM = 0b00; / / Деактивиране Входно улавянето 1 модул

IC1CONbits.ICTMR = 1; / / Изберете Timer2 като IC1 Време база

IC1CONbits.ICI = 0b00; / / Прекъсване на всяка секунда заснемане събитие

IC1CONbits.ICM = 0b001; / / Генерирай улавяне събитие за всеки Rising ръб

/ / Разрешаване улавянето Прекъсване И Timer2

IPC0bits.IC1IP = 1; / / Настройка IC1 прекъсне приоритетно ниво

IFS0bits.IC1IF = 0; / / Ясно IC1 Прекъсване Статус Флаг

IEC0bits.IC1IE = 1; / / Разрешаване IC1 прекъсне

/ / Улавянето Прекъсване служба рутинна

неподписан INT timePeriod = 0;

недействителни __attribute__ ((__interrupt__)) _IC1Interrupt (недействителни)

(

неподписан INT Т1, Т2;

Т2 = IC1BUF;

t1 = IC1BUF;

IFS0bits.IC1IF = 0;

ако (Т2> t1)

timePeriod = T2-t1;

в противен случай

timePeriod = (PR2 - t1) Т2

)

 
Мерси Фреди Choppin.

Аз се опитах да премахнете показалка и сега, когато се използва трасирате режим аз съм в състояние да получите резултата по двете IC7 и IC8 че съм използване, както и TMR2 и TMR3 регистрирайте.Въпреки това,
моят обявени променлива, както е показано в кода по-долу, например, current_value, previous_value_new_value, когато го видите чрез дебъгер гледате прозорец пише ограничена памет.Мога ли да знам защо?

По-долу е моя код:

Код:/************* Глобални променливи и константи *************/

/ * Променливи, използвани за изчисляване периода * /

неподписан INT timePeriod = 0;

неподписан INT current_value = 0, previous_value = 0;

неподписан INT new_value = 0;недействителни __attribute__ ((__interrupt__)) _IC7Interrupt (нищожна);

недействителни __attribute__ ((__interrupt__)) _IC8Interrupt (нищожна);

недействителни __attribute__ ((__interrupt__, __shadow__)) _T2Interrupt (нищожна);

недействителни __attribute__ ((__interrupt__, __shadow__)) _T3Interrupt (нищожна);/**** ФУНКЦИЯ прототипи ****/

недействителни IC7_SETUP (нищожна);

недействителни IC8_SETUP (недействителни)

недействителни TIMER2_SETUP (нищожна);

недействителни TIMER3_SETUP (нищожна);/****** Основното тяло ******/

INT главната (недействителни)

(

TRISD = 0; / * Определяне Port D като продукция * /

PORTD = 0; / * нулиране на LED * /

PORTD = 0xff; / * LED светлина, за да се тества PIC работи * /

TRISB = 0x003f; / * Определяне PortB като вход * /

ADPCFG = 0xffff; / * Въвеждане на ПИН аналог като цифров вход * /TIMER2_SETUP (); / * Повикващата Таймерът за инсталиране Длъжност * /

TIMER3_SETUP ();

IC7_SETUP (); / * Повикващата приноса Настройка Длъжност * /

IC8_SETUP ();докато (1)

(

)

възвращаемост (0);

)

/ *** SETUP_IC ****/

недействителни IC7_SETUP (недействителни)

(

IC7CONbits.ICM = 3; / * улавянето на всеки нарастващите край * /

IC7CONbits.ICBNE = 0; / * Въвеждане улавяне буфер е празна * /

IC7CONbits.ICOV = 0; / * Няма вход улавяне преливат настъпили * /

IC7CONbits.ICI = 0; / * Прекъсване на всеки улавяне случай * /

IC7CONbits.ICTMR = 1; / * TMR2 съдържанието са заловени в плен случай * /

IC7CONbits.ICSIDL = 0; / * Въвеждане улавяне модул ще продължи да работи в CPU свободен режим * /

IFS1bits.IC7IF = 0; / * Прекъсване късче се изчиства * /

IEC1bits.IC7IE = 1; / * Задайте IC7 прекъсне позволи битов * /

)недействителни IC8_SETUP (недействителни)

(

IC8CONbits.ICM = 3; / * улавянето на всеки нарастващите край * /

IC8CONbits.ICBNE = 0; / * Въвеждане улавяне буфер е празна * /

IC8CONbits.ICOV = 0; / * Няма вход улавяне преливат настъпили * /

IC8CONbits.ICI = 0; / * Прекъсване на всеки улавяне случай * /

IC8CONbits.ICTMR = 0; / * TMR3 съдържанието са заловени в плен случай * /

IC8CONbits.ICSIDL = 0; / * Въвеждане улавяне модул ще продължи да работи в CPU свободен режим * /

IFS1bits.IC8IF = 0; / * Прекъсване късче се изчиства * /

IEC1bits.IC8IE = 1; / * Задайте IC7 прекъсне позволи битов * /)/**** Прекъсне ЗА IC7 ****/

/ / Улавянето Прекъсване служба рутинна

/ / неподписан INT timePeriod = 0;

недействителни __attribute__ ((__interrupt__)) _IC7Interrupt (недействителни)

(

previous_value = current_value;

current_value = IC7BUF;

ако (current_value> previous_value)

(

timePeriod = current_value-previous_value;

)

в противен случай

(

timePeriod = (PR2 - previous_value) current_value;

)

)/**** Прекъсне ЗА IC8 ****/

/ / Улавянето Прекъсване служба рутинна

/ / неподписан INT timePeriod = 0;

недействителни __attribute__ ((__interrupt__)) _IC8Interrupt (недействителни)

(

new_value = IC8BUF;

IFS1bits.IC8IF = 0;

)/ *** TIMER_SETUP *** /

недействителни TIMER2_SETUP (недействителни)

(

/ / T2CON = 0x00; / / спира Timer2 и нулиране контрол рег..

T2CONbits.TCS = 1; / * Използване на вътрешния часовник (Fosc / 4) * /

T2CONbits.T32 = 0; / * TMRx и TMRy образуват 16-битови таймер * /

T2CONbits.TCKPS = 0; / * Използване 1:1 prescale стойност * /

T2CONbits.TGATE = 0; / * Таймер Gate Натрупването инвалидите * /

T2CONbits.TSIDL = 0; / * Продължи в свободен режим * /

T2CON = 0x00; / / спира Timer2 и нулиране контрол рег..

TMR2 = 0x00; / / Ясно съдържанието на таймера регистър

PR2 = 0xFFFF; / / Заредете Период регистър със стойността 0xFFFF

/ / IPC0bits.T2IP = 0x01; / / Настройка Timer2 прекъсне за желания приоритет leve

/ / (Този пример задава ниво на приоритет 1)

IFS0bits.T2IF = 0; / / Изчистване на Timer1 прекъсне статус флаг

IEC0bits.T2IE = 1; / / Разрешаване Timer1 прекъсва

T2CONbits.TON = 1; / / Старт Timer1 с prescaler настройки по 1:1 и

/ / часовник източник, определени за вътрешната инструкция цикъл

)/ * Пример код за Timer1 ISR * /

недействителни __attribute__ ((__interrupt__, __shadow__)) _T2Interrupt (недействителни)

(

/ * Прекъсване служба рутинна код се поставя тук * /

IFS0bits.T2IF = 0; / / Нулиране Timer1 прекъсне флаг и връщане от ISR

)/ *** TIMER_SETUP *** /

недействителни TIMER3_SETUP (недействителни)

(

T3CONbits.TCS = 1; / * Използване на вътрешния часовник (Fosc / 4) * /

T3CONbits.TCKPS = 0; / * Използване 1:1 prescale стойност * /

T3CONbits.TGATE = 0; / * Таймер Gate Натрупването инвалидите * /

T3CONbits.TSIDL = 0; / * Продължи в свободен режим * /

T3CON = 0x00; / / спира Timer2 и нулиране контрол рег..

TMR3 = 0x00; / / Ясно съдържанието на таймера регистър

PR3 = 0xFFFF; / / Заредете Период регистър със стойността 0xFFFF

/ / IPC0bits.T2IP = 0x01; / / Настройка Timer2 прекъсне за желания приоритет leve

/ / (Този пример задава ниво на приоритет 1)

IFS0bits.T3IF = 0; / / Изчистване на Timer1 прекъсне статус флаг

IEC0bits.T3IE = 1; / / Разрешаване Timer1 прекъсва

T3CONbits.TON = 1; / / Старт Timer1 с prescaler настройки по 1:1 и

/ / часовник източник, определени за вътрешната инструкция цикъл

)/ * Пример код за Timer1 ISR * /

недействителни __attribute__ ((__interrupt__, __shadow__)) _T3Interrupt (недействителни)

(

/ * Прекъсване служба рутинна код се поставя тук * /

IFS0bits.T3IF = 0; / / Нулиране Timer1 прекъсне флаг и връщане от ISR

)

 
промяна изгради режим в mplab от освобождаването ТРАСИРАНЕ.в новите версии е налице падащото меню в центъра на горната лента с инструменти.при по-възрастни mplab, което трябва да намерим някои изгради възможности и ги промените да "изгради за ICD2".ICD2 използва първия 80b на RAM, затова не можете да видите променливи, които са поставени там.видите по-долу на екрана (MPLAB V8)<img src="http://images29.fotosik.pl/170/17e2659caf0345cam.gif" border="0" alt=""/> Вие трябва да изгради в ТРАСИРАНЕ готовност за отстраняване на грешки,
както и до освобождаване на готовност за самостоятелна работа (окончателно код тест без дебъгер
и т.н.)

Вие трябва да се информират директно Linker, че използвате icd2, така че тя ще сложи си по-горе променливи ICD2 ограничен кръг (0x800 - 0x850).

резултатите не са в Hex, те са просто integers.Можете да го вид кастинг да конвертирате ги плаваща точка.

Код:плувка var_float;

INT var_int;var_int = 1234;

var_float = (запас) var_int;

 
Благодаря отново за всички ваши съвети и ми екрана изстрел ...Аз ще опитам да се провери ми кодиране грешка сте споменати.

Направих го в трасирате режим ...но аз разбирам DONT ...Как мога да кажа на linker директно като сте споменати в отговор?

haha ...те ..Аз ще опитам по математика операция видите как тя отива =)

 
с "директно" Имам предвид променящите тази област да ТРАСИРАНЕ [;, там е и косвен начин - трябва да посочите фиктивно таблица променлива, и намерете го по адрес 0x800.It's размер трябва да бъде 80bytes (40 думи).Въпреки това преминаването към изграждане на готовност ТРАСИРАНЕ е умен [;

потвърдите адреса на вашия променливи - при използване ICD2 променлива не трябва да се намират по-долу адрес 0x850

0x41 0x56 0x45!

 
Благодаря отново ...

Аз, за да управлявате вече =) Направих всичко в цялото ...предизвика точността ниво аз не му nneed че високите ... така че скалата си чета ...

Все пак ми дебъгер все още показват resreicted памет ...сега аз употреба MPLAB СИМ ...и гледайте го гледате през прозореца ...

Мерси много =)

 
Здравейте аз имам проблем с входа улавяне модул вашите мнения, но не ми помогне.на прекъсва не работят.Това е част от код, който не важи:

недействителни CONFIGcapture (нищожна) (
CloseCapture2 ();
неподписан INT configIC2 = IC_DLE_STOP & IC_TIMER3_SRC & IC_INT_1CAPTURE & IC_EVERY_EDGE;
OpenCapture2 (configIC2);
)

недействителни CONFIGtimers (нищожна) (
неподписан INT configT3 = T3_OFF & T3_IDLE_CON & T3_GATE_OFF &
T3_PS_1_64 & T3_SOURCE_INT;
)

INT недействителни (основна) (
CONFIGcapture ();
CONFIGtimers ();
TRISDbits.TRISD9 = 1;
докато (1) (

)
върнете 1;
)недействителни __attribute__ ((__interrupt__)) _IC2Interrupt (нищожна) (
IFS0bits.IC2IF = 0;
putsUART1 ( "Прекъсване");
)Проблемът е, че "Прекъсване" е само напишете първият път, това е така, не съществува една прекъсне
и не мога да разбера защо.някаква идея?

благодаряДобавени са след 1 минута:Съжалявам, че забравих, пуснати на функцията CONFIGtimer този ред:

OpenTimer3 (configT3, 0xffff);

Благодаря ви отновоДобавени след 59 секунди:T3CONbits.TON = 1;

 

Welcome to EDABoard.com

Sponsor

Back
Top