Witam
Wraz z kolega budujemy małe urządzenie którego zadaniem ma być odtworzenie dźwięku z karty SD za pomocą PWM. Niestety poza otrzymaniem ciągłego 4kHz albo różnych innych nie mam więcej efektów. Projekt jest rozwinięciem Attiny2313 Audio z PWM. Poniżej kod programu.
Prosze w przyszłości , stosować znaczniki [code] i nie używać w tytule "zakazanych" wyrazów - regulamin p.11.1
[zumek]
Wraz z kolega budujemy małe urządzenie którego zadaniem ma być odtworzenie dźwięku z karty SD za pomocą PWM. Niestety poza otrzymaniem ciągłego 4kHz albo różnych innych nie mam więcej efektów. Projekt jest rozwinięciem Attiny2313 Audio z PWM. Poniżej kod programu.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <inttypes.h>
#include <avr/iom16.h>
#include <util/delay.h>
#define SPIDI 6 // Port B bit 6 (pin7): data in (data from MMC)
#define SPIDO 5 // Port B bit 5 (pin6): data out (data to MMC)
#define SPICLK 7 // Port B bit 7 (pin8): clock
#define SPICS 4 // Port B bit 4 (pin5: chip select for MMC
void timer_init()
{
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM10) | (1<<WGM11);
TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (1<<CS11) | (1<<CS10);
TIMSK = (1<<OCIE1A);
DDRD = 0xFF;
PORTD = 0x00;
OCR1A = 1500;
OCR1B = 0x00;
}
void SPIinit(void) {
DDRB &= ~(1 << SPIDI); // set port B SPI data input to input
DDRB |= (1 << SPICLK); // set port B SPI clock to output
DDRB |= (1 << SPIDO); // set port B SPI data out to output
DDRB |= (1 << SPICS); // set port B SPI chip select to output
SPCR = (1 << SPE) | (1 << MSTR) | (0 << SPR1) | (0 << SPR0);
PORTB &= ~(1 << SPICS); // set chip select to low (MMC is selected)
}
char SPI(char d) { // send character over SPI
char received = 0;
SPDR = d;
while(!(SPSR & (1<<SPIF)));
received = SPDR;
return (received);
}
char Command(char cmd, uint32_t adr )
{
SPI(0xFF);
SPI(cmd);
SPI((uint8_t)(adr >> 24));
SPI((uint8_t)(adr >> 16));
SPI((uint8_t)(adr >> 8));
SPI((uint8_t)(adr));
SPI(0xFF);
SPI(0xFF);
return SPI(0xFF);
}
int MMC_Init(void) { // init SPI
char i;
PORTB |= (1 << SPICS);
PORTB |= (1 << SPIDI);
// start MMC in SPI mode
for(i=0; i < 10; i++) SPI(0xFF);
PORTB &= ~(1 << SPICS);
if (Command(0x40,0) != 1) goto mmcerror; // reset MMC
st: // if there is no MMC, prg. loops here
if (Command(0x41,0) !=0) goto st;
return 1;
mmcerror:
return 0;
}
uint16_t sendmmc(uint32_t sector)//, uint16_t stop) { // send 512 bytes from the MMC via the serial port
{
int i;
// 512 byte-read-mode
uint8_t ix;
char r1 = Command(0x51,sector);
for (ix = 0; ix < 50000; ix++) {
if (r1 == (char)0x00) break;
r1 = SPI(0xFF);
}
if (r1 != (char)0x00) {
return 1;
}
while(SPI(0xFF) != (char)0xFE);
for(i=0; i < 512; i++)
{
while(!(TIFR & (1<<OCF1A)));
OCR1A = 1500;
OCR1B = SPI(0xFF);
}
SPI(0xFF);
SPI(0xFF);
return 0;
}
int main(void)
{
//init();
timer_init();
SPIinit();
if (MMC_Init() == 1)
{
DDRD |= (1<<PD6);
PORTD |= (1<<PD6);
sei(); // enable interrupts
for (int sect = 0; sect < 62760; sect++)
{
sendmmc(sect);
}
}
while (1)
{
PORTD &= ~(1<<PD7);
_delay_ms(500);
PORTD |= (1<<PD7);
_delay_ms(500);
}
}Prosze w przyszłości , stosować znaczniki [code] i nie używać w tytule "zakazanych" wyrazów - regulamin p.11.1
[zumek]
