Помогите разобраться в чём проблема.
DSPic 30f2011
Суть программы заключается в следующем: pic ожидает прихода определенного байта на UART, и запускает или останавливает подпрограмму генерирования синуса или устанавливает один из выводов порта С или В в единицу. Прием байтов с UART происходит по прерыванию. Проверка поступившего байта на соответсвие происходит в обработчике прерывания.
Проблема заключается в следующем: почемуто не вызывается (срабатывает) прерывание, а значит не выполняются требуемые действия.
Проверка:
1. На входной порт UART поступают отсылаемые с компьютера байты (проверялось осциллографом), временные интервалы соблюдатся, ошибок в искажении бит не происходит (проверялось соответсвующими битами в регистрах UART).
2. pic запускается и основная программа работает
3. Что удивительно.... таже самая программа, но только с добавлением другой функции (чтения с АЦП (которая тоже запускается после того как пришел соответсвующий байт на UART)) работает на УРА!!! Прием и отправка байт происходит так же без проблем.
Текст программы:
Код
Код:
//Program UART
#include "p30fxxxx.h"
#include <libpic30.h>
#include <uart.h>
#include <timer.h>
#include "math.h"
#define AddressSensor 0x00;
_FOSC(0xFFE3);
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PWRT_OFF);
_FGS(CODE_PROT_OFF);
_FICD(ICS_PGD);
const unsigned char AddressUnit=AddressSensor;
const unsigned char AddressChannal1=0x24;
const unsigned char AddressChannal2=0x25;
const unsigned char AddressChannal3=0x26;
const unsigned char AddressChannal4=0x27;
//For UART
char Test485[]={0x04,'\0'};
//For ADC
float MasSin[151];
unsigned char Start=0x00;
void TransData (unsigned int *buffer) //Send data by UART
{
//unsigned int i;
PORTDbits.RD0=1;
putsUART1 (buffer);
while(BusyUART1());
PORTDbits.RD0=0;
}
void __attribute__((__interrupt__,auto_psv)) _U1RXInterrupt(void)
{
unsigned char InRx;
unsigned char i;
IFS0bits.U1RXIF = 0;
TransData((unsigned int *)Test485);
while(DataRdyUART1())
{
InRx=ReadUART1();
i=InRx&0b11111100;
switch (i)
{
case 0x00:
i=InRx&0x03;
switch (i)
{
case 0x02: //Test net
TransData((unsigned int *)Test485);
break;
};
break;
case 0x24:
PORTCbits.RC13=1;
PORTCbits.RC14=0;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
break;
case 0x25:
PORTCbits.RC13=0;
PORTCbits.RC14=1;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
break;
case 0x26:
PORTCbits.RC13=0;
PORTCbits.RC14=0;
PORTBbits.RB6=1;
PORTBbits.RB7=0;
break;
case 0x27:
PORTCbits.RC13=1;
PORTCbits.RC14=0;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
break;
default:
if (i>=0x80)
{
i=InRx&0x0F;
switch (i)
{
case 0x00: //Start
Start=0x01;
break;
case 0x01: //Stop
Start=0x00;
break;
};
};
break;
};
};
}
//Set UART
void InitUART()
{
// Holds the value of baud register
unsigned int baudvalue;
// Holds the value of uart config reg
unsigned int U1MODEvalue;
// Holds the information regarding uart TX & RX interrupt modes
unsigned int U1STAvalue;
// Turn off UART1module
CloseUART1();
// Configure uart1 receive and transmit interrupt
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &
UART_TX_INT_DIS & UART_TX_INT_PR2);
// Configure UART1 module to transmit 8 bit data with one stopbit. Also Enable loopback mode
baudvalue = 194;
U1MODEvalue = UART_EN & UART_IDLE_CON &
UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_EN_ABAUD & UART_NO_PAR_8BIT &
UART_1STOPBIT & 0xFBE7;
U1STAvalue = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE & UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}
void CreateSin ()
{
double sindata;
unsigned char f;
float fd;
float t;
unsigned int i;
f=72;
fd=150;
t=0;
for (i=0;i<150;i++)
{
sindata=5*(sin(((2*3,114)*f)*t));
if (sindata<0)
MasSin[i]=floor(0x7ff+((sindata*0x7ff)/0x05))+0x800;
else
MasSin[i]=floor((sindata*0x7ff)/0x05);
t=t+((2*3,14)/fd);
};
}
int main()
{
OSCCON=0xff34;
//For UART
TRISDbits.TRISD0=0;
PORTDbits.RD0=0;
//For DAC
TRISCbits.TRISC15=0; //SCLK
TRISBbits.TRISB3=0; //SDIN
TRISBbits.TRISB2=0; //#SYNC
PORTCbits.RC15=0;
PORTBbits.RB3=0;
PORTBbits.RB2=1;
//For Channal
TRISCbits.TRISC13=0;
PORTCbits.RC13=0;
TRISCbits.TRISC14=0;
PORTCbits.RC14=0;
TRISBbits.TRISB6=0;
PORTBbits.RB6=0;
TRISBbits.TRISB7=0;
PORTBbits.RB7=0;
//For UART
InitUART();
Test485[0]='%';
unsigned int i=0x0000;
//For DAC
CreateSin();
unsigned int DACdata;
int j;
while(1)
{
if (Start==0x01)
{
DACdata=MasSin[j];
PORTBbits.RB2=0;
for (i=0x00;i<0x10;i++)
{
PORTCbits.RC15=1;
PORTBbits.RB3=(DACdata/0x8000)%0x02;
PORTCbits.RC15=0;
DACdata=DACdata*0x02;
};
PORTBbits.RB2=1;
for (i=0;i<1300;i++);
j=j+1;
if (j==150)
j=0;
};
};
CloseUART1();
return 0;
}
//Program UART
#include "p30fxxxx.h"
#include <libpic30.h>
#include <uart.h>
#include <timer.h>
#include "math.h"
#define AddressSensor 0x00;
_FOSC(0xFFE3);
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PWRT_OFF);
_FGS(CODE_PROT_OFF);
_FICD(ICS_PGD);
const unsigned char AddressUnit=AddressSensor;
const unsigned char AddressChannal1=0x24;
const unsigned char AddressChannal2=0x25;
const unsigned char AddressChannal3=0x26;
const unsigned char AddressChannal4=0x27;
//For UART
char Test485[]={0x04,'\0'};
//For ADC
float MasSin[151];
unsigned char Start=0x00;
void TransData (unsigned int *buffer) //Send data by UART
{
//unsigned int i;
PORTDbits.RD0=1;
putsUART1 (buffer);
while(BusyUART1());
PORTDbits.RD0=0;
}
void __attribute__((__interrupt__,auto_psv)) _U1RXInterrupt(void)
{
unsigned char InRx;
unsigned char i;
IFS0bits.U1RXIF = 0;
TransData((unsigned int *)Test485);
while(DataRdyUART1())
{
InRx=ReadUART1();
i=InRx&0b11111100;
switch (i)
{
case 0x00:
i=InRx&0x03;
switch (i)
{
case 0x02: //Test net
TransData((unsigned int *)Test485);
break;
};
break;
case 0x24:
PORTCbits.RC13=1;
PORTCbits.RC14=0;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
break;
case 0x25:
PORTCbits.RC13=0;
PORTCbits.RC14=1;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
break;
case 0x26:
PORTCbits.RC13=0;
PORTCbits.RC14=0;
PORTBbits.RB6=1;
PORTBbits.RB7=0;
break;
case 0x27:
PORTCbits.RC13=1;
PORTCbits.RC14=0;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
break;
default:
if (i>=0x80)
{
i=InRx&0x0F;
switch (i)
{
case 0x00: //Start
Start=0x01;
break;
case 0x01: //Stop
Start=0x00;
break;
};
};
break;
};
};
}
//Set UART
void InitUART()
{
// Holds the value of baud register
unsigned int baudvalue;
// Holds the value of uart config reg
unsigned int U1MODEvalue;
// Holds the information regarding uart TX & RX interrupt modes
unsigned int U1STAvalue;
// Turn off UART1module
CloseUART1();
// Configure uart1 receive and transmit interrupt
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &
UART_TX_INT_DIS & UART_TX_INT_PR2);
// Configure UART1 module to transmit 8 bit data with one stopbit. Also Enable loopback mode
baudvalue = 194;
U1MODEvalue = UART_EN & UART_IDLE_CON &
UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_EN_ABAUD & UART_NO_PAR_8BIT &
UART_1STOPBIT & 0xFBE7;
U1STAvalue = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE & UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}
void CreateSin ()
{
double sindata;
unsigned char f;
float fd;
float t;
unsigned int i;
f=72;
fd=150;
t=0;
for (i=0;i<150;i++)
{
sindata=5*(sin(((2*3,114)*f)*t));
if (sindata<0)
MasSin[i]=floor(0x7ff+((sindata*0x7ff)/0x05))+0x800;
else
MasSin[i]=floor((sindata*0x7ff)/0x05);
t=t+((2*3,14)/fd);
};
}
int main()
{
OSCCON=0xff34;
//For UART
TRISDbits.TRISD0=0;
PORTDbits.RD0=0;
//For DAC
TRISCbits.TRISC15=0; //SCLK
TRISBbits.TRISB3=0; //SDIN
TRISBbits.TRISB2=0; //#SYNC
PORTCbits.RC15=0;
PORTBbits.RB3=0;
PORTBbits.RB2=1;
//For Channal
TRISCbits.TRISC13=0;
PORTCbits.RC13=0;
TRISCbits.TRISC14=0;
PORTCbits.RC14=0;
TRISBbits.TRISB6=0;
PORTBbits.RB6=0;
TRISBbits.TRISB7=0;
PORTBbits.RB7=0;
//For UART
InitUART();
Test485[0]='%';
unsigned int i=0x0000;
//For DAC
CreateSin();
unsigned int DACdata;
int j;
while(1)
{
if (Start==0x01)
{
DACdata=MasSin[j];
PORTBbits.RB2=0;
for (i=0x00;i<0x10;i++)
{
PORTCbits.RC15=1;
PORTBbits.RB3=(DACdata/0x8000)%0x02;
PORTCbits.RC15=0;
DACdata=DACdata*0x02;
};
PORTBbits.RB2=1;
for (i=0;i<1300;i++);
j=j+1;
if (j==150)
j=0;
};
};
CloseUART1();
return 0;
}