Почему Коты не делают Интернет радиоприемники?

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Слесарь
Друг Кота
Сообщения: 4623
Зарегистрирован: Ср июл 14, 2010 18:27:52

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение Слесарь »

Очень красивые платки!
Я подумаю что может быть.
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение CyberVad »

Добрый день! Загвоздка. Нужно из шести чисел (unsigned char) собрать одно число - от 0 до 999999. Прямо в лоб умножая каждое число на весовой коэффициент не получается (из 1 2 3 0 0 0 получаем 123000, а из 456000 получаем не 456000 а 384464). Результирующее число unsigned long
Вот как я пробую: F=dig[1]*100000+dig[2]*10000+dig[3]*1000+dig[4]*100+dig[5]*10+dig[6];
Пробовал и так (первые 3 цифры) - F=(unsigned long)dig[1]*100000+(unsigned long)dig[2]*10000+(unsigned long)dig[3]*1000; результат тот же
Как бы правильнее?
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
devprodest
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср июл 31, 2013 15:24:57

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение devprodest »

Даю наводку на мысль
http://stackoverflow.com/questions/6687 ... -long-in-c

Код: Выделить всё

#include<stdio.h>

long ConvertCharToLong(char *pSrc) {
    int i=1;
    long result = (int)pSrc[0] - '0';
    while(i<strlen(pSrc)){
         result = result * 10 + ((int)pSrc[i] - '0');
         ++i;
    }
    return result;
}


int main() {
    char* str = "34878";
    printf("The answer is %d",ConvertCharToLong(str));
    return 0;
}

Надеюсь правильно распорядитесь.

Ну а вообще не очень хорошо использовать подобные названия типов данных лучшемы переопределить и назвать:

Код: Выделить всё

typedef signed char int8_t ;
typedef unsigned char uint8_t ;

typedef signed short int16_t;
typedef unsigned short uint16_t;

typedef signed long int32_t;
typedef unsigned long uint32_t;

Сразу видно что из себя представляет переменная, о то хрен пойми как она выглядит в конкретно рассматриваемой архитектуре.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение Siarzhuk »

CyberVad писал(а):Вот как я пробую: F=dig[1]*100000+dig[2]*10000+dig[3]*1000+dig[4]*100+dig[5]*10+dig[6];


А вы с индексами не напутали? dig[6] для массива из шести элементов содержит малорелевантный мусор. Правда это не объясняет отсутствие ошибки для случая 123000. С другой стороны и 123000 и 456000 умещаются в 3 байта - соответственно 0x1 E0 78 и 0x6 F5 40 и до знакового бита обоим далеко - сложно сказать по одной строчке. ;-)

Если ещё актуально попробуйте такой вариант:

Код: Выделить всё

   unsigned char dig[6] = { 4, 5, 6, 0, 0, 0 };
   unsigned long acc = 0;
   for (int i = 0; i < sizeof(dig) / sizeof(dig[0]); i++) {
      acc += dig[i];
      acc *= 10;
   }
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение CyberVad »

Всем спасибо! Да, с индексами немного напутал, но это не важно: я в начале объявлял массив из 7ми элементов. Потом передумал и стал использовать только 6 из них. Странно, что я использовал и в присваивании и в сборке числа индексы начиная с 1.
Изначальная казалось бы наглядная формула так и не заработала. Возможно это глюк компилятора. Если нагородить такую конструкцию:
unsigned int temp;
F=dig[1]*10+dig[2];
F=F*10000;
temp=dig[3];
temp=temp*1000;
F=F+temp;
temp=dig[4];
temp=temp*100;
F=F+temp;
temp=dig[5]*10+dig[6];
F=F+temp;
То есть последовательно вычислять, то всё работает.
Но с вашей, дорогие товарищи, подачи я очень изящно сделал циклом вот так и всё прекрасно заработало:
F = dig[0];
for (unsigned char i=1; i<6; i++) F=F*10+(dig[i]);
Всем большое спасибо!
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Аватара пользователя
znoxx
Родился
Сообщения: 4
Зарегистрирован: Ср июн 11, 2014 12:43:29
Контактная информация:

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение znoxx »

Вот собственно мой вариант "радио".
http://znoxx.me/2014/05/nas-radio.html
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение CyberVad »

Не совсем хардкор, но зато работает )) У меня наоборот - только хардкор, только МК, но не совсем работает )) Не могу победить такую загвоздку: если в двух словах, то вызывая одну и ту-же процедуру, одним и тем-же образом из разных процедур - получаем разный результат. Если кто-то силён в СИ отпишитесь в личку...
Вложения
DSC09274-2.jpg
Моё почти доделанное детище
(82.37 КБ) 464 скачивания
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Аватара пользователя
znoxx
Родился
Сообщения: 4
Зарегистрирован: Ср июн 11, 2014 12:43:29
Контактная информация:

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение znoxx »

CyberVad писал(а):если в двух словах, то вызывая одну и ту-же процедуру, одним и тем-же образом из разных процедур - получаем разный результат.

Значит судя по симптомам
1) если идет опрос каких-то аналоговых ножек - проверяйте питание. Совет дурацкий - знаю. Но я на это напоролся мощно.
2) но вообще, это похоже на то, что идёт какое-то переполнение памяти.
Лечить следующим образом - ставим компилятор (если работаете под windows - msys или cygwin gcc). Правда, в нашем случае сойдет и Visual Studio.
Выдираем сомнительную процедуру и вставляем в отдельный исходник и тестируем с отладчиком.
Т.е. тупо пишем на обычном компьютере (не для МК) и смотрим, что происоходит в отладчике.
Если всё нормально (мы, фактически, проводим делаем тесты) - грешим на переполнение.
Лечить так - по возможности не делаем так:
for(unsigned char i=0;i<100;i++)
а делаем так

unsigned char i=0; - вне процедуры

my_procedure()
{
for (i=0;i<100;i++)
{
код
код
код
}
}

далее - если юзаются константы, как-то

my_procedure()
{
char myData[]="something to read";
}

нужно опять-таки перетащить в глобальную секцию и сделать
const PROGMEM char myData[]="бла бла бла"
Это перетащит константы во флеш и освободит драгоценную память.

Как-то так.
Аватара пользователя
boingo-00
Нашел транзистор. Понюхал.
Сообщения: 186
Зарегистрирован: Ср авг 15, 2012 19:52:40
Откуда: 161 RUS
Контактная информация:

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение boingo-00 »

Почему Коты не делают Интернет радиоприемники?


Потому_что_это_будут_не_радиолюбители.Слушал_я_инет_радио...Говен.Особенно_с_инетом_1кб/с.ИМХО,интереснее_обычное_радио.
Здесь может быть ваша реклама.
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение CyberVad »

Не во всех населённых пунктах в радиоэфире принимаются желаемые радиостанции. Кроме того не всё желаемое можно принять в радиоэфире
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Аватара пользователя
boingo-00
Нашел транзистор. Понюхал.
Сообщения: 186
Зарегистрирован: Ср авг 15, 2012 19:52:40
Откуда: 161 RUS
Контактная информация:

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение boingo-00 »

Это да. И то было мое мнение.
Здесь может быть ваша реклама.
murkot
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт фев 14, 2013 16:28:36

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение murkot »

возвращаясь к началу темы: очень даже делают :-) сделал два вывода для себя: если надо для себя, дешево, быстро и вкусно, - тупо взять TP-Link MR3020 и поставить на него OpenWRT. в USB-порт (хост) воткнуть USB-звуковуху и наслаждаться любимыми станциями. писать там кода никакого не надо, максимум - пакеты поставить из репозитория. если хочется пописАть код, можно подключить ethernet phy к stm32f4-discovery, а в нее - уже воткнуть наушники. в обоих случаях цена решения менее $30. минус - управление только через веб-морду в обоих случаях.
Аватара пользователя
znoxx
Родился
Сообщения: 4
Зарегистрирован: Ср июн 11, 2014 12:43:29
Контактная информация:

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение znoxx »

murkot писал(а):минус - управление только через веб-морду в обоих случаях.

Ну почему же только через вебморду =)
Кстати на MR3020 мало флеша свободного =)
Аватара пользователя
abc
Друг Кота
Сообщения: 3680
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение abc »

Флеш на MR3020 достаточно легко можно увеличить до 8 или до 16 МБ.
Предварительно из "родного" чипа сливается дамп, переписываются последние 64кБ (если не вру) в новую микруху, потом меняется сам чип. Если надо более подробно - поищу ссылку.
Аватара пользователя
znoxx
Родился
Сообщения: 4
Зарегистрирован: Ср июн 11, 2014 12:43:29
Контактная информация:

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение znoxx »

znoxx писал(а):Если надо более подробно - поищу ссылку.

Было бы здорово. Там как раз засада - какие-то запчасти для корректной работы wifi в этих 64к
И я где-то читал, что народ не сильно преуспел - хотя может быть я ошибаюсь.
Слесарь
Друг Кота
Сообщения: 4623
Зарегистрирован: Ср июл 14, 2010 18:27:52

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение Слесарь »

abc писал(а):Флеш на MR3020 достаточно легко можно увеличить до 8 или до 16 МБ.

В моих приемника 32 КБ для обработчика TCP/IP и 32 КБ аудиобуфер на несколько секунд, соответственно мои приемники быстрее, так как работать с малым объемом памяти можно значительно быстрей. Практически нет такого понятия как загрузка после включения, если отклик интернет-станций достаточно быстрый, радио начинает воспроизводить через 1 секунду после включения.
Аватара пользователя
abc
Друг Кота
Сообщения: 3680
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение abc »

Слесарь, я абсолютно не спорю - специально обученный приемник всяко лучше любого девайса с линуксом на борту.
Но, тем не менее, многие пользователи не настолько преуспели в программировании микроконтроллеров, а "коробочного" решения не было и нет - Вы же сами писали, что пришлось довольно сильно допиливать исходники от Микрочипа.

znoxx
http://cyber-place.ru/showthread.php?t=387 где-то с третьей страницы
Слесарь
Друг Кота
Сообщения: 4623
Зарегистрирован: Ср июл 14, 2010 18:27:52

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение Слесарь »

abc писал(а):Слесарь, я абсолютно не спорю - специально обученный приемник всяко лучше любого девайса с линуксом на борту.
Но, тем не менее, многие пользователи не настолько преуспели в программировании микроконтроллеров, а "коробочного" решения не было и нет - Вы же сами писали, что пришлось довольно сильно допиливать исходники от Микрочипа.


Да. И это самое интересное!
Но надо признать, что Микрочип задал хороший тон своим TCP/IP стеком и самым компактным примером интернет-радио. Теперь я могу встроить интернет-радио во что только заблагорассудится, с любым интерфейсом управления.

В продолжение темы хочу еще попробовать беспроводной вариант интернет-радио. Дома установить мощный адаптер LAN -> RF 430 МГц, с выносной антенной и большим ДБи. А в руках иметь RF 430 MHz носимое интернет-радио с антенной резинкой. Предполагаю, такое радио будет работать в радиусе до 10 км. А если делать автомобильный вариант, то в радиусе до 50 км.

Но а для тех у кого есть бесплатный интернет сотового оператора конечно же лучше состыковать МК + аппаратный декодер MP3 + GSM 3G радиомодуль.
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение CyberVad »

Товарищи программисты! MPLAB и PICC18.
Подскажите такой пустячок: как массиву присвоить строковое значение?
Массив определяется так:
typedef struct
{
BYTE vRecordValid;
BYTE vStationName[31];
BYTE vStationURL[160];
BYTE vRecordDeleted[64];
} NVSTATION_RECORD;
Далее
#pragma udata STATION_SECTION
volatile NVSTATION_RECORD Station;
#pragma udata
Вот хочу сделать что-то вроде Station.vStationName = "SuperРадио!"
Конечно же так нельзя, а как можно?

Вариант проще.
Массив, допустим, unsigned char name[31];
Вопрос то-же - как одним махом ему присвоить значение строковое, например "Радио"?
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Слесарь
Друг Кота
Сообщения: 4623
Зарегистрирован: Ср июл 14, 2010 18:27:52

Re: Почему Коты не делают Интернет радиоприемники?

Сообщение Слесарь »

Помнится, перед тем как что-либо писать на C и C++, я два года вчитывался в книгу "Бьерн Страуструп Язык C++". Вам же рекомендую пройти простой курс с простым названием "Первые шаги".

Конкретно по вашему вопросу, рекомендую освоить стандартные функции работы с памятью, в разделе справки по компилятору Memory and String Manipulation Functions
Ответить

Вернуться в «Интеграция с ПК»