/* * File: main.c * Author: m.k * * Created on 2013/09/03, 17:00 * Debug on 2013/12/03 * * strawberry1602bを使用の時は * #define LCD_CONTRAST 0x2d //strawbeyy1602 * AQM0802(秋月)を使用の時は * #define LCD_CONTRAST 0x28 //AQM0802 * * */ #include #include #include #include "i2c-lib.h" #include "i2c-lcdlib-strawberry1602b.h" #include "TAS5711_lib.h" /* PIC Configuration */ #pragma config MCLRE = EXTMCLR //MCLR有効 #pragma config PBADEN = OFF //PORTB A/D Enable bit #pragma config PWRTEN = OFF //パワーアップ タイマ イネーブルビット OFF有効 #pragma config BOREN = ON //Brown-out Reset enabled #pragma config BORV = 285 //ブラウンアウト 電圧セット #pragma config WDTEN = OFF //WDT をWDTCON レジスタのSWDTEN ビットで制御する #pragma config WDTPS = 32768 //Watchdog Timer Postscale #pragma config STVREN = ON //Stack full/underflow will cause Reset #pragma config FOSC = INTIO67 //内部クロック クロックoutINTIO7 INTIO67 #pragma config PRICLKEN = OFF //Primary clock enable bit #pragma config PLLCFG = OFF //4X PLL Enable OFF #pragma config FCMEN = OFF //Fail-Safe Clock Monitor 外部osc監視 #pragma config IESO = OFF //内部/ 外部オシレータ切り換えビット #pragma config HFOFST = OFF //HFINTOSC 高速起動ビット #pragma config LVP = OFF //単電源ICSP プログラミング有効 #pragma config XINST = OFF //拡張命令セットを有効 #pragma config CP0 = OFF //コード保護ビット #pragma config CP1 = OFF //コード保護ビット #pragma config CPB = OFF //ブートブロックコード保護ビット #pragma config WRT0 = OFF //書込み保護ビット #pragma config WRT1 = OFF //書込み保護ビット #pragma config WRTB = OFF //ブートブロックコード書込み保護ビット #pragma config WRTC = OFF //コンフィグレーション゙レジスタ書込み保護ビット #pragma config EBTR0 = OFF //テーブル読みだし保護ビット #pragma config EBTR1 = OFF //テーブル読みだし保護ビット #pragma config EBTRB = OFF //ブートブロックテーブル読みだし保護ビット #ifndef _XTAL_FREQ /* 例:4MHzの場合、4000000 をセットする */ #define _XTAL_FREQ 4000000 #endif //#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) //#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) /********************************************** * bit割当て ***********************************************/ #define Volume_up PORTBbits.RB0 //音量アップ ビット設定 #define Volume_down PORTBbits.RB1 //音量ダウン ビット設定 #define PLL_UNLOCK PORTCbits.RC2 //WM8804 UNLOCK #define RC_LED0 LATCbits.LATC5 //LED ビット設定 #define RC_LED1 LATCbits.LATC6 //LED ビット設定 #define SYS_RESET LATCbits.LATC0 //RESET TAS5711 リセット #define PDN LATCbits.LATC1 //PDN T5AS5711 パワーダウン /* DELAY*/ extern void delay_10ms(unsigned char t); /* DELAY*/ extern void delay_100ms(unsigned char t); unsigned char data_flag; //送信データ有効 unsigned char VR_use; //VR有効 /* printf関数の出力先のスタブ関数を定義する */ void putch(unsigned char ch) { i2c_lcd_putch(ch); // if(flag_serial_enable) rs232c_putch(ch); return; } int main(int argc, char** argv) { union { //ch_data[0]=R_ch,ch_data[1]=L_ch unsigned char tx_data; unsigned char master_data; unsigned char ch_data[3]; } vr_data; unsigned char ATT_data; //ボリュームメインデータ unsigned char ad_data; unsigned char old_ad_data; //AD比較データ unsigned char i; // unsigned char power_flag; //電源投入 unsigned char temp_a; //表示用 unsigned char temp_b; //表示用 unsigned char buffer[10]; //表示用 //////////////////////////////////////////////// // TAS5711・激Wスタアドレス設定 //////////////////////////////////////////////// unsigned char TAS5711 = 0x36; unsigned char TW_WRITE = 0x00; unsigned char TW_READ = 0x01; unsigned char ClockControl = 0x00; unsigned char ErrorStatus = 0x02; unsigned char SystemControl1 = 0x03; unsigned char SerialDataInterface = 0x04; unsigned char SystemControl2 = 0x05; unsigned char SoftMute = 0x06; unsigned char MasterVolume = 0x07; unsigned char VolumeConfig = 0x1E; unsigned char OscillatorTrim = 0x1B; // 基本機能の設定 OSCCON = 0b01010010; // 内部オシレーター 4MHz OSCTUNE = 0x0; TRISA = 0b00000001; // IOポートRA0(AN0) TRISB = 0b11111111; //PortB bit0,1,2,3,4,5,6,7 入力 TRISC = 0b00011100; //PortC RC0.1,5,6,7出力 ANSELA = 0b00000001; //RA0 AN ANSELB = 0b00000000; //すべてデジタル ANSELC = 0b00000000; //すべてデジタル ADCON0 = 0b00000001; // AN0選択, A/D機能Enable ADCON1 = 0b00000000; //ADC ref = Vdd,Vss boven- en onderste venster ADCON2 = 0b00110001; //Left justify, Frc/8 , 20Tad //PORTA = 0; PORTB = 0x00; //PORTC = 0x00; INTCON2bits.RBPU = 0; //enable pull up WPUB = 0xFF; //WEAK PULL-UP PORTB REGISTER INTCONbits.PEIE = 0; // 割り込み機能をOFF (RX受信割り込みを使う場合) INTCONbits.GIE = 0; // 割り込み機能をOFF (RX受信割り込みを使う場合) ///////////////////////////////////////////////// // データ初期値 ///////////////////////////////////////////////// ATT_data = 0x30; //ボリューム設定 SYS_RESET = 0; //RESET PDN = 0; //PDN RC_LED0 = 0; // RC_LED1 = 1; // VR_use = 1; //VR使用で 1 power_flag = 1; //電源投入 char msgStart[] = "TAS5711"; char msgPicID[] = "18F26k22"; char msgWAIT[] = "PVDD Wait PLL_sw"; char msgUNLOCK[] = "WM8804 UNLOCK"; i2c_enable(); writeTAS5711(TAS5711, SoftMute, 0x07, TW_WRITE); delay_10ms(50); // 0.5秒待つ i2c_lcd_init(); // LCD初期化 i2c_lcd_set_cursor_pos(0); // カーソル位置変更 printf(msgStart); // メッセージ表示 i2c_lcd_set_cursor_pos(0x40); // カーソル位置変更 printf(msgPicID); // メッセージ表示 delay_10ms(50); i2c_lcd_clear(); i2c_lcd_set_cursor_pos(0x40); // カーソル位置変更 printf(msgWAIT); // メッセージ表示 i2c_lcd_clear(); PDN = 1; //PDN delay_10ms(10); SYS_RESET = 1; //RESET delay_10ms(10); i2c_lcd_clear(); i2c_lcd_set_cursor_pos(0x40); // カーソル位置変更 printf(msgUNLOCK); // メッセージ表示 while (PLL_UNLOCK == 1) { } delay_100ms(10); delay_100ms(10); delay_100ms(10); delay_100ms(10); delay_100ms(10); i2c_lcd_clear(); writeTAS5711(TAS5711, SoftMute, 0x00, TW_WRITE); writeTAS5711(TAS5711, OscillatorTrim, 0x00, TW_WRITE); //DataSheet p39 writeTAS5711(TAS5711, SystemControl2, 0x00, TW_WRITE); //Exit Shutdown //writeTAS5711(TAS5711, VolumeConfig, 0x93, TW_WRITE); //VolumeStep 256 __delay_ms(100); while (1) { ///////////////////////////////////////////////// //AD値取込み ///////////////////////////////////////////////// ADCON0 = 0b00000001; __delay_us(20); //20us ADCON0bits.GO = 1; // AD変換開始 while (ADCON0bits.nDONE); // AD変換終了待ち __delay_ms(60); ad_data = ADRESL; //空読み ad_data = ADRESH; //ad_data = ADRESH; //Left justify, //ad_data = ad_data >> 2; vr_data.master_data = ~ad_data; if (0x01 <= (vr_data.master_data - old_ad_data)) { old_ad_data = vr_data.master_data; data_flag = 1; } if (0x01 <= (old_ad_data - vr_data.master_data)) { old_ad_data = vr_data.master_data; data_flag = 1; } ///////////////////////////////////////////////// //ADモード 送信 ///////////////////////////////////////////////// if ((VR_use == 1 && data_flag == 1) || power_flag == 1) {//VRとSW片方使用 writeTAS5711(TAS5711, MasterVolume, vr_data.master_data, TW_WRITE); data_flag = 0; power_flag = 0; //} ///////////////////////////////////////////////// //LCD表示用 ///////////////////////////////////////////////// if (vr_data.master_data == 0x30) { i2c_lcd_set_cursor_pos(0x40); printf(" 0.0db"); } if (vr_data.master_data > 0x30) { temp_a = vr_data.master_data - 0x30; temp_b = temp_a & 0x01; if (!temp_b) { temp_a = temp_a >> 1; sprintf(buffer, "-%3d,0db ", temp_a); i2c_lcd_set_cursor_pos(0x40); printf(buffer); } else { temp_a = temp_a >> 1; sprintf(buffer, "-%3d,5db ", temp_a); i2c_lcd_set_cursor_pos(0x40); printf(buffer); } } if (vr_data.master_data < 0x30) { temp_a = 0x30 - vr_data.master_data; temp_b = temp_a & 0x01; if (!temp_b) { temp_a = temp_a >> 1; sprintf(buffer, "+%3d,0db ", temp_a); i2c_lcd_set_cursor_pos(0x40); printf(buffer); } else { temp_a = temp_a >> 1; sprintf(buffer, "+%3d,5db ", temp_a); i2c_lcd_set_cursor_pos(0x40); printf(buffer); } } } if (PLL_UNLOCK == 1) { //WM8804 writeTAS5711(TAS5711, SoftMute, 0x07, TW_WRITE); i2c_lcd_set_cursor_pos(0x40); // カーソル位置変更 printf(msgUNLOCK); // メッセージ表示 while (PLL_UNLOCK == 1) { } delay_100ms(10); delay_100ms(10); delay_100ms(10); delay_100ms(10); i2c_lcd_clear(); writeTAS5711(TAS5711, SoftMute, 0x00, TW_WRITE); data_flag = 1; } ///////////////////////////////////////////////// // RUN確認 LED ///////////////////////////////////////////////// // RC_LED0 = ~RC_LED0; // RC_LED1 = ~RC_LED1; // RC_LED1 = PLL_UNLOCK; // __delay_ms(50); // 50ms }//whie return (EXIT_SUCCESS); } void delay_10ms(unsigned char t) { while (t--) { __delay_ms(10); } } void delay_100ms(unsigned char t) { while (t--) { __delay_ms(100); } }