Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 12.08.2011, 15:50   #1
Zlodei
Junior Member
 
Регистрация: 12.08.2011
Возраст: 33
Сообщений: 2
Вес репутации: 100/0
Zlodei will become famous soon enoughZlodei will become famous soon enough
По умолчанию Проблема с прерыванием от UART на ds pic 30f2011

День добрый!
Помогите разобраться в чём проблема.

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;
}
Zlodei вне форума   Ответить с цитированием
Старый 12.08.2011, 21:20   #2
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 67
Сообщений: 2,215
Вес репутации: 1898/80
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию А что такое

Код:
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 & UART_TX_INT_DIS & UART_TX_INT_PR2);
???
Bill вне форума   Ответить с цитированием
Старый 14.08.2011, 01:33   #3
syv
Guest
 
Сообщений: n/a
По умолчанию Re: Проблема с прерыванием от UART на ds pic 30f2011

Цитата:
Сообщение от Zlodei Посмотреть сообщение
Помогите разобраться в чём проблема.
Кто же так работает с прерываниями?
У Вас все неверно...
  Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
PIC32MX795 UART проблема с прерыванием HSA Продукция MICROCHIP 13 31.03.2011 14:30
подключение магнитолы Sergey1 Общетехнические вопросы 10 27.12.2007 22:39
Помогите, пожалуйста, найти ошибку в коде Катя Микроконтроллеры других производителей 26 08.12.2007 14:58
Проблема с Ethernet на PIC18F97J60 tom4ik85 Продукция MICROCHIP 23 03.09.2007 10:03


Часовой пояс GMT +3, время: 11:06.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot