?? f_14_4_audio.c
字號:
#include "config.h"#include "serial.c"#include "serio.c"#include "i2cmsu.c"#include "i2c_memutil.c"// Audio lab// want to sample at roughly 8 Khz rate, or 125 usvolatile unsigned char bufptr, interrupt_flag;volatile unsigned char buf_flag;volatile unsigned char record_mode, playback_mode;volatile unsigned char buf_1[64], buf_2[64];#if defined(HI_TECH_C)void interrupt timer_isr(void)#endif#if defined(__18CXX)#pragma interrupt timer_isrvoid timer_isr(void)#endif{ if (TMR2IF) { //clear timer interrupt flag TMR2IF=0; if (record_mode) { //read A/D register, save in buffer if (!buf_flag) buf_2[bufptr] = ADRESH; else buf_1[bufptr] = ADRESH; GODONE = 1; // start new conversion bufptr++; if (bufptr == 64) { bufptr = 0; interrupt_flag = 1; // toggler buffer flag buf_flag = ~buf_flag; } } if (playback_mode) { interrupt_flag = 1; } }}#define EEPROM 0xA0 // I2C EEPROM, write lower blk#define EEPROMR 0xA1 // I2C EEPROM, read lower blk#define EEPROMW_HB 0xA8 // I2C EEPROM, write upper blk#define EEPROMR_HB 0xA9 // I2C EEPROM, read upper blk#define DAC 0x58 // I2C DAC 01011000 unsigned int addr;char i, inchar, adc_value;void do_playback(void) { // playback approach -- start read of ADC at location zero. playback_mode = 1; RB4 = 1; // set switch for playback pcrlf (); printf("Doing Playback"); pcrlf (); // this is important, there are TWO internal address counters // both have to be initialized to zero // clear lower block address counter i2c_start(); i2c_put(EEPROM); // send write cmd to set low block address counter i2c_put(0); // send high address byte i2c_put(0); // send low address byte i2c_stop(); // send stop // clear upper block address counter i2c_start(); i2c_put(EEPROMW_HB); //block select = 1 i2c_put(0); // send high address byte i2c_put(0); // send low address byte i2c_stop(); // send stop addr = 0; // initialize DAC to output zero i2c_start(); i2c_put(DAC); i2c_put(0x00); i2c_put(0x00); i2c_stop(); // enable interrupts IPEN = 0; TMR2IF = 0; TMR2IE = 1; PEIE = 1; GIE = 1; // start timer 2 TMR2ON = 1 ; interrupt_flag = 0; //clear semaphore do { i2c_start(); // read byte if (addr & 0x8000) i2c_put(EEPROMR_HB); else i2c_put(EEPROMR); inchar=i2c_get(1); //NAK i2c_stop(); // if int flag is set, we not keeping up with sample rate!!! if (interrupt_flag) putch('!'); // wait for interrupt while (!interrupt_flag); interrupt_flag = 0; i2c_start(); // send to DAC i2c_put(DAC); i2c_put(0x00); i2c_put(inchar); i2c_stop(); addr = addr+1; CLRWDT(); //asm("clrwdt") }while(1);}void do_record(void){ addr = 0; buf_flag = 0; pcrlf (); printf("Capturing 64K of audio from ADC"); pcrlf (); record_mode = 1; // GODONE = 1; // start new converstion // enable TMR2 interrupt TMR2IF = 0; TMR2IE = 1; IPEN = 0; PEIE = 1; GIE = 1; TMR2ON = 1; // start timer 2 // interrupt_flag = 0; do { if (interrupt_flag) putch('!'); while (!interrupt_flag) { CLRWDT(); // asm("clrwdt"); }; // wait for block write // do block write // interrupt_flag = 0; if (buf_flag) i2c_memwrite(EEPROM,addr,(unsigned char *)buf_2); else i2c_memwrite(EEPROM,addr,(unsigned char *)buf_1); addr = addr + 64; putch('*'); }while(addr); // becomes zero on wraparound printf("64K Capture complete. "); printf("Press reset to continue."); pcrlf ();}void main(void){ TRISB4 = 0; // RB4 is output RB4 = 0; // initially low for record // configure A/D ADCON0 = 0x80; // sampling freq = Fsoc/32, channel 0 ADCON1 = 0x0E; ADON = 1; // Port A analog input, right justification of result // set baud rate // serial_init(95,1); // 19200 in HSPLL mode, crystal = 7.3728 MHz if (!TO || !RI) { if (!RI) {RI = 1;printf("Software reset has occurred, press reset\n");} else { // disable watchdog timer, print msg SWDTEN = 0;printf("Watchdog timer reset has occurred, press reset.\n"); } pcrlf(); if (i2c_errstat) i2c_print_err(); SLEEP(); //asm("sleep"); } bufptr=0;buf_flag = 0; record_mode = 0; playback_mode = 0; SWDTEN = 1; // enable watchdog timer // enable I2C // // i2c_init(17); // about 400Khz for HSPLL mode, crystal = 7.3728 MHz i2c_init(12); // lowest value that works, works with slow playback // configure timer 2 // post scale of 1, prescale of 16, PR2 =76 TOUTPS3 = 0; TOUTPS2 = 0; TOUTPS1 = 0; TOUTPS0 = 0; T2CKPS1 = 1; // pre scale of 16 #if defined(HI_TECH_C) PR2 = 76; // 6 Khz //#endif#if defined(__18CXX) PR2 = 114; // 4 Khz, MCC18 is a somewhat slower //#endif pcrlf ();printf("Enter 'r'(record), 'p'(playback), 'c'(calibrate), 'e'(examine): "); inchar=getch(); if (inchar == 'c') { while(1) { GODONE = 1; while (GODONE); // wait for end of conversion adc_value = ADRESH; // upper 8-bits printf("%x",adc_value); pcrlf(); } } if (inchar == 'e') { addr = 0; while(1) { i2c_memread(EEPROM,addr,(unsigned char *)buf_1); // do read for(i = 0;i< 64;i++) printf("%x ",buf_1[i]); pcrlf(); printf("Any key continues read...");pcrlf(); getch(); addr = addr+64; } } if (inchar == 'r') do_record(); if (inchar == 'p') do_playback(); SWDTEN = 0; // disable watchdog timer SLEEP(); // asm("sleep")}// end main//for MCC18, place the interrupt vector goto#if defined(__18CXX)#if defined(HIGH_INTERRUPT)#pragma code HighVector=HIGH_INTERRUPT#else#pragma code HighVector=0x0008 #endifvoid HighVector (void){ _asm goto timer_isr _endasm}#pragma code#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -