vesago
-
Постов
749 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные vesago
-
-
Если можно, то еще про звук. Как подключить его к микроконтроллеру, чтобы записывать и воспроизводить звук?
По поводу звука - есть модемы с поддержкой цифрового ввода/вывода. Вам остается во флешку записать отсчеты и мокроконтнроллером гонять, но наверное это будет несколько дороже, хотя качественней. Можно проще - у атмела есть известная апликушка - запись, воспроизведение звука на датафлешь атмегой. Можно взять за основу. Очень удобно. Коммутировать ключами микрофон. Или на вход записи или на вход телефона для прослушки например фона. Ну или еще проще - закатывать в датафлешь вавки, а потом контроллером или шимом или r2r цапом проигрывать. В интернете соответствующих проектов куча.
-
Имхо я особой нужды в TCP тоже не вижу. Как правило TCP требуют от нашего брата писатели верхнего софта из-за лени несколько усложненить верхний софт при работе с UDP. Кстати хотел спросить народ - я закончил написание TCP, чтоб передавать данные через GPRS. Теперь совершенно не представляю как отладить. Непосредственно с сервером опсоса дороговато как-то. Может кто поделится мыслями?
-
Соглашусь с Harbinger - почти, что любой телефон. Мне лично нравятся сименсы 35, 45, эриксоны, сони-эриксоны. Пример реализации можно посмотреть здесь http://aly.projektas.lt/Projects/GSMA/GSMA.htm, http://www.gsmpager.spb.ru/index.html.
-
GSM модемы или телефоны 3.3В. Можно взять в принципе uC тоже на 3.3В, можно взять на 5В через преобразователи уровней. Преобразователи уровней по разному можно делать. На резисторных делителях, на полевиках, на логике типа 74LVC125 - ноги толерантны к 5В. Мне нравится на полевиках, но из-за жадности делаю обычно на логике. Резисторы последовательно на пару -тройку кОм не повредят. В дш внимательно почитать про ноги ресета, зажигания и т.п. Некоторые модели работают только с ок и не пернеосят подтяжек. Особая тема - питание. Как правило применяется импульсный преобраз на LM2576 или вроде того. Если денег жалко, можно на mc34063. Как правило модуль в импулься 1.5А жрет. Средний ток оклоло 200 - 300 мА. Я запитывал и от lm317. Можно схему питать от 5В, а модуль через пару диодов. Звук - все просто если цеплять гарнитуру. Как правило достаточно внешних фильтров, которые есть в дш. Если нужна громкая связь, тогда + мотороловская микруха + усилок какой на TDA. В общем ничего особенного нет. Схемотехнически все как обычно.
-
Начать наверное лучьше с ознакомления с TCP/IP, тогда думаю и с lwip проще разобраться будет. Благо, что читать не очень много. Понравилось описание на www.protocols.ru. Можно и самому написать. Вам надо к блоку данных добавлять заголовок TCP или UDP, к этому пакету добавить заголовок IP и пулять в сеть. И обратно. По большому счету ничего сложного. Геморно только TCP реализовать - много факторов влияет на смену текущего состояния TCP. Больше всего и читать по нем. Может вам будет достаточно UDP, тогда все проще, но придется "самому" контролировать доставку.
-
Предположу, что теоретически повышенное сопротивление вкупе с емкостью на повышенных скоростях может подвалить фронты. В общем обычно ставят так, как сказал arttab.
-
По умолчанию мега 64 прикидывается мегой 103. Чтобы сделать ее мегой 64 с активацией ряда функций присущих меге 64 надо подправить соответствующий фуз.
Бит проверить:
#define bit3 3
if((PINC & (1<<bit3)) == 0)
{
...
}
else
{
...
}
Или
#define bit3 (PINC & (1<<bit3))
-
Все правильно - SCK как обычно, MOSI MISO на PDI/RXD и PDO/TXD. Эта самая распостранненная ошибка когда начинаешь работать с мегой 128/64 после нижележащих камней.
-
Классический вопрос в данном случае - не забыл ли, что при программировании сигналы данных заводятся отнюдь не на SPI?
-
Я подогнал вариант IgorKossak под свои комплектующие и утюжком заделал. Коллега мой вообще на макетке проводами посоединил. В ценности айса и в необходимости его наличия я соменвался пока не испробовал в деле. Сейчас не представляю как раньше без этого чуда обходился. Если денег на покупку жалко, не стоит жалеть какого дня на изготовление. Айс сторицей вернет потраченное.
-
Вот пример моего работающего кода как раз на меге 128 чип дб161. Если с железом проблем нет, должно работать. Работоспособность можно проверить чтением статусного регистра.
void SPI_Init(void) { PORT_SPI |= (1<<SCK)|(1<<MOSI)|(1<<MISO)|(1<<CS_SPI_1); DDR_SPI |= (1<<SCK)|(1<<MOSI)|(1<<CS_SPI_1); DDR_SPI &= ~(1<<MISO); SPSR = (1<<SPI2X); SPCR = (1<<SPE)|(1<<MSTR); //Mode 0 } //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Записываем байт //:::::::::::::::::::::::::::::::::::::::::::::::::::::: void SPI_Write_Byte(unsigned char b) { SPDR = b; while ((SPSR & (1<<SPIF)) == 0); } //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Читаем байт //:::::::::::::::::::::::::::::::::::::::::::::::::::::: unsigned char SPI_Read_Byte(void) { SPDR = 0x00; while ((SPSR & (1<<SPIF)) == 0); return SPDR; } //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Чтение статусного регистра //:::::::::::::::::::::::::::::::::::::::::::::::::::::: unsigned char AT45_Read_Status(void) { unsigned char tmp; AT45_ON; SPI_Write_Byte(AT45_OP_STATUS_REGISTER_READ); tmp = SPI_Read_Byte(); AT45_OFF; return tmp; } unsigned char AT45_Check_Ready(void) { return (AT45_Read_Status() & (1<<AT45_STATUS_FLAG_BUSY)); } //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Чтение данных //:::::::::::::::::::::::::::::::::::::::::::::::::::::: void AT45_Flash_Read(unsigned int page, unsigned int addr_on_page, unsigned int bcnt, unsigned char *buf) { unsigned int i; AT45_ON; SPI_Write_Byte(AT45_OP_CONTINUOUS_ARRAY_READ); SPI_Write_Byte((unsigned char)(page>>6)); SPI_Write_Byte((unsigned char)(page<<2)|(unsigned char)(addr_on_page>>8)); SPI_Write_Byte((unsigned char)addr_on_page); SPI_Write_Byte(0); SPI_Write_Byte(0); SPI_Write_Byte(0); SPI_Write_Byte(0); i = 0; do { *(buf + i) = SPI_Read_Byte(); i++; }while(i<bcnt); AT45_OFF; } //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Чтение данных из буфера //:::::::::::::::::::::::::::::::::::::::::::::::::::::: void AT45_Buf_Read(unsigned char buf_num, unsigned int addr_on_page, unsigned int bcnt, unsigned char *buf) { unsigned int i; AT45_ON; switch(buf_num) { case BUFER_1: SPI_Write_Byte(AT45_OP_BUFFER_1_READ); break; case BUFER_2: SPI_Write_Byte(AT45_OP_BUFFER_2_READ); break; default: return; } SPI_Write_Byte(0); SPI_Write_Byte((unsigned char)(addr_on_page>>8)); SPI_Write_Byte((unsigned char)addr_on_page); SPI_Write_Byte(0); i = 0; do { *(buf + i) = SPI_Read_Byte(); i++; }while(i<bcnt); AT45_OFF; } //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Запись данных в буфер //:::::::::::::::::::::::::::::::::::::::::::::::::::::: void AT45_Buf_Write(unsigned char buf_num, unsigned int addr_on_page, unsigned int bcnt, unsigned char *buf) { unsigned int i; AT45_ON; switch(buf_num) { case BUFER_1: SPI_Write_Byte(AT45_OP_BUFFER_1_WRITE); break; case BUFER_2: SPI_Write_Byte(AT45_OP_BUFFER_2_WRITE); break; default: return; } SPI_Write_Byte(0); SPI_Write_Byte((unsigned char)(addr_on_page>>8)); SPI_Write_Byte((unsigned char)addr_on_page); i = 0; do { SPI_Write_Byte(*(buf + i)); i++; }while(i<bcnt); AT45_OFF; } #define AT45_OP_BUFFER_1_WRITE 0x84 // запись буфера 2 #define AT45_OP_BUFFER_2_WRITE 0x87 // чтение буфера 1 #define AT45_OP_BUFFER_1_READ 0xD4 // чтение буфера 2 #define AT45_OP_BUFFER_2_READ 0xD6 // Буфер 1 в основную страницу памяти программы с встроенным стиранием #define AT45_OP_B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83 // Буфер 2 в основную страницу памяти программы с встроенным стиранием #define AT45_OP_B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 // Буфер 1 в основную страницу памяти программы без встроенного стирания #define AT45_OP_B1_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x88 // Буфер 2 в основную страницу памяти программы без встроенного стирания #define AT45_OP_B2_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x89 // Основная страница памяти программы сквозь буфер 1 #define AT45_OP_MM_PAGE_PROG_THROUGH_B1 0x82 // Основная страница памяти программы сквозь буфер 2 #define AT45_OP_MM_PAGE_PROG_THROUGH_B2 0x85 // автоматическая перезапись страницы через буфер 1 #define AT45_OP_AUTO_PAGE_REWRITE_THROUGH_B1 0x58 // автоматическая перезапись страницы через буфер 2 #define AT45_OP_AUTO_PAGE_REWRITE_THROUGH_B2 0x59 // сравнение основной страницы памяти с буфером 1 #define AT45_OP_MM_PAGE_TO_B1_COMP 0x60 // сравнение основной страницы памяти с буфером 2 #define AT45_OP_MM_PAGE_TO_B2_COMP 0x61 // передача основной страницы памяти в буфер 1 #define AT45_OP_MM_PAGE_TO_B1 0x53 // передача основной страницы памяти в буфер 2 #define AT45_OP_MM_PAGE_TO_B2 0x55 // регистр состояния #define AT45_OP_STATUS_REGISTER_READ 0xD7 // чтение основной страницы памяти #define AT45_OP_MAIN_MEMORY_PAGE_READ 0xD2 // последовательно чтение #define AT45_OP_CONTINUOUS_ARRAY_READ 0xE8 // очистка 528 байт страницы #define AT45_OP_PAGE_ERASE 0x81 // очистка 512 страниц #define AT45_OP_BLOCK_ERASE 0x50
-
2Harbinger явно кривая прошивка. У меня была проблема с переходом в командный режим. Но у вас явно не из этой оперы. При работе в CSD сначала тоже +++ не проходили. Как говориться - если ничего не получается, прочтите наконец инструкцию :) Почитал шит - написано, чтоб +++ нормально проходили надо не менее 1 секунды ничего не слать. После этого таймаута пулять +++. А паузу я теперь всегда ставлю после каждой команды, чтоб гарантированно работало на любых модемах.
-
Я работал с сименсом, обратил внимание, что частенько между парой команд надо вставлять паузы 200-300 млс. Не во всех комбинациях, конечно бывает, что вторая команда не выполняется. Но бывает и ничем иным не лечится как паузой.
-
Спасибо. Очень интересный код - вроде маленькой оси. Оказывается в яре есть функция смены порядка байтов __reverse. А я искал типа htons.
-
Недурственная идея. А сам алгоритм у вас как вышерассмотренный? Используете тоже одну функцию для всех частей IP пакета?
-
Статья конечно не основание. Я почитываю соответствующий RFC. В статье просто некоторые ньюансы рассмотрены. В частности сказано, что как и вашем коде процедура расчета чексум общая для всех частей IP пакета. Но вот у меня не получается хоть тресни. Не могу понять почему у вас работает и в фриварных стеках. Наверное забью я на эту общую чексум и буду пользовать для каждо части свою процедуру. По крайней мере так сходится.
-
Спасибо, попробую.
Увы не сходится. Я смотрел снифером пакет:
volatile unsigned char buf[] = { 0xC0, 0xA8, 0x01, 0x08, //src addr 0xC0, 0xA8, 0x01, 0x0E, //dst addr 0x11, 0x42, 0x13, 0x88, //Сам TCP пакет всего 25 октетов 0x97, 0xD4, 0xA2, 0x11, 0x1B, 0x01, 0x1A, 0x63, 0x50, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x31, 0x31 };
Для него контрольная сумма 0x04EA. Может под нетбиосом как-то по другому считается?
Зато контрольная сумма сходится если посчитать этой процедуро предварительно tcp_crc = 6 + 25.
void Calc_TCP_CRC(unsigned char *buf, unsigned int len, unsigned int *tcp_crc) { unsigned long crc = *tcp_crc; unsigned int *ptr_to_buf = (unsigned int*)buf; unsigned int i, tmp; i = 0; do { tmp = (*(ptr_to_buf))>>8; tmp += (*(ptr_to_buf++))<<8; crc += tmp; i += 2; }while(i<len); if((len/2) & 1) crc += *((unsigned char*)ptr_to_buf); crc = (crc >> 16) + crc & 0xffff; crc += (crc >> 16); crc=(unsigned int)(~crc); *tcp_crc = (unsigned int)crc; } volatile unsigned int tcp_crc = 6 + 25; Calc_TCP_CRC((unsigned char *)&buf, 33, (unsigned int *)&tcp_crc);
По сути дела она работает как и ваша. Просто хотелось бы иметь одну процедуру. которая считала бы и для IP и для TCP как в вашем случае. в приаттаченой статье тоже говорится что одна функция. Не могу понять чего у меня не работает.
-
Не забыл. Я перед расчетом инициализирую чексум числом 6 + длина TCP и натравляю процедуру на начало IP адресов в буфере. Попробовал за основу взять расчет IP чексум, но менять порядок 16 битных данных. Стала сходиться. Можно было-бы забить. но где гарантия, что в другой среде не будет проблем. Еще посомтрел в микроайпи и лвайпи не меняется порядок. Да и статью почитал одну в которой сказано, что от изменения порядка 16 битных опрерандов контрольной суммы изменяется толькло порядок байтов результата.
-
Пытаюсь на меге гонять данные через GPRS. Не стал я пользовать готовые стеки типа айпи и лвп. Пишу свое приложение - порезаный tcp на нет. Так вот вопрос к тем кто разбирался с этой тематикой. Как правильно посчитать контрольную сумму для TCP пакета? Смотрел я упомянутые стеки. там для IP и TCP пакета вроде одинаковый алгоритм. Я позаимствовал их код. Снифером смотрел сетевой трафик в локалке - для TCP такой вариант не проходит - не сходится контрольная сумма.
-
Судя по мануалу на выходе clock&data - сначала прет синхронизация по RCL потом вместе с синхронизацией начинают передаваться данные по RDT по 4 бита + 5 бит паритета. Активный уровень - 0. Месага начинается символом B оканчивается F. В конце, дай Бог памяти, еще LRC которая получается ксором всех символов начиная с B и оканчивая F. В общем как только начинается срез на линии данных (Bh) начинаешь принимать биты складывая в тетрады, не забывая проверять паритет. Чисто с головки идет F2F. Простейшая штука - ноль и единица отличаются длительностью. Передается без синхронизации. Поэтому вначале прет много импулсов с одинаковой длительностью. Подробно расписано в исо7811.
-
Пример можно посмотреть у микрочипа в апликухах - AN724. Реализовано пингование - через PPP - > IP -> ICMP.
2Gematogen, после того как вы послали серверу запрос IP0.0.0.0 и он возвращает некий IP - попробуйте послать запрос с этим IP. По идее сервер должен вернуть NAK и новый IP. Этот IP и будет вашим. Вы пошлете REQ с этим IP, а сервер должен подтвердить и успокоиться.
-
В общем так. Есть два пути - или вы покупаете аппарат у которого на борту TCP/IP стек или пишите его сами. В первом случае весь гемор на себя берет аппарат. Вы только посредством ат команд гоняете данные через нужный вам протокол - хош фтп, хош хттп. Во втором случае придется попотеть. Та лабуда, что вы говорили - PPP протокола пакеты. Это типа самый низ. Вам надо после согласования всех параметров и процедуры авторизации гонять данные путем встраивания в пакет PPP пакетов IP и пакетов вышестоящих транспортных протоколов типа UDP и TCP. В общем данные вам надо будет упаковывать согласно спецификации стека TCP/IP. Путь немного более геморойный + надо исхитриться втиснуть в uC. Более менее стандартная реализация потребует ресурсов в первую очередь ОЗУ. Почитайте вообще инфу по TCP/IP исходники какого микроайпи или лвайпи, если пойдете по этому пути.
Про TCP/IP читать тут http://book.itep.ru/4/44/ip6_4411.htm и еще www.protocols.ru
-
После набора номера действительно валит RING. Все как и при голосовом соединении. Только после подъема трубы не OK приходит а CONNECT 9600/RLP. По этому в принципе можно даже селектировать тип звонков, хотя это не лучьший метод. CONNECT 9600/RLP кстати может приходить не так скоро - надо подождать. Можно прямо в гипертерминале потренироваться. А если приходит без вариантиов NO CARRIER - однозначно не подключена услуга.
-
Я работаю с XT55 там такая-же история. Первый уарт модуля более расширенный. Через второй нет возможности передавать CSD и факс. Но что касается XT55 там в GPS части живет TCP/IP стек. Таким образом для его использования уарт GPS части (там их тоже 2) соединяется с первым уартом GSM. Работаем с модемом в данном случае через второй уарт GSM. Может и с TC65 нечто вроде. А оптимизировать CSD - вряд ли.
TCP/IP + ATMEGA128 + CS8900
в AVR
Опубликовано · Пожаловаться
Понятно это. Получается надо брать вроде реалтековской микрухи или инного изернет контроллера с обвязкой и подключать к моей меге? Или есть инной способ? Я имею ввиду вот что - виртуальных портов встречал массу. Есть ли в природе прожка - мосто между ланом и ком портом, которая не режет заголовки, а отправляет в порт и наоборот.