Jump to content

    

esaulenka

Свой
  • Content Count

    1245
  • Joined

  • Last visited

Community Reputation

0 Обычный

About esaulenka

  • Rank
    Профессионал
  • Birthday 01/25/1983

Информация

  • Город
    Маськва

Recent Profile Visitors

6945 profile views
  1. Какое-то странное лечение. По-хорошему, никаких пауз не надо. Если паузу убрать, переходник в компьютер отправленные байты видит? Вольтметр как запитан? Может, он просто запускается эти 1-2 секунды, а вы ему постоянно питание дёргаете? На первый взгляд, правильно всё написано... Предложения по отладке: - в прерывание на приём байта добавьте пересылку его в соседний порт. Скорость этого UART1 лучше поставить побольше (например, 115200), чтоб не мешал своими задержками. - также можно через некоторый промежуток (например, через секунду) после обмена с вольтметром отправить в этот UART1 всю интересующую информацию - в первую очередь, IndexStart / IndexEnd. - также ооочень рекомендую отладчик. Называется AVR JTAG ICE. Оригинал стоит каких-то неразумных, на мой взгляд, денег, но китайские клоны продаются за копейки (порядка 200 рублей). Правда, как работают клоны, я не знаю. "Пошагать" по программе у вас не получится (т.к. задействован вольтметр, а он ждать не будет), но посмотреть в любой момент значения переменных, да и за несколько секунд обновить программу - это очень упрощает работу.
  2. В том месте, где вы брали кольцевой буфер, не было написано большими буквами, что его размер обязательно должен быть кратен степени двойки? В противном случае "магия" с маской работает совсем не так, как должна. И вот это безобразие: while (1) { if(get_data() == 0) //Если функция вернула 0, значит, в массиве нет новых данных { asm("nop"); //И тогда мы ничего не делаем } else if(get_data() == 1) //Если функция вернула 1, значит, какие-то данные всё же получены { read_byte_from_ring(local_buffer,index_number()); //Читаем полученные от вольтметра данные в local_buffer  } else { break; } uart_1_send(local_buffer[0]); //Отсылаем данные из local_buffer на ПК  } Должно быть как-то так: while (1) { if(get_data() == 1) //Если функция вернула 1, значит, какие-то данные всё же получены { char local; read_byte_from_ring(&local, 1); //Читаем полученные от вольтметра данные в local_buffer uart_1_send(local); //Отсылаем данные из local_buffer на ПК  }  }
  3. Там какая-то наркомания с тем, куда в данный текущий момент указывает struct uip_udp_conn *uip_udp_conn; То есть я понимаю, конечно, что всё для фронта, всё для побе... лишь бы в мелкий 8-битник влезло, но с современными объемами памяти лучше использовать какие-то другие стеки, которые не позволят так легко стрелять себе в ногу.
  4. TXC. TXCIE - это разрешение соотв. прерывания, только что в памяти освежал. Но тут вопрос чуть другой - что сработает первым - опрос в while'е этого флажка, или прерывание с автоматическим его сбросом. Как-то не выглядит надёжно (хотя... никогда не интересовался временем реакции контроллера прерываний атмеги. Может быть, там с запасом... :-) ).
  5. Разумеется... :-( PORTE &= ~(1<<PORTE5); //Установить на PE5 низкий уровень (разрешение приёма) Тут правильно. PORTE &= ~(0<<PORTE5); //Установка на E5 выскокого уровня (разрешение отправки) А тут должно быть PORTE |= (1<<PORTE5); И, по-хорошему, это должно быть двумя микро-функциями Drv485_TxEn() и Drv485_RxEn() Мне не нравится эта идея. Хотя бы потому, что в ATmega есть ДВА регистра в UART'е - data register, куда записываются данные из программы, и shift register, из которого собственно идёт отправка. Вы вот можете поручиться, что прерывание по отправке первого байта сработает ДО того, как в буфер попадёт второй байт? Я, правда, не сильно понял, как вообще работает бит TXC. Если верить документации, он автоматически сбрасывается прерыванием. Т.е., непонятно, можно ли в принципе надёжно опрашивать его в основном цикле при включённом соотв. прерывании. Миллион лет не видел атмегу и никогда не видел rs485, но предлагаю следующий алгоритм: запрещаем прерываение по передаче; включаем передатчик MAX485, отправляем свои 8 байт, ждём TX Complete, выключаем передатчик. Предварительно читаем в даташите о необходимости заранее сбросить флаг TXC. Вот на фразе "после чего" у меня возникли некоторые сомнения. В коде нет никакого "после чего" - отправили данные, и сразу же записали в еепром всякий мусор. Что-то удивительное творится. А что такое databuffer и чему равна j в начале цикла? ...то мы сразу же наступаем на грабли с битовыми масками (см. в начале моего сообщения). А вообще - что вам помешало сразу прицепить параллельно ваш вольтметр, атмегу и usb-485 ? Хоть какая-то отладка... PS вопрос больше к общественности. В modbus сразу можно регистры устройства читать, или при появлении его в сети его надо как-то сконфигурировать? Может, дополнительно ещё и с этим проблемы?
  6. Изрядная часть GPIO у STM'ок - 5 volt tolerant, и туда можно безболезненно подавать куда бОльшее напряжение, чем 3 вольта.
  7. Это, простите, настоящий код с настоящего боевого проекта? Можно только позавидовать Вашей внимательности и усидчивости.
  8. FFT на STM32

    У меня всё никак не дойдут руки сделать что-нибудь полезное в плане ЦОС (на работе не нужно, а дома других забот хватает), но для этой задачи я бы смотрел в сторону работ дядьки Гёрцеля.
  9. ... а нечто под названием "member reputation" - есть :-)
  10. Спасибо. Потому что, очевидно, знать все мануалы невозможно. А на сайте ST я сразу не нашёл нужную табличку.
  11. Погодите-ка. Есть STM8L в корпусе мельче SO-8 ? Мне вот тоже контроллер нужен. Минимум функционала, минимум потребления, минимум цены и минимум места. Тинька устраивает (хотя ток надо перепроверить ещё раз), stm8s003f3u, в принципе, тоже.
  12. У objcopy из комплекта gcc, кстати, есть похожие --redefine-sym и --redefine-syms
  13. CAN шина STM32F103

    Вероятно, надо было задуматься сильно заранее о пропускной способности шины :-) А вообще, арбитраж в CAN штука очень простая и одновременно очень мощная. Арбитраж выигрывает тот узел, который передаёт dominant state (т.е. ноль). Таким образом, тот узел, который передаёт пакет с бОльшим количеством нулей в начале (т.е. с меньшим идентификатором) автоматически выигрывает арбитраж. Вам остаётся только назначить правильные идентификаторы "критичным датчикам".
  14. CAN шина STM32F103

    1) Да. Потеря арбитража - совершенно штатное явление в сколь-нибудь нагруженной шине. 2) Прочитать документацию. Bit 18 ALST2: Arbitration lost for mailbox 2. This bit is set when the previous TX failed due to an arbitration lost. Ещё там же есть биты 10 и 2. Впрочем, при нормальной работе с шиной эти флажки не очень нужны. Для диагностики разве что...
  15. CAN шина STM32F103

    Нет, нету там такого. Максимум - можно auto retransmit отключить, чтобы отправлять только одно сообщение, а не "долбить" шину без подтверждений, пока счётчик ошибок не переполнится. Своё сообщение тоже обратно не принимается, даже если кто-то "снаружи" выставил ACK. В STM'овском reference прямо указаны костыли, которые включаются в случае loopback mode. Каких-то других методов включить приём передаваемых пакетов я не знаю.