お気楽オーディオキット資料館 2801013


ソースコード公開について

1: kobayashi :

2014/10/01 (Wed) 23:26:46

話題がずれてきているようなので新しいスレッドをたてます。

> PICのH/Wを制御する都合上、おそらくほとんどのCコンパイラが特殊な関数群をもっているはずです。
とのことですが、ccscではレジスタを書き換えるには関数を使っているようです。
対して、純正コンパイラは、変数の書き換えになっているようです。


ccsc set_tris_a(0b00000000);
純正 TRISA = 0b00000000;

どちらにしてもソースコードを見てみないとわからないので、
公開してください。お願いします。
2:ヒロ :

2014/10/02 (Thu) 05:29:06

こんな感じです。

//
// DAC179X-2.1 for DUAL PCM1792/1795/1796
//
// (c)OKIRAKU AUDIO / 2014-Sep
//
// version 1.0 simple use
// 2.0 use with USB-AUDIO for electro-art
// USB-AUDIO connection Pin6 of P6 into DSD PORT in case of SPD1=SPD0=L
//

#include "16F819.H"
#device ADC=10
#fuses INTRC_IO,NOWDT,PROTECT, NOMCLR,NOBROWNOUT,NOLVP,PUT
#use delay(internal=8MHz)
#include "math.h"

#use fast_io(A)
#use fast_io(B)

// PCB PIN definition
//

// INPUT SELECT
#define IN_DSD PIN_B0
#define IN_PCM PIN_B1
#define IN_SPDIF1 PIN_B2
#define IN_SPDIF0 PIN_B3

#define NOCHANGE (0)
#define DSD_SELECT (1)
#define PCM_SELECT (2)
#define SPDIF0_SELECT (3)
#define SPDIF1_SELECT (4)

// JUMPER SETTING
#define JP3 PIN_B7
#define JP4 PIN_B6
#define JP5 PIN_B5

#define NOFORMAT (0)
#define I2S (1)
#define LEFTJ (2)
#define RIGHTJ16 (3)
#define RIGHTJ24 (4)

// JP3,JP4 PCM FORMAT
// JP3=H JP4=H I2S
// JP3=L JP4=H LEFTJ
// JP3=H JP4=L RRIGHJ16
// JP3=L JP4=L RIGHTJ24
//

#define SHARPROLL (0)
#define SLOWROLL (1)

// JP5 DIGITAL FILTER
// JP5=H SHARP ROLL OFF
// JP5=L SLOW ROLL OFF
//

// Internal connection define
//

#define PCM_SEL PIN_A3
#define SPDIF_SEL PIN_A4
#define DSD_SEL PIN_A2

#define I2C_SCL PIN_A6
#define I2C_SDA PIN_A7
#define CS_RST PIN_B4
#define PCM_RST PIN_A1

// I2C ADRS definition
#define I2C_CS 0x20 // CS8416
#define PCM_L 0x98 // PCM L channel
#define PCM_R 0x9a // PCM R channel

#include "i2c.c"

// GLOBAL

int InputSelect;


// E-VOL variables
int UP_DOWN; // E-VOL direction 1:UP 0:Down
int16 CurrentEvolAD; // 0 to 1023
int CurrentATT; // 0 to 255

// A/D interface subroutines for PIC

int16 get_ad(){
int1 done; int16 value;
read_adc(ADC_START_ONLY); done = adc_done();
while(!done) done=adc_done();
value=read_adc(ADC_READ_ONLY); return(value);
}

int16 get_ad16(int ch){
int16 v; int i;
set_adc_channel(ch); // select Volume
delay_us(50);
v=0; for(i=0;i<16;i++) v+=get_ad();
v= v >> 4;
return(v);
}

TranslateVol(){
int16 n;
n=CurrentEvolAD;
if(n<=4){CurrentATT = 14;return;}
if(n<=102){n*=80;n/=78;n+=10; CurrentATT=(n&0xff);return;}
if(n<=514){n/=5;n+=85; CurrentATT=(n&0xff);return;}
n-=515; n*=6; n/=45; n+=188; CurrentATT=(n&0xff);return;
}

int GetVolume(){
int16 v,n; int8 i;

v=get_ad16(0);
if(v==CurrentEvolAD) return(0);
if(UP_DOWN){ // UP MODE
if(v > CurrentEvolAD) CurrentEvolAD = v;
else if((v+1) < CurrentEvolAD){ CurrentEvolAD = v; UP_DOWN = 0;}
} else { // DOWN MODE
if(v < CurrentEvolAD) CurrentEvolAD = v;
if(v > (CurrentEvolAD+1)){ CurrentEvolAD = v; UP_DOWN = 1;}
}
return(1);
}

// CS8416 setting subroutines
void cs8416out(int ch,n) {i2c_dataout(I2C_CS,ch,n);} // command out

void cs8416_init() // initialize
{ int i;
cs8416out(0x00,0x00); cs8416out(0x01,0x00);
cs8416out(0x02,0x0b); cs8416out(0x03,0xb0);
cs8416out(0x04,0x98); cs8416out(0x05,0x88); //Right justified 24bit
cs8416out(0x06,0x7f);
}

void cs8416_sel(int ch) // channel selection
{
int i,j,k;
ch &= 7; j=ch; j= j << 3; j &= 0b00111000; j |= ch;
k=i=i2c_datain(I2C_CS,0x04);
i &= 0xc0; i |= j;
if(k!=i) cs8416out(0x04,i); // run and input select
}

// I/O PORT input/output definition
io_select()
{
output_drive(I2C_SCL); output_high(I2C_SCL); output_float(I2C_SDA);
port_b_pullups(0xff);
output_high(PCM_SEL); output_drive(PCM_SEL);
output_high(SPDIF_SEL); output_drive(SPDIF_SEL);
output_high(DSD_SEL); output_drive(DSD_SEL);
output_low(CS_RST); output_drive(CS_RST); // CS8416 RESET
output_low(PCM_RST); output_drive(PCM_RST); // PCM179X RESET
output_float(JP3);
output_float(JP4);
output_float(JP5);
output_float(IN_DSD);
output_float(IN_PCM);
output_float(IN_SPDIF0);
output_float(IN_SPDIF1);
setup_adc(ADC_CLOCK_DIV_32); setup_adc_ports(AN0); // ADC OPEN
}

// status of Input select and jumper

int InputStatus()
{
int i;

i=NOCHANGE;
if(input(IN_DSD)==0) i=DSD_SELECT;
if(input(IN_PCM)==0) i=PCM_SELECT;
if(input(IN_SPDIF1)==0) i=SPDIF1_SELECT;
if(input(IN_SPDIF0)==0) i=SPDIF0_SELECT;
return(i);
}

int InputStatusUSB()
{
int i;

i=NOCHANGE;
if(input(IN_PCM)==0){
if(input(IN_DSD)) i=DSD_SELECT;
else i=PCM_SELECT;
}
else i=SPDIF0_SELECT;
return(i);
}

int FormatStatus()
{
int i,i3,i4;

i3=input(JP3);
i4=input(JP4);
if(i3 && i4 ) i=I2S; // I2S
if(i3==0 && i4 ) i=LEFTJ; // LJ
if(i3 && i4==0 ) i=RIGHTJ16; // RJ16
if(i3==0 && i4==0 ) i=RIGHTJ24; // RJ24
return(i);
}

int FilterStatus()

{
int i;
if(input(JP5)) i=SHARPROLL; // SHARP
else i=SLOWROLL;
return(i);
}

main()
{
int InputSelect;
int FilterSelect;
int FormatSelect;
int usbdac;

int i,f;

io_select(); // IO initialize
delay_ms(500); // wait power up
output_high(CS_RST); // resset inactive
output_high(PCM_RST);
delay_ms(100); // wait
cs8416_init(); // cs8416 initialize
UP_DOWN=1;
CurrentEvolAD=0;
CurrentATT=0;

// initial settting
// INPUT:SPDIF0, RJ24, SHARP ROLLOFF, VOL=0(MUTE)
output_high(DSD_SEL);
output_high(PCM_SEL);
output_low(SPDIF_SEL);
delay_ms(20);
cs8416_sel(0); // default select ch.0
i2c_dataout(PCM_L,18,0xa0); // RJ24
i2c_dataout(PCM_L,19,0x00); // SHARP ROLL OFF
i2c_dataout(PCM_L,20,0x08); // PCM MONO L
i2c_dataout(PCM_L,21,0x01); // NORMAL RUN

i2c_dataout(PCM_R,18,0xa0); // RJ24
i2c_dataout(PCM_R,19,0x00); // SHARP ROLL OFF
i2c_dataout(PCM_R,20,0x0c); // PCM MONO R
i2c_dataout(PCM_R,21,0x01); // NORMAL RUN

i2c_dataout(PCM_L,16,0); // initial MUTE
i2c_dataout(PCM_R,16,0);
i2c_dataout(PCM_L,17,0);
i2c_dataout(PCM_R,17,0);

InputSelect=SPDIF0_SELECT;
FilterSelect=SHARPROLL;
FormatSelect=RIGHTJ24;
usbdac=0;

if(input(IN_SPDIF0)==0 && input(IN_SPDIF1)==1) usbdac=1; // ELECTRO-ART USB AUDIO ACTIVE

while(1){
if(usbdac) i=InputStatusUSB(); else i=InputStatus();
if((i!=NOCHANGE) && i!=InputSelect){
switch(i){
case DSD_SELECT:
output_high(SPDIF_SEL);
output_high(PCM_SEL);
output_low(DSD_SEL);
delay_ms(20);
i2c_dataout(PCM_L,20,0x28);
i2c_dataout(PCM_R,20,0x2c);
InputSelect=i;
break;
case PCM_SELECT:
output_high(DSD_SEL);
output_high(SPDIF_SEL);
output_low(PCM_SEL);
delay_ms(20);
if(InputSelect==DSD_SELECT){
i2c_dataout(PCM_L,20,0x08);
i2c_dataout(PCM_R,20,0x0c);
}
InputSelect=i;
break;
case SPDIF1_SELECT:
case SPDIF0_SELECT:
output_high(DSD_SEL);
output_high(PCM_SEL);
output_low(SPDIF_SEL);
delay_ms(20);
if(InputSelect==DSD_SELECT){
i2c_dataout(PCM_L,20,0x08);
i2c_dataout(PCM_R,20,0x0c);
}
if(i==SPDIF0_SELECT) cs8416_sel(0); else cs8416_sel(1);
InputSelect=i;
f=0xa0; // RJ24
i2c_dataout(PCM_L,18,f);
i2c_dataout(PCM_R,18,f);
FormatSelect=RIGHTJ24;
break;
default:break;
}
}
i=FormatStatus();
if((i!=FormatSelect)&&(InputSelect==PCM_SELECT)){
switch(i){
case I2S: f=0xd0; break; // I2S
case LEFTJ: f=0xb0; break; // LJ
case RIGHTJ16: f=0x80; break; // RJ16
case RIGHTJ24: f=0xa0; break; // RJ24
default:break;
}
i2c_dataout(PCM_L,18,f);
i2c_dataout(PCM_R,18,f);
FormatSelect=i;
}
i=FilterStatus();
if((i!=FilterSelect)&&(InputSelect!=DSD_SELECT)){
if(i==SHARPROLL){
i2c_dataout(PCM_L,19,0x00);
i2c_dataout(PCM_R,19,0x00);
}
else {
i2c_dataout(PCM_L,19,0x02);
i2c_dataout(PCM_R,19,0x02);
}
FilterSelect=i;
}

i=GetVolume();
if(i){
i=CurrentATT;
TranslateVol();
if(i!=CurrentATT){
i= CurrentATT;
i2c_dataout(PCM_L,16,i);
i2c_dataout(PCM_R,16,i);
i2c_dataout(PCM_L,17,i);
i2c_dataout(PCM_R,17,i);
}
}
}
}
3: kobayashi :

2014/10/02 (Thu) 20:26:31

ほぼ、理解できました。
なんとかなるとおもいますよ。
4: kobayashi :

2014/10/03 (Fri) 18:31:06

port_b_pullups(0xff);
これでよいのでしょうか?

port_b_pullups(TRUE);
のような気がするのですが

> 人の書いたプログラムって癖があって読みにくいんですよね~
そんなことないですよ。 わかりやすいほうです。

5:ヒロ :

2014/10/03 (Fri) 23:59:12

大丈夫です。個別プルアップの場合もあるので。

  • 名前: E-mail(省略可):
  • 画像:

Copyright © 1999- FC2, inc All Rights Reserved.