38 extern void ADPCMEncoderInit(
void);
41 extern void ADPCMDecoderInit(
void);
44 #define EEPROM 0xA0 //LC515 address assuming both address pins tied low.
48 void waitForWriteCompletion(
uint8_t u8_i2cAddr) {
50 u8_savedSWDTEN = _SWDTEN;
52 u8_i2cAddr = I2C_WADDR(u8_i2cAddr);
57 }
while (u8_ack == I2C_NAK);
58 _SWDTEN = u8_savedSWDTEN;
65 u8_AddrLo = u16_MemAddr & 0x00FF;
66 u8_AddrHi = (u16_MemAddr >> 8);
67 if (u16_MemAddr & 0x8000) {
69 u8_i2cAddr = u8_i2cAddr | 0x08;
71 waitForWriteCompletion(u8_i2cAddr);
77 for (u16_i=0; u16_i < BLKSIZE; u16_i++) {
88 u8_AddrLo = u16_MemAddr & 0x00FF;
89 u8_AddrHi = (u16_MemAddr >> 8);
91 if (u16_MemAddr & 0x8000) {
93 u8_i2cAddr = u8_i2cAddr | 0x08;
95 waitForWriteCompletion(u8_i2cAddr);
103 #define CONFIG_SLAVE_ENABLE() CONFIG_RB3_AS_DIG_OUTPUT()
104 #define SLAVE_ENABLE() _LATB3 = 0 //low true assertion
105 #define SLAVE_DISABLE() _LATB3 = 1
108 void configSPI1(
void) {
110 SPI1CON1 = SEC_PRESCAL_1_1 |
112 CLK_POL_ACTIVE_HIGH |
120 SPI1STATbits.SPIEN = 1;
123 CONFIG_SLAVE_ENABLE();
127 void writeDAC (
uint8_t dacval) {
134 #define ISR_PERIOD 125 // in microseconds
136 void configTimer3(
void) {
141 T3CON = T3_OFF |T3_IDLE_CON | T3_GATE_OFF
156 typedef struct tagFLAGBITS {
157 unsigned u1_activeBuffer:
159 unsigned u1_writeFlag:
161 unsigned u1_recordFlag:
163 unsigned u1_playbackFlag:
165 unsigned u1_readFlag:
167 unsigned u1_passThruFlag:
169 unsigned u1_compressionFlag:
172 volatile FLAGBITS flags;
182 if (flags.u1_compressionFlag) {
184 i16_adcval = u16_adcVal;
186 u8_tmp = ADPCMEncoder( i16_adcval);
187 if (u8_sampleCount & 0x01) {
188 u8_dacVal = (u8_tmp << 4)| u8_dacVal;
190 if (flags.u1_activeBuffer) au8_bufferB[u8_bufferCount++] = u8_dacVal;
191 else au8_bufferA[u8_bufferCount++] = u8_dacVal;
197 u8_dacVal = (u16_adcVal>>4) & 0x00FF;
198 if (flags.u1_activeBuffer) au8_bufferB[u8_bufferCount++] = u8_dacVal;
199 else au8_bufferA[u8_bufferCount++] = u8_dacVal;
201 if (u8_bufferCount == BLKSIZE) {
202 flags.u1_activeBuffer = !flags.u1_activeBuffer;
203 flags.u1_writeFlag = 1;
211 if (flags.u1_activeBuffer) u8_tmp = au8_bufferB[u8_bufferCount];
212 else u8_tmp = au8_bufferA[u8_bufferCount];
213 if (flags.u1_compressionFlag) {
214 if (u8_sampleCount & 0x01) {
215 i16_adcval = ADPCMDecoder(u8_tmp >> 4);
218 i16_adcval = ADPCMDecoder(u8_tmp & 0x0F);
221 u16_adcVal = i16_adcval;
222 u8_dacVal = (u16_adcVal>>4) & 0x00FF;
229 if (u8_bufferCount == BLKSIZE) {
230 flags.u1_activeBuffer = !flags.u1_activeBuffer;
231 flags.u1_readFlag = 1;
237 void _ISR _T3Interrupt (
void) {
240 u16_adcVal = ADC1BUF0;
243 if (flags.u1_recordFlag) isrRecord();
244 if (flags.u1_playbackFlag) isrPlayback();
245 if (flags.u1_passThruFlag) {
246 u8_dacVal = (u16_adcVal>>4) & 0x00FF;
251 #define VREF 3.3 //assume Vref = 3.3 volts
253 void doRecord(
uint8_t u8_compression) {
255 flags.u1_compressionFlag = u8_compression;
256 if (u8_compression) ADPCMEncoderInit();
257 flags.u1_activeBuffer = 0;
261 flags.u1_writeFlag = 0;
262 flags.u1_recordFlag = 1;
264 if (flags.u1_writeFlag)
reportError(
"Record overflow");
266 flags.u1_writeFlag = 0;
267 if (flags.u1_activeBuffer)
268 memWriteLC515(EEPROM,u16_MemAddr,au8_bufferA);
270 memWriteLC515(EEPROM,u16_MemAddr,au8_bufferB);
271 u16_MemAddr = u16_MemAddr +64;
273 }
while (u16_MemAddr != 0);
274 flags.u1_recordFlag = 0;
275 flags.u1_compressionFlag = 0;
279 void doPlayback(
uint8_t u8_compression) {
282 flags.u1_compressionFlag = u8_compression;
283 if (u8_compression) ADPCMDecoderInit();
284 flags.u1_activeBuffer = 0;
285 flags.u1_readFlag = 0;
290 memReadLC515(EEPROM,u16_MemAddr,au8_bufferA);
291 u16_MemAddr = u16_MemAddr +64;
292 flags.u1_playbackFlag = 1;
294 if (flags.u1_activeBuffer)
295 memReadLC515(EEPROM,u16_MemAddr,au8_bufferA);
297 memReadLC515(EEPROM,u16_MemAddr,au8_bufferB);
298 u16_MemAddr = u16_MemAddr +64;
299 if (flags.u1_writeFlag)
reportError(
"Playback underflow");
301 flags.u1_readFlag = 0;
306 flags.u1_playbackFlag = 0;
307 flags.u1_compressionFlag = 0;
310 void doSampledPassthru(
void) {
311 flags.u1_passThruFlag = 1;
314 flags.u1_passThruFlag = 0;
325 u16_adcVal = ADC1BUF0;
339 CONFIG_AN0_AS_ANALOG();
347 outString(
"\nEnter 'r' (record), 'p' (playback), 'f' (sampled feedthru). 'R', 'P' use compression. Any key terminates: ");