предлагаю собрать библиотеку стандартных функций для работы с железом минибота.
начал с описания платформы, пока не закончено.
переехало из вики
Технический форум по робототехнике.
blindman писал(а):1. Почему C++? Не очень популярный язык для АВРов. Да и смысл вообще его использовать, если там просто функции, завернутые в namespac'ы ?
blindman писал(а):В, общем суть вопросов одна: зачем использовать инструменты, которые не распространены в среде тех, кто пишет для AVR? Ведь будет мало шансов, что кто-то присоединится, и много шансов что придется все тянуть одному, а это может привести и к смерти проекта, если вдруг сил не хватит.
=DeaD= писал(а):А какие еще варианты? Чистый Си?
=DeaD= писал(а):Не "если вдруг", а одному 100% сил не хватит, да и смысла тогда нету.
blindman писал(а):=DeaD= писал(а):А какие еще варианты? Чистый Си?
Да. А кое-где и ассемблер. БольшАя (если не бОльшая) часть библиотек - будет системное программирование в чистом виде.
=DeaD= писал(а):Разумеется классы применять надо крайне осмотрительно, чай не 2Мб оперативки.
blindman писал(а):Что-то никак не придумывается где вообще тут классы можно применить .
blindman писал(а):Возможно. Но это уже прикладная область. Я же говорю в первую очередь о взаимодействии с железом.
=DeaD= писал(а):Ну ассемблерные вставки нигде не запрещены, а вот WinAVR - всё-таки одна из самых-самых, <skip>
=DeaD= писал(а):А вы это на разных языках писать будете?
blindman писал(а):Если мы используем код на C++ в низкоуровневых библиотеках, мы тем самым не оставляем выбора тем, кто их будет использовать. То есть или пиши на C++, или на C, но тогда уж сам. А эти фундаментальные библиотеки следует делать максимально доступными.
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Project : PCM Player
Version : 0.0.0.6
Date : 19.01.2006
Author : Pavel Sirotkin
Mail to : pol_s@list.ru
Chip type : ATmega32
Fuses Settings : CKSEL = 1110, SUT = 01, CKOPT = 0
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
Heap : 0x300
Data Stack : 0x100
Return Stack : 64
Compiler : IAR EWAVR 4.12A
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
#include "main.h"
// Заголовок WAV файла
typedef struct
{
unsigned char id_riff[4]; // 4 byte
unsigned long len_riff; // 4 byte
unsigned char id_chuck[4]; // 4 byte
unsigned char fmt[4]; // 4 byte
unsigned long len_chuck; // 4 byte
unsigned int type; // 2 byte
unsigned int channels; // 2 byte
unsigned long freq; // 4 byte
unsigned long bytes; // 4 byte
unsigned int align; // 2 byte
unsigned int bits; // 2 byte
unsigned char id_data[4]; // 4 byte
unsigned long len_data; // 4 byte
} TitleWave;// 44 byte
/*
---------------------------------------------------------------------------------------------
Глобальные переменные
---------------------------------------------------------------------------------------------
*/
volatile unsigned char data;
unsigned char song;
unsigned char play;
unsigned char gotoNextSong;
__flash char FileNames [10][11] =
{
"muson01.wav","muson02.wav","muson03.wav","muson04.wav","muson05.wav",
"muson06.wav","muson07.wav","muson08.wav","muson09.wav","muson10.wav"
};
/*
=============================================================================================
Проверка заголовка WAV файла на соответсвие параметрам воспроизведения.
Формат WAV файла должен быть: PCM 8 бит 16000 КГц Моно.
=============================================================================================
*/
unsigned char WaveComp (char const __flash name[])
{
//~~~~~~~~~~~~~
FILE *f;
TitleWave tw;
//~~~~~~~~~~~~~
f = fopenc(name,READ);
if ( f==0 ) return (1); // Не открыть файл
fread(&tw,sizeof(TitleWave),1,f);
fclose(f);
if ( strncmp_G(tw.id_riff,"RIFF",4) != 0 ) return (1); // Не совпал идентификатор RIFF
if ( strncmp_G(tw.id_chuck,"WAVE",4) != 0 ) return (1); // Не совпал идентификатор CHUCK
if ( strncmp_G(tw.fmt,"fmt ",4)!= 0 ) return (1); // Не совпал идентификатор FMT
if ( tw.type != 1 ) return (1); // Тип данных - не выборка
if ( tw.channels != 1 ) return (1); // Не моно
if ( tw.freq != 16000 ) return (1); // Не 16000 КГц
if ( tw.bytes != 16000 ) return (1);
if ( tw.bits != 8 ) return (1); // Не 8 бит
if ( strncmp_G(tw.id_data,"data",4)!= 0 )return (1); // Не совпал идентификатор DATA
return (0);
}
/*
=============================================================================================
MAIN.
=============================================================================================
*/
void main ()
{
//~~~~~~~~~~
FILE *fp;
//~~~~~~~~~~
while (!initialize_media()){};
PCMDDR = 0xFF;
PCMPort = 0x00;
PORTD_Bit2 = 1;
PORTD_Bit3 = 1;
// Sleep enable
MCUCR |= (1 << SE);
// External Interrupts enable
GICR |= (1 << INT1)|(1 << INT0);
SEI();
while(1)
{
if (play)
{
GICR &= ~(1 << INT0);
// Timer/Counter 0 initialization
TCCR0 |= (1 << CS01);
TCNT0 = 0x89;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK |= (1 << TOIE0);
if (!WaveComp (FileNames[song]))
{
fp = fopenc(FileNames[song], READ);
while ( ((fp -> position) < (fp -> length)) && !gotoNextSong )
{
data = fgetc(fp);
SLEEP();
};
fclose(fp);
if (!gotoNextSong) play = 0;
gotoNextSong = 0;
}
else song = 0;
// Stop Timer0
TCCR0 &= ~(1 << CS01);
TIMSK &= ~(1 << TOIE0);
GICR |= (1 << INT0);
}
else SLEEP();
};
}
/*
=============================================================================================
Timer0 interrupt.
=============================================================================================
*/
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf (void)
{
PCMPort = data;
TCNT0 = 0x89;
}
/*
=============================================================================================
External interrupt0.
=============================================================================================
*/
#pragma vector = INT0_vect
__interrupt void Int0_Isr (void)
{
_delay_ms(1000);
while (!PIND_Bit2){};
play = 1;
}
/*
=============================================================================================
External interrupt1.
=============================================================================================
*/
#pragma vector = INT1_vect
__interrupt void Int1_Isr (void)
{
_delay_ms(1000);
while (!PIND_Bit3){};
gotoNextSong = 1;
play = 1;
song++;
}
EdGull писал(а):кстати, а трудно вот этот код переделать под прием комманд с уарта и и2ц на воспроизведение указанных файлов?
GICR &= ~(1 << INT0);
// Timer/Counter 0 initialization
TCCR0 |= (1 << CS01);
TCNT0 = 0x89;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK |= (1 << TOIE0);
if (!WaveComp (FileNames[song]))
{
fp = fopenc(FileNames[song], READ);
while ( ((fp -> position) < (fp -> length)) && !gotoNextSong )
{
data = fgetc(fp);
SLEEP();
};
fclose(fp);
}
else song = 0;
// Stop Timer0
TCCR0 &= ~(1 << CS01);
TIMSK &= ~(1 << TOIE0);
GICR |= (1 << INT0);