[tuxdroid-svn] r1267 - firmware/tuxaudio/branches/new_rf
Status: Beta
Brought to you by:
ks156
From: jaguarondi <c2m...@c2...> - 2008-06-25 14:38:05
|
Author: jaguarondi Date: 2008-06-25 16:38:07 +0200 (Wed, 25 Jun 2008) New Revision: 1267 Modified: firmware/tuxaudio/branches/new_rf/communication.c firmware/tuxaudio/branches/new_rf/fifo.h firmware/tuxaudio/branches/new_rf/main.c Log: * Now in 16kHz with microphone and I2C running. Modified: firmware/tuxaudio/branches/new_rf/communication.c =================================================================== --- firmware/tuxaudio/branches/new_rf/communication.c 2008-06-25 11:11:17 UTC (rev 1266) +++ firmware/tuxaudio/branches/new_rf/communication.c 2008-06-25 14:38:07 UTC (rev 1267) @@ -245,7 +245,8 @@ /** \name SPI frame constants * @{ */ /** Size of the audio data in the SPI frame */ -#define AUDIO_SIZE 17 +#define AUDIO_SPK_SIZE 34 +#define AUDIO_MIC_SIZE 17 /* Bits of the config byte */ #define CFG_CRCOK_MK _BV(0) @@ -259,7 +260,6 @@ #define SPI_CONFIG_OFFSET 1 #define SPI_DATA_OFFSET 3 #define SPI_AUDIO_OFFSET (SPI_DATA_OFFSET + CMD_SIZE) -#define SPI_PREVAUDIO_OFFSET (SPI_AUDIO_OFFSET + AUDIO_SIZE) /*! @} */ static uint8_t frame_in_idx, frame_out_idx; @@ -326,7 +326,7 @@ slope = 1; prev_stack_length = stack_length; - if (slope && stack_length > 50) + if (slope && stack_length > 40) OCR0A--; if (!slope && stack_length < 80) OCR0A++; @@ -371,10 +371,10 @@ FifoGet(rf_cmdout_buf, &spi_out[i+SPI_DATA_OFFSET]); } } - if (FifoLength(ADCFifo) >= AUDIO_SIZE) + if (FifoLength(ADCFifo) >= AUDIO_MIC_SIZE) { config |= CFG_AUDIO_MK; - for (i=0; i<AUDIO_SIZE; i++) + for (i=0; i<AUDIO_MIC_SIZE; i++) { FifoGet(ADCFifo, &spi_out[i+SPI_AUDIO_OFFSET]); } @@ -400,24 +400,14 @@ { adapt_audio_rate(); - //static uint8_t cnt = 0; - //for (i=0; i<AUDIO_SIZE; i++) - for (i=0; i<34; i++) + for (i=0; i<AUDIO_SPK_SIZE; i++) { - //if ((spi_in[i+SPI_AUDIO_OFFSET] == (cnt+1)) || - //(spi_in[i+SPI_AUDIO_OFFSET] == (cnt-1))) - //{ + FifoPut(PWMFifo, spi_in[i+SPI_AUDIO_OFFSET]); + //XXX DEBUG: used to show when the stack overflows. + //if (FifoPut(PWMFifo, spi_in[i+SPI_AUDIO_OFFSET]) != FIFO_OK) //PORTB |= 0x80; // XXX DEBUG - //} //else //PORTB &= ~0x80; // XXX DEBUG - //cnt = spi_in[i+SPI_AUDIO_OFFSET]; - - //FifoPut(PWMFifo, spi_in[i+SPI_AUDIO_OFFSET]); - if (FifoPut(PWMFifo, spi_in[i+SPI_AUDIO_OFFSET]) != FIFO_OK) - PORTB |= 0x80; // XXX DEBUG - else - PORTB &= ~0x80; // XXX DEBUG } } //PORTB &= ~0x80; // XXX DEBUG Modified: firmware/tuxaudio/branches/new_rf/fifo.h =================================================================== --- firmware/tuxaudio/branches/new_rf/fifo.h 2008-06-25 11:11:17 UTC (rev 1266) +++ firmware/tuxaudio/branches/new_rf/fifo.h 2008-06-25 14:38:07 UTC (rev 1267) @@ -157,6 +157,22 @@ int8_t FifoPut(fifo_t *p, uint8_t const data); int8_t FifoGet(fifo_t *p, uint8_t *data); +static inline void FifoPut_inl(fifo_t *p, uint8_t const data) +{ + if (FifoLength(p) == p->size) + return; + + p->buffer[p->inIdx++ & (p->size-1)] = data; /* store data */ +} + +static inline void FifoGet_inl(fifo_t *p, uint8_t *data) +{ + if (p->outIdx == p->inIdx) + return; + + *data = p->buffer[p->outIdx++ & (p->size-1)]; +} + /*! @} */ /*! @} */ #endif /* _FIFO_H_ */ Modified: firmware/tuxaudio/branches/new_rf/main.c =================================================================== --- firmware/tuxaudio/branches/new_rf/main.c 2008-06-25 11:11:17 UTC (rev 1266) +++ firmware/tuxaudio/branches/new_rf/main.c 2008-06-25 14:38:07 UTC (rev 1267) @@ -181,13 +181,14 @@ { sei(); // Reactivate global interrupt in case of flash programmation + /* Check for stack overflow. */ if (!check_stack()) while(1) { PORTB |= 0x80; PORTB &= ~0x80; } - spiTransaction(); // Spi transaction from radio + //spiTransaction(); // Spi transaction from radio //XXX to delete //if (commandRX) // commend RX from radio @@ -328,16 +329,20 @@ ISR(__vector_audio_sampling) { //FifoPut(ADCFifo, ADCH); - FifoGet(PWMFifo, (uint8_t *)&OCR0B); /* set the sample value to timer pulse width */ - /*if (FifoGet(PWMFifo, (uint8_t *)&OCR0B)) [> set the sample value to timer pulse width <]*/ - /*{*/ - /*PORTB &= ~0x80; // XXX DEBUG*/ - /*}*/ - /*else*/ - /*{*/ - /*PORTB |= 0x80; // XXX DEBUG*/ - /*}*/ + /* Speaker at 16kHz */ + FifoGet_inl(PWMFifo, (uint8_t *)&OCR0B); + + if (sampling_pwm & 0x02) + { + /* Microphone at 8kHz */ + FifoPut_inl(ADCFifo, ADCH); + ADCSRA |= 0x40; + if (--sendSensorsCmpt == 0) + sendSensorsFlag = 1; + } + + // XXX DEBUG: used to generate a saw waveform //static uint8_t cnt = 0; //static uint8_t dir = 1; //#define STEP 8 @@ -348,16 +353,13 @@ //cnt -= STEP; //if ((cnt >= (0xFF - STEP)) || (cnt == 0)) //dir = !dir; - - ADCSRA |= 0x40; - if (--sendSensorsCmpt == 0) - sendSensorsFlag = 1; } /* * Timer 0 overflow interrupt service routine (PWM) * 32KHz timer so the ISR is called each 31.25us */ +#if 0 ISR(SIG_OVERFLOW0) { /* timer 0 is clocked at 32KHz so we divide it by 4 to get 8KHz */ @@ -367,7 +369,29 @@ cli(); } } +#endif +#if 1 +ISR(SIG_OVERFLOW0) __attribute__((naked)); +ISR(SIG_OVERFLOW0) +{ + asm volatile ( + "in r0, 0x3f" "\n\t" + "push r28" "\n\t" + "lds r28, 0x0100" "\n\t" + "subi r28, 0xFF" "\n\t" + "sts 0x0100, r28" "\n\t" + "sbrs r28, 0" "\n\t" + "rjmp v_out" "\n\t" + "rcall __vector_audio_sampling" "\n\t" + "cli" "\n\t" + "v_out:" + "pop r28" "\n\t" + "out 0x3f, r0" "\n\t" + ::); + asm ("reti" "\n\t"::); +} +#endif //ISR(SIG_OVERFLOW0) __attribute__((naked)); //ISR(SIG_OVERFLOW0) //{ |