
Code : Tout sélectionner
;*********************************Routine Interruprion************************************
;*****************************************************************************************
;***************sauvegarder registres*************
ORG 0x0004 ;adresse d'interruption
movwf WTmp ;sauver registre W
swapf STATUS,w ;swap status avec résultat dans w
movwf StatusTmp ;sauver status swappé
Bank0
;*************Midi Irq**************
btfsc PIR1,RCIE ;test Midi Irq: Irq Uart validée?
btfss PIR1,RCIF ;flag de l`Irq Uart positionné?
goto DinIrqTest ;non-> irq non de l`uart test autre Irq
movf RCREG,W ;buffer Rxd dans W
movf BufferMidi,w ;test midi clk: sauvegarder W dans BufferMidi
xorlw 0xF8 ;W XOR F8 (w=F8?)
btfsc STATUS,Z ;test si resultat nul (Z=1)
goto MidiClk ;si oui aller au traitement du Midi CLk
movf BufferMidi,W ;sinon envoyer la donnée reçue dans le midi: BufferMidi dans W
movwf TXREG ;envoyer W (W contient Midi) sur Txd
goto RestoreReg ;aller a fin Irq////////////////////////
.../....
;*************restaurer registres**************
RestoreReg swapf StatusTmp,w ;swap ancien status, résultat dans w
movwf STATUS ;restaurer status
swapf WTmp,f ;Inversion L&H de l'ancien W sans modifier Z
swapf WTmp,w ;Réinversion dans W. W restauré sans modif status
retfie ;return from interrupt
Code : Tout sélectionner
var
bDataReceived: boolean;
RxData: byte;
In_Filter_clock1: sbit at RA0_bit; // filter midi clock 1/2mes ($0XF8)
In_Filter_clock2: sbit at RA1_bit; // filter midi clock 1mes ($0XF8)
In_Filter_clock3: sbit at RA2_bit; // filter midi clock 2mes ($0XF8)
In_Filter_clock4: sbit at RA3_bit; // filter midi clock 4mes ($0XF8)
const
cMIDI_Note_On = $90; // Note On on channel 1
cMIDI_Note_Off = $80; // Note Off on channel 1
cMIDI_Note_On = $99; // Note On on channel 10
cMIDI_Note_Off = $89; // Note Off on channel 10
cMIDI_Pitch_base = $3C; // "base" pitch / note - fixed here at C3 (Do3)
cMIDI_Vel_On = $64; // velocity, 100 on the 0..127 scale
cMIDI_Vel_Off = $00; // velocity, value $00
cMIDI_controller = $B0; // controller on channel 1
cMIDI_Start = $0XFA; // clock start
cMIDI_Stop = $0XFC; // clock stop
cMIDI_continue = $0XFB; // clock continue
cMIDI_clock = $0XF8; // clock pulse
procedure Main_Init;
begin
CMCON := 7; // disable comparators
OPTION_REG := 0;
INTCON.GIE := 1; // |- enable interrupt
INTCON.PEIE := 1; // |
TRISA := %10111111;
TRISB := %00000010;
PORTA := 0; // clear porta
PORTB := 0; // clear portb
T1CON.T1CKPS1 := 1;
// init USART
//TXSTA.BRGH := 1; // high speed baud rate
TXSTA.SYNC := 0; // asynchronous mode
TXSTA.TX9 := 0; // 8-bits transmission
TXSTA.TXEN := 1; // Tx enabled
RCSTA.CREN := 1; // enable receiving / accept continuous mode
RCSTA.SPEN := 1; // Rx enabled;
RCSTA.RX9 := 0; // 8-bits transmission
PIE1.RCIE := 1; // enable interrupt for UART Rx
//PIR1.RCIF := 0; // RCIF is read-only, can't reset it directly
UART1_Init(31250); // speed for MIDI communication
end;
procedure Interrupt;
begin
if TestBit(PIR1, RCIF) then
begin
// always read RCREG register, even if event will be not used
RxData := RCREG;
// don't take account of note received during prog procedure
while (Rxdata = cMidi_clock)
{switch (clockspeed)
{
case 1: RxData = cMIDI_clock && In_Filter_clock1 RA0;
break;
case 2: RxData = cMIDI_clock && In_Filter_clock2 RA1;
break;
case 3: RxData = cMIDI_clock && In_Filter_clock3 RA2;
break;
case 4: RxData = cMIDI_clock && In_Filter_clock4 RA3;
break;
}
}
if TestBit(RCSTA, OERR) then
begin
ClearBit(RCSTA, CREN);
SetBit(RCSTA, CREN);
end;
//ClearBit(PIR1, RCIF); // RCIF is read-only, can't reset it directly
end;
end;
while (clockspeed case 1)
{
laisser passer data midi clock?
}
while (clockspeed case 2)
{
diviser par deux data midi clock?
}
while (clockspeed case 3)
{
diviser par 4 data midi clock?
}
while (clockspeed case 3)
{
diviser par 8 data midi clock?
}
