Pues no he tenido suerte hasta el momento... aqui dejo el programa que compila sin errores.. pero no hace lo q me gustaria que hiciese...
// Fitxers includes de microprocontrolador DSPIC i operadors Matemàtics
#include "p30f4012.h"
#include "math.h"
#include "pwm.h"
#include "uart.h"
#include "ports.h"
#include "libpic30.h"
#include "stdio.h"
#include "timer.h"
// ++++++++++++++++++++++++++++++++++ Definicions ++++++++++++++++++++++++++++++++++++++
int Buf[80];
int midi[80];
int * Receiveddata = Buf;
int f, MIDI, config, ignore, limite;
unsigned int timer_value, valor_a_comparar;
void tiempo(void);
void configUSARTmidi();
//+++++++++++++++++++++++++++++ Programació bits de control DSPIC++++++++++++++++++++++++++++++++++++++++++++++
_FOSC(CSW_FSCM_OFF & XT_PLL8); // clock extern x PLL x 8 = 10e+6*8/4 = 20 MHz
_FWDT(WDT_OFF); // Borra Watch-Dog Timer.
_FBORPOR(MCLR_EN & PWRT_OFF); // Habilita pin MCLR reset i apaga power-up timers.
_FGS(CODE_PROT_OFF); // Disabilita protecció de codi
/* ++++++++++++++++++++++++++++++++++Interrupció del Timer 1 ++++++++++++++++++++++++++++++++++ */
void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void)
{
limite = 1;
IFS0bits.T1IF = 0; // baixa la bandera de la interrupció
}
/* ++++++++++++++++++++++++++++++++++Interrupció de transmisió++++++++++++++++++++++++++++++++++ */
void __attribute__((__interrupt__, no_auto_psv)) _U1TXInterrupt(void)
{
IFS0bits.U1TXIF = 0;
}
/*++++++++++++++++++++++++++++++++++++ Interrepció de recepció++++++++++++++++++++++++++++++++++++++ */
void __attribute__((__interrupt__, no_auto_psv)) _U1RXInterrupt(void)
{
IFS0bits.U1RXIF = 0; //baixa la bandera d'aquesta interrupció
/*
WriteTimer1(0x0);
OpenTimer1(T1_ON
& T1_GATE_OFF
& T1_PS_1_1
& T1_IDLE_STOP
& T1_SYNC_EXT_OFF
& T1_SOURCE_INT // antes INt
, valor_a_comparar );
timer_value= ReadTimer1();*/
PORTBbits.RB5= 1;
* Receiveddata = Buf[0];
while( DataRdyUART1()) // condició a 1, mentres está rebent info
{
( *( Receiveddata)++) = ReadUART1(); // d'aquesta manera em guarda el 3 bytes junts
}
if (Buf[0]==254)
{
f=0;
}
else
{
f=1;
// Buf[0]=midi[0];
// Buf[1]=midi[1];
// Buf[2]=midi[2];
}
/* timer_value= ReadTimer1();
if (timer_value<=0xFA) //FA
{
f=0;
Buf[0]=0;
PORTBbits.RB4= 1;
}
else
{
f=1;
PORTBbits.RB0= 1;
}
*/
}
// +++++++++++++++++++++++++++++++++++++configuració modul UART per a MIDI+++++++++++++++++++++++++++++++
void configUSARTmidi() // cridarla en el main... o l'nterrupció
{
unsigned int baudios, U1MODEvalue, U1STAvalue;
ConfigIntUART1(UART_RX_INT_EN //RECEIVE INTERRUPT DISABLE
& UART_RX_INT_PR2 //RECEIVE INTERRUPT PRIORITY
& UART_TX_INT_EN // TRANSMIT INTERRUPT DISABLE
& UART_TX_INT_PR6); // TRANSMIT INTERRUPT PRORITY
baudios = 39; //AL REGISTRO UBRG calculado por mi ; (41 antes)
U1MODEvalue = UART_EN // UART ENABLE
& UART_IDLE_STOP // MODO DE ESPERA
& UART_RX_TX // COMUNICACIO AMB RX I TX
& UART_DIS_WAKE // WAKE-UP ON START
& UART_DIS_LOOPBACK // LOOPBACK MODE.. originalemente en DIS
& UART_DIS_ABAUD // INPUT TO CAPTURE MODULE
& UART_NO_PAR_8BIT // PARIY AND DATA BITS SELECT
& UART_1STOPBIT; //NUMBER O STOP BITS
U1STAvalue = UART_INT_TX_BUF_EMPTY // TRANSMISION MODE INTERRUPT SELECT
& UART_TX_PIN_NORMAL // TRANSMIT BREAK BIT
& UART_TX_ENABLE // TRANSMIT ENABLE
& UART_INT_RX_BUF_FUL//UART_INT_RX_CHAR // RECEIVE INTERRUPT MODE SELECT
& UART_ADR_DETECT_DIS //ADDRESS DETECT
& UART_RX_OVERRUN_CLEAR; // OVERRUN BEAT CLEAR
OpenUART1(U1MODEvalue, U1STAvalue, baudios);
//PORTBbits.RB3= 1;
}
//PROGRAMA PRINCIPAL
int main(void)
{
// ++++++++++++++++++++++++++ PARA LA UART ++++++++++++++++++++++++++++++++++++++++++++++++++
ConfigIntUART1(UART_RX_INT_EN // RECEIVE INTERRUPT ENABLE
& UART_RX_INT_PR6 // RECEIVE INTERRUPT PRIORITY
& UART_TX_INT_EN // TRANSMIT INTERRUPT ENABLE
& UART_TX_INT_PR2); // TRANSMIT INTERRUPT PRIORITY
configUSARTmidi(); //configuració per escriure i llegir RS232
//+++++++++++++++++++++PARA EL TIMER+++++++++++++++++++++++++++++++++++++++++++++++++++++
/*valor_a_comparar=0xFFFF;
OpenTimer1(T1_ON
& T1_GATE_OFF
& T1_PS_1_1
& T1_IDLE_STOP
& T1_SYNC_EXT_OFF
& T1_SOURCE_INT // antes INt
, valor_a_comparar );
ConfigIntTimer1( T1_INT_PRIOR_3 & T1_INT_OFF); */
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TRISBbits.TRISB0 =0;
TRISBbits.TRISB1 =0;
TRISBbits.TRISB2 =0;
TRISBbits.TRISB3 =0;
TRISBbits.TRISB4 =0;
TRISBbits.TRISB5 =0;
// INICIALITZIÓ DE VARIABLES
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PORTBbits.RB0= 0;
PORTBbits.RB1= 0;
PORTBbits.RB2= 0;
PORTBbits.RB3= 0;
PORTBbits.RB4= 0;
PORTBbits.RB5= 0;
PORTBbits.RB0= 1;
Buf[0]=0;
// Buf[1]='0';
// Buf[2]='0';
while(1)
{
// PORTBbits.RB0= 1;
while (f==0)
{
PORTBbits.RB1= 1;
tiempo();
PORTBbits.RB1= 0;
}
// PORTBbits.RB2= 1;
if (Buf[0]==0)
{
PORTBbits.RB3= 1;
while (f==0);
}
if (Buf[0]==128) //note off
{
PORTBbits.RB2= 1;
while (f==0);
}
if (Buf[0]==144) //note on
{
PORTBbits.RB4= 1;
while (f==0);
}
} // BUCLE REPETITIU
} // FI MAIN
/*Funcion delay paraq tiempo*/
void tiempo(void){
int unsigned contador;
int unsigned cont;
for(cont=1;cont<20;cont++)
for(contador=1;contador<0xFFFF;contador++);
return;
}
a ver si encontrais el dichoso fallo, plis!!