PIC JAL IO Routine

Music Out

by Vasile Surducan

HI Jallians,

Here is ' first release' of my library for playing music with hardware PWM from 877. Fell free and happy to use it in your projects. 877 must be clocked at 4MHz, only two octave are included here. I'm working now for variable notes length ( 1, 1/2, 1/4, 1/8, 1/16 ) Some simple ideas are welcome !

Wouter, playing with banks in JAL is painful ! Help us, although we  gone die...

-- libraries

include f877_04
include jpicm   -- a modified jpic library for 877 registers
include jdelay

-- config pins

-- var bit pwm1 is pin_c2
-- pin_c2_direction = output

-- procedure tempo ( byte in flow ) is
 var byte lenght = 10
 var byte pause
 pause = lenght / 2
-- end procedure

procedure frequency ( byte in period, byte in prescale ) is
asm movf  period, w
 bank_1
asm movwf f877_pr2
 bank_0
  f877_ccpr1l = period / 2       -- set duty cycle at approx 0.5
  pin_c2_direction = output     -- output the waves

   if prescale == 16 then
     f877_t2con = 0b_0000_0110   -- tmr2 on, prescale=16
   elsif prescale == 4 then                            
     f877_t2con = 0b_0000_0101   -- tmr2 on, prescale=4
   elsif prescale == 1 then
     f877_t2con = 0b_0000_0100   -- tmr2 on, prescale=1
   end if

  f877_ccp1con = 0b_0000_1100    -- pwm mode on
end procedure


procedure stop is
 delay_100mS ( lenght )
 f877_ccp1con = 0             -- PWM off
 delay_100ms ( pause )
end procedure
 
procedure DO1  is frequency ( 238, 16 ) stop end procedure

procedure REb1 is frequency ( 224, 16 ) stop end procedure

procedure RE1  is frequency ( 212, 16 ) stop end procedure

procedure MIb1 is frequency ( 200, 16 ) stop end procedure

procedure MI1  is frequency ( 189, 16 ) stop end procedure

procedure FA1  is frequency ( 178, 16 ) stop end procedure

procedure FAd1 is frequency ( 168, 16 ) stop end procedure

procedure SOL1 is frequency ( 158, 16 ) stop end procedure

procedure LAb1 is frequency ( 149, 16 ) stop end procedure

procedure LA1  is frequency ( 141, 16 ) stop end procedure

procedure SIb1 is frequency ( 133, 16 ) stop end procedure

procedure SI1  is frequency ( 126, 16 ) stop end procedure

procedure DO2  is frequency ( 118, 16 ) stop end procedure

procedure REb2 is frequency ( 112, 16 ) stop end procedure

procedure RE2  is frequency ( 105, 16 ) stop end procedure

procedure MIb2 is frequency (  99, 16 ) stop end procedure

procedure MI2  is frequency (  94, 16 ) stop end procedure

procedure FA2  is frequency (  88, 16 ) stop end procedure

procedure FAd2 is frequency (  83, 16 ) stop end procedure

procedure SOL2 is frequency (  79, 16 ) stop end procedure

procedure LAb2 is frequency (  74, 16 ) stop end procedure

procedure LA2  is frequency (  70, 16 ) stop end procedure

procedure SIb2 is frequency (  66, 16 ) stop end procedure

procedure SI2  is frequency ( 252,  4 ) stop end procedure

procedure DO3  is frequency ( 238,  4 ) stop end procedure


-- main program


forever loop

 DO1 REb1 RE1 MIb1 MI1 FA1 FAd1 SOL1 LAb1 LA1 SIb1 SI1 DO2
 delay_1S ( 3 )

 DO1 RE1 MI1 FA1 SOL1 LA1 SI1 DO2
 delay_1S ( 3 )

 DO2 RE2 MI2 FA2 SOL2 LA2 SI2 DO3
 delay_1S ( 3 )

 DO1 MI1 SOL1 DO2  DO2 SOL1 MI1 DO1
 DO2 MI2 SOL2 DO3  DO3 SOL2 MI2 DO2
 delay_1S ( 3 )

end loop