; WRITTEN BY: TOM SCARFF ; DATE: 18/5/2004 ; ITERATION: 1.0 ; FILE SAVED AS: cv2midi.ASM ; FOR: PIC16F877 ; CLOCK: 4.00 MHz CRYSTAL ; INSTRUCTION CLOCK: 1.00 MHz T= luS ; PROGRAMME FUNCTION: cv to midi list p=16F877 ; tells the assembler which PIC #include "p16F877.inc" ; general register file __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. #DEFINE PAGE0 BCF 3,5 #DEFINE PAGE1 BSF 3,5 ;******************************** ; Constant Assignments ;******************************** ;******************************** ; Variable Assignment Addresses ;***t**************************** ; 20h Start of General purpose registers AD_DATA EQU 21h midich equ 22h note equ 25h val1 equ 26h val2 equ 27h value1 equ 28h ; 7fh end of data area ;************************************ ; PROGRAMME Reset Point ;************************************ org 00 ; reset vector goto init ;********************************************* ; Start A/D conversion Subroutine ;********************************************* convert bsf ADCON0,2 ;set GO/DONE Bit btfsc ADCON0,2 goto $-1 rrf ADRESH,W andlw 07Fh movwf AD_DATA return ;****************************************** ; transmission complete subroutine ;***************+************************** txchar bsf STATUS,RP0 btfss TXSTA,1 ; test for end of transmission goto $-1 bcf STATUS,RP0 return ;*********************************#*** ; Output MIDI note-on data ;************************************** noteon movf midich,W addlw 090h ; note-on ch. from midich movwf TXREG ; send chazacter from W call txchar movf note,W movwf TXREG ; send character from W call txchar movlw .64 movwf TXREG ; send character from W call txchar return ;*********************************#*** ; Output MIDI note-off data ;************************************** noteoff movf midich,W addlw 080h ; note-off ch. from midich movwf TXREG ; send chazacter from W call txchar movf note,W movwf TXREG ; send character from W call txchar movlw .64 movwf TXREG ; send character from W call txchar return ;*********************************************** ; initalise software ;*********************************************** init bcf STATUS,RP0 ;page 0 clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE PAGE1 movlw 0FFh movwf TRISB ;all pins inputs movwf TRISA ;all inputs movlw 0Eh movwf ADCON1 ; Set porta AN0 as analogue I/P's movwf TRISD ;all inputs movlw 07h movwf TRISE PAGE0 ; Set up USART PAGE1 bsf STATUS,RP0 ; goto page 1 movlw b'10001111' ; RC7 is RX input movwf TRISC movlw 01h ; 31250 baud for MIDI movwf SPBRG movlw b'00100000' ; async tx 8 bit movwf TXSTA bcf STATUS,RP0 ; return to page 0 movlw b'10010000' ; async rx 8 bit movwf RCSTA bsf STATUS,RP0 ; enable weak pull-up resistors movlw 07h ; rtcc/256 movwf OPTION_REG bcf STATUS,RP0 movfw PORTC andlw 0Fh movwf midich goto main ;************************************************************** main btfsc PORTC,7 goto main ch0 movlw B'01000001' ; channel 0 movwf ADCON0 call convert movfw AD_DATA addlw .24 ; shift up two octaves movwf note call noteon btfss PORTC,7 goto $-1 call noteoff goto main end ;================================================================