Форум РадиоКот https://radiokot.ru/forum/ |
|
Работа с SD/MMC флеш картой Mega128+Code Vision AVR https://radiokot.ru/forum/viewtopic.php?f=61&t=58118 |
Страница 2 из 2 |
Автор: | zero648 [ Чт окт 04, 2012 21:49:30 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
спящий писал(а): А воту меня непрограммируется контроллер с флехой микроСД,надо добавлять сопротивления последовательно с картой? на счет воспроизведения звука сейчас осмыслю(почитаю и задам фопрос))),а качество звука и дискетизация не зависят друг от друга? чет мне кажется одно и тоже) В общем то качество звука зависит от обоих параметров: количество бит (8,16,24...) - это разрешение амплитуды, чем больше бит тем точнее, частота дискретизации - это разрешение изменения амплитуды за одну секунду, чем больше частота тем меньше промежутки времени между изменением амплитуды. |
Автор: | vitalik_1984 [ Пт окт 05, 2012 00:06:46 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Смысл правильный, только это не цикл, а прерывание таймера.Считывать с карты можно и в самом прерывании, несмотря на то, что старшие товарищи советуют там ставить только флаги.Если программа занимается в основном только воспроизведением звуков, какая разница где она будет считываться? Главное все рассчитать по времени именно поэтому в расчете максимальной частоты Д. zero648 Сказал про 22050 а не 31250 частота будет нормально, потому что кроме вывода нужно еще и считывать с карты. А если оперативной памяти мало, то еще и придется несколько раз считывать частями. Хотя...может кто пробовал получится ли без помещения в буфер передавать куда либо в другое место?Не будет ли при этом глючить карта? |
Автор: | спящий [ Чт окт 18, 2012 20:33:16 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Посмотрите правильно расчитал 16 ТАЙМЕР? прерывание происходит по СТС. Частота контроллера 8Мгц преддилитель таймера 8 8Мгц/8= 1МГц Соответственно 1 такт =0,000 001С Частота дискретизации 8кГц = 0.000125С, тоесть выводить число каждые 0.000125С. Соответственно нужно записать OCR1AH=0; OCR1AL=125; Спойлер#include <stdio.h>#include <mega48.h> #ifndef __SLEEP_DEFINED__ #define __SLEEP_DEFINED__ .EQU __se_bit=0x01 .EQU __sm_mask=0x0E .EQU __sm_adc_noise_red=0x02 .EQU __sm_powerdown=0x04 .EQU __sm_powersave=0x06 .EQU __sm_standby=0x0C .SET power_ctrl_reg=smcr #endif #include <delay.h> #include <string.h> #include <io.h> #define data(x) SPDR=x; while (!( SPSR&(1<<7))); int i,temp; void main(void) { DDRB=0b11101111; //настройка ШИМ TCCR1A=0b10000001; TCCR1B=0b00001001; TIMSK1=0b01000000; // 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous UCSR0A=0x00; UCSR0B=0x18; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x33; //настройка SPI SPCR=0b01010011; SPSR=1; //подаем 74 импульса PORTB.2=1; delay_ms(10); for(i=0;i<10;i++) { data(0xff) } PORTB.2=0; printf(" ---------- \r\n"); //CMD0 data(0x40); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); while (temp!=0x01) { data(0xff); temp= SPDR; if (i>10) {data(0x40); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); i=0; } i++; } printf("CMD0 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); //CMD1 data(0x41); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); while (temp!=0x00) {data(0xff); temp= SPDR; if (i>20) {data(0x41); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); i=0; } i++; } printf("CMD1 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); delay_ms(20); //CMD17 чтение байтов data(0x52); data(0x00); data(0x05); data(0x0A); data(0x00); data(0x95); i=0; while (temp!=0xfe) { data(0xff); temp= SPDR; } printf("CMD17 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); //настройка прерывание по СТС TCCR1B=0b00001010; TIMSK1=0b00000010;//прерывание CTC TCNT1L=0x00; TCNT1H=0x00; OCR1AH=0; OCR1AL=125; while(1){ } } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { data(0xff); //передача по SPI OCR1AL=SPDR ; TCNT1L=0x00; TCNT1H=0x00; } |
Автор: | vitalik_1984 [ Пт окт 19, 2012 05:40:42 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Чет я не понял зачем вы сначала посчитали частоту и определили Код: OCR1AH=0; OCR1AL=125; а потом в прерывании меняете это значение?У вас же так частота поплывет. Нужно для звука использовать второе прерывание сравнения OCR1B. |
Автор: | спящий [ Пт окт 19, 2012 21:09:34 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Вы имеете ввиду отдельно использовать таймер для шима и для таймера? |
Автор: | vitalik_1984 [ Сб окт 20, 2012 21:02:42 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Прочитайте про таймер.Есть в таймере три прерывания, два по сравнению(A,B), одно по переполнению. Если вы выбрали таймер в режиме CTC и верхом будет значение OCR1A, а в прерывании будет меняться ЭТО ЖЕ значение то частота поплывет. В этом случае нужно использовать прерывание по сравнению B (OCR1B).Так как до прерывания по переполнению он не дойдет, а обнулится при OCR1A. Это насколько я понял.Еще одно важное замечание.Если у вас между прерываниями 125 тиков таймера куда вы будете 255 тиков шим для 8битного звука будете девать?Нужно число 125 увеличивать.Можно использовать для шим еще один таймер. |
Автор: | спящий [ Вс окт 21, 2012 15:33:47 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Получилось! Правда,Шумы очень большие,но если прислушиться то слышны и слова(может потому что я динамик напрямую в ШИМ подключил),как можно уменьшить шумы и увеличить громкость слов? Спойлер#include <stdio.h>#include <mega48.h> #include <delay.h> #include <string.h> #include <io.h> #define data(x) SPDR=x; while (!( SPSR&(1<<7))); int i,temp; void main(void) { DDRB=0b11101111; //настройка ШИМ TCCR1A=0b10000001; TCCR1B=0b00001001; TIMSK1=0b01000000; // 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous UCSR0A=0x00; UCSR0B=0x18; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x33; //настройка SPI SPCR=0b01010011; SPSR=1; //подаем 74 импульса PORTB.2=1; delay_ms(10); for(i=0;i<10;i++) { data(0xff) } PORTB.2=0; printf(" ---------- \r\n"); //CMD0 data(0x40); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); while (temp!=0x01) { data(0xff); temp= SPDR; if (i>10) {data(0x40); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); i=0; } i++; } printf("CMD0 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); //CMD1 data(0x41); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); while (temp!=0x00) {data(0xff); temp= SPDR; if (i>20) {data(0x41); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); i=0; } i++; } printf("CMD1 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); delay_ms(20); //CMD17 чтение байтов data(0x52); data(0x00); data(0x0B); data(0x86); data(0x00); data(0x95); i=0; while (temp!=0xfe) { data(0xff); temp= SPDR; } printf("CMD17 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); #asm("sei") //настройка прерывание по СТС TCCR0A=0b00000010; TCCR0B=0b00000010; TIMSK0=0b00000010;//прерывание CTC TCNT0=0x00; OCR0A=125; while(1){ } } interrupt [TIM0_COMPA] void timer1_compa_isr(void) { data(0xff); //передача по SPI OCR1AL=SPDR ; TCNT0=0x00; } |
Автор: | vitalik_1984 [ Вс окт 21, 2012 20:57:42 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Позвольте поинтересоваться что вы там воспроизводите? Какой формат звука (расширение файла)? Просто если какой нибудь не подготовленный для вашего плеера звук воспроизводить напрямую с карты, как раз и может шум наблюдаться.А более плавным можно его сделать через RC фильтр- то есть на выход с ноги шим резистор, второй конец резистора на мелкий конденсатор.Второй конец резистора в данном случае и будет выход.И еще желательно динамик к Мк напрямую тоже не подключать, лучше через защитный транзистор. |
Автор: | спящий [ Вс окт 21, 2012 21:41:47 ] | ||
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR | ||
Вот
|
Автор: | спящий [ Чт янв 24, 2013 21:18:48 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Подскажите что такое,уже 2 недели немогу запустить MMC? CMD0 принемает 01 с 4 раза, а CMD1 неполучает 00,ответ 01. - В чем проблема? может быть неправильно настройки СПИ? Делал также проект на AVR работает а вот на STM нет( |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |