Первым делом, конечно, самолеты, усы, лапы и хвост, но пора подумать и о Кисах. Лучший подарок своей Кисе - это Я (Кот). И совсем не плохо было бы признаться Кисе в любви по-человечески. Так-так…. Что для этого нужно? Вот!!! Придумал. Лапкой быстренько нажимаем на ярлычек Sound Forge. Давим на кнопку запись, выбираем частоту дискретизации 8 кГц, разрядность 8 бит и моно.
А теперь, готовимся, и громко, закрыв лапами глаза, промяукиваем в микрофон признание в любви. Главное красноречиво и от всего сердца!!! Теперь его немного редактируем, придавая ему нотки томной нежности и убирая шумы и паузы. Сохраняем в формате raw с такими же параметрами. Самое главное - сделано. Теперь можно спокойно полакомиться сметанкой.
Ой!!!! А как же Кисе передать свое признание? Не нести же компьютер к ней, да и самому неловко заявляться. Ааааа!!!! Срочно в сундук!!! Фантики, резиновые мышки, клубок….блин, не то… Вот оно- на самом дне валяется покусанный AT90S8515 -8PI. Ничего, он нам еще послужит. Теперь сохраненный raw файл с помощью утилиты BIN2C и громкого мяуканья превращаем в массив цифирек, понятный обгрызанному кусочку пластика с обломанными ножками. Запускаем наш удобный котовижен v2.05.05 и копируем получившиеся цифирки, весело настукивая лапками небольшую программку для вывода нашего признания в любви с помощью ШИМа. Вот что удалось настучать, вылакав две кружки молока, закусывая рыбкой.
/*****************************************************
Chip type : AT90S8515
AVR Core Clock frequency: 8,000000 MHz
*****************************************************/
#include
#include
volatile unsigned char wait;
#define MIAU_LEN 6800
__flash unsigned char miau_wave[]=
{
....
};
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
if(wait)wait--;
}
void main(void)
{
unsigned int buffer_counter;
unsigned char prohod=0;
// Input/Output Ports initialization
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TCCR1A=(1<<COM1B1)|(1<<PWM10); // 8-битный ШИМ, не инвертирующий
// Разрешаем глобальные прерывания
#asm("sei")
while (1)
{
buffer_counter=0; // начинаем с нулевого сэмпла
TCCR1B=(1<<CS10); // запускаемаем счётчик 1
TIFR =(1<<TOV1); // очищаем флаг прерывания по переполнению
TIMSK=(1<<TOIE1); // разрешаем прерывание по переполнению таймера 1
while (buffer_counter<MIAU_LEN)
{
while(wait); // ожидаем дважды прерывание переполнения таймера
//1 - на один сэмпл держим 2 выборки ШИМа
if (prohod&0x01)OCR1B = miau_wave[buffer_counter++]>>1;
// загружаем очередной сэмпл в ШИМ
// и уменьшаем громкость в 2 раза каждый нечетный раз
else OCR1B = miau_wave[buffer_counter++]; // загружаем очередной сэмпл в ШИМ
wait = 2; // установка флага ожидания для нового сэмла
}
while(wait); // дожидаемся завершения вывода последнего сэмпла
TIMSK = 0x00; // запрещаем все прерывания
TCCR1B = 0x00; // останавливаем счётчик 1
prohod++; // Увеличиваем число мяуканий
delay_ms(1700);
}
}
Компилируем это чудо котоинженерной мысли, достаем из сундучка любимый AVR Dragon и начинаем злобно шипеть: «Пшшшшш…» Какие нехорошие индийские мусорные коты!!! Это же надо было додуматься убрать из него поддержку моего единственного погрызенного 90s8515. Пришлось из ниток и проводочков собирать адаптер для LPT.
К погрызенному кусочку пластика нужно прикошачить кварц с конденсаторами и динамик через котоденсатор.
Подключаем к батарейке и этот славный черный кусочек пластика совсем кошачьим голосом признается в любви.
То что нужно!!! Думаю, моя Киса оценит, и меня ждут лучшие марты за всю мою жизнь. Мяу!!!
Опубликовано 12.09.2011
один из конкурсов сайта радиокот