Перейти к содержанию
    

vesago

Свой
  • Постов

    749
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные vesago


  1. Понятно это. Получается надо брать вроде реалтековской микрухи или инного изернет контроллера с обвязкой и подключать к моей меге? Или есть инной способ? Я имею ввиду вот что - виртуальных портов встречал массу. Есть ли в природе прожка - мосто между ланом и ком портом, которая не режет заголовки, а отправляет в порт и наоборот.

  2. Если можно, то еще про звук. Как подключить его к микроконтроллеру, чтобы записывать и воспроизводить звук?

    По поводу звука - есть модемы с поддержкой цифрового ввода/вывода. Вам остается во флешку записать отсчеты и мокроконтнроллером гонять, но наверное это будет несколько дороже, хотя качественней. Можно проще - у атмела есть известная апликушка - запись, воспроизведение звука на датафлешь атмегой. Можно взять за основу. Очень удобно. Коммутировать ключами микрофон. Или на вход записи или на вход телефона для прослушки например фона. Ну или еще проще - закатывать в датафлешь вавки, а потом контроллером или шимом или r2r цапом проигрывать. В интернете соответствующих проектов куча.

  3. Имхо я особой нужды в TCP тоже не вижу. Как правило TCP требуют от нашего брата писатели верхнего софта из-за лени несколько усложненить верхний софт при работе с UDP. Кстати хотел спросить народ - я закончил написание TCP, чтоб передавать данные через GPRS. Теперь совершенно не представляю как отладить. Непосредственно с сервером опсоса дороговато как-то. Может кто поделится мыслями?

  4. Соглашусь с Harbinger - почти, что любой телефон. Мне лично нравятся сименсы 35, 45, эриксоны, сони-эриксоны. Пример реализации можно посмотреть здесь http://aly.projektas.lt/Projects/GSMA/GSMA.htm, http://www.gsmpager.spb.ru/index.html.

  5. GSM модемы или телефоны 3.3В. Можно взять в принципе uC тоже на 3.3В, можно взять на 5В через преобразователи уровней. Преобразователи уровней по разному можно делать. На резисторных делителях, на полевиках, на логике типа 74LVC125 - ноги толерантны к 5В. Мне нравится на полевиках, но из-за жадности делаю обычно на логике. Резисторы последовательно на пару -тройку кОм не повредят. В дш внимательно почитать про ноги ресета, зажигания и т.п. Некоторые модели работают только с ок и не пернеосят подтяжек. Особая тема - питание. Как правило применяется импульсный преобраз на LM2576 или вроде того. Если денег жалко, можно на mc34063. Как правило модуль в импулься 1.5А жрет. Средний ток оклоло 200 - 300 мА. Я запитывал и от lm317. Можно схему питать от 5В, а модуль через пару диодов. Звук - все просто если цеплять гарнитуру. Как правило достаточно внешних фильтров, которые есть в дш. Если нужна громкая связь, тогда + мотороловская микруха + усилок какой на TDA. В общем ничего особенного нет. Схемотехнически все как обычно.

  6. Начать наверное лучьше с ознакомления с TCP/IP, тогда думаю и с lwip проще разобраться будет. Благо, что читать не очень много. Понравилось описание на www.protocols.ru. Можно и самому написать. Вам надо к блоку данных добавлять заголовок TCP или UDP, к этому пакету добавить заголовок IP и пулять в сеть. И обратно. По большому счету ничего сложного. Геморно только TCP реализовать - много факторов влияет на смену текущего состояния TCP. Больше всего и читать по нем. Может вам будет достаточно UDP, тогда все проще, но придется "самому" контролировать доставку.

  7. По умолчанию мега 64 прикидывается мегой 103. Чтобы сделать ее мегой 64 с активацией ряда функций присущих меге 64 надо подправить соответствующий фуз.

     

    Бит проверить:

     

    #define bit3 3

     

    if((PINC & (1<<bit3)) == 0)

    {

    ...

    }

    else

    {

    ...

    }

     

    Или

    #define bit3 (PINC & (1<<bit3))

  8. Я подогнал вариант IgorKossak под свои комплектующие и утюжком заделал. Коллега мой вообще на макетке проводами посоединил. В ценности айса и в необходимости его наличия я соменвался пока не испробовал в деле. Сейчас не представляю как раньше без этого чуда обходился. Если денег на покупку жалко, не стоит жалеть какого дня на изготовление. Айс сторицей вернет потраченное.

  9. Вот пример моего работающего кода как раз на меге 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

  10. 2Harbinger явно кривая прошивка. У меня была проблема с переходом в командный режим. Но у вас явно не из этой оперы. При работе в CSD сначала тоже +++ не проходили. Как говориться - если ничего не получается, прочтите наконец инструкцию :) Почитал шит - написано, чтоб +++ нормально проходили надо не менее 1 секунды ничего не слать. После этого таймаута пулять +++. А паузу я теперь всегда ставлю после каждой команды, чтоб гарантированно работало на любых модемах.

  11. Я работал с сименсом, обратил внимание, что частенько между парой команд надо вставлять паузы 200-300 млс. Не во всех комбинациях, конечно бывает, что вторая команда не выполняется. Но бывает и ничем иным не лечится как паузой.

  12. Статья конечно не основание. Я почитываю соответствующий RFC. В статье просто некоторые ньюансы рассмотрены. В частности сказано, что как и вашем коде процедура расчета чексум общая для всех частей IP пакета. Но вот у меня не получается хоть тресни. Не могу понять почему у вас работает и в фриварных стеках. Наверное забью я на эту общую чексум и буду пользовать для каждо части свою процедуру. По крайней мере так сходится.

  13. Спасибо, попробую.

    Увы не сходится. Я смотрел снифером пакет:

    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 как в вашем случае. в приаттаченой статье тоже говорится что одна функция. Не могу понять чего у меня не работает.

    ___________________________________TCPIP.zip

  14. Не забыл. Я перед расчетом инициализирую чексум числом 6 + длина TCP и натравляю процедуру на начало IP адресов в буфере. Попробовал за основу взять расчет IP чексум, но менять порядок 16 битных данных. Стала сходиться. Можно было-бы забить. но где гарантия, что в другой среде не будет проблем. Еще посомтрел в микроайпи и лвайпи не меняется порядок. Да и статью почитал одну в которой сказано, что от изменения порядка 16 битных опрерандов контрольной суммы изменяется толькло порядок байтов результата.

  15. Пытаюсь на меге гонять данные через GPRS. Не стал я пользовать готовые стеки типа айпи и лвп. Пишу свое приложение - порезаный tcp на нет. Так вот вопрос к тем кто разбирался с этой тематикой. Как правильно посчитать контрольную сумму для TCP пакета? Смотрел я упомянутые стеки. там для IP и TCP пакета вроде одинаковый алгоритм. Я позаимствовал их код. Снифером смотрел сетевой трафик в локалке - для TCP такой вариант не проходит - не сходится контрольная сумма.

  16. Судя по мануалу на выходе clock&data - сначала прет синхронизация по RCL потом вместе с синхронизацией начинают передаваться данные по RDT по 4 бита + 5 бит паритета. Активный уровень - 0. Месага начинается символом B оканчивается F. В конце, дай Бог памяти, еще LRC которая получается ксором всех символов начиная с B и оканчивая F. В общем как только начинается срез на линии данных (Bh) начинаешь принимать биты складывая в тетрады, не забывая проверять паритет. Чисто с головки идет F2F. Простейшая штука - ноль и единица отличаются длительностью. Передается без синхронизации. Поэтому вначале прет много импулсов с одинаковой длительностью. Подробно расписано в исо7811.

  17. Пример можно посмотреть у микрочипа в апликухах - AN724. Реализовано пингование - через PPP - > IP -> ICMP.

    2Gematogen, после того как вы послали серверу запрос IP0.0.0.0 и он возвращает некий IP - попробуйте послать запрос с этим IP. По идее сервер должен вернуть NAK и новый IP. Этот IP и будет вашим. Вы пошлете REQ с этим IP, а сервер должен подтвердить и успокоиться.

  18. В общем так. Есть два пути - или вы покупаете аппарат у которого на борту 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

  19. После набора номера действительно валит RING. Все как и при голосовом соединении. Только после подъема трубы не OK приходит а CONNECT 9600/RLP. По этому в принципе можно даже селектировать тип звонков, хотя это не лучьший метод. CONNECT 9600/RLP кстати может приходить не так скоро - надо подождать. Можно прямо в гипертерминале потренироваться. А если приходит без вариантиов NO CARRIER - однозначно не подключена услуга.

  20. Я работаю с XT55 там такая-же история. Первый уарт модуля более расширенный. Через второй нет возможности передавать CSD и факс. Но что касается XT55 там в GPS части живет TCP/IP стек. Таким образом для его использования уарт GPS части (там их тоже 2) соединяется с первым уартом GSM. Работаем с модемом в данном случае через второй уарт GSM. Может и с TC65 нечто вроде. А оптимизировать CSD - вряд ли.

×
×
  • Создать...