Jump to content

    

IF_P

Участник
  • Content Count

    167
  • Joined

  • Last visited

Community Reputation

0 Обычный

About IF_P

  • Rank
    Частый гость

Контакты

  • Сайт
    http://www.sobos.in.ua
  • ICQ
    460707493
  1. Длина имени указателя IAR AVR

    Если будет такая ситуация, то выложу.
  2. Длина имени указателя IAR AVR

    Тогда как понять, что не меняя ничего в программе, просто еще раз запустив компиляцию, получаю работоспособный код?
  3. Длина имени указателя IAR AVR

    Я не сохранил версии программы с ошибкой, а сейчас все работает нормально. Причину установить не удалось. Я несколько раз менял и перекомпилировал. Один раз даже увидел, что оператор for "развернулся" в одну ассемблерную команду??? Возможно, что-то с компилятором. Были случаи неработоспособного кода после очередной компиляции. При рассмотрении листинга увидел, что часть кода не скомпилировалась (как бы закомментирована). При повторной компиляции все уже было нормально. Версия IAR AVR 6.80.5
  4. Длина имени указателя IAR AVR

    Соответственно, буфер и указатели глобальные с квалификатором volatile -?
  5. Длина имени указателя IAR AVR

    to jcxz Спасибо за Ваш подробный комментарий. Хочу тоже кое-что объяснить. Я именно так и поступаю. Я выношу описание всех констант флеша в отдельный файл. Здесь же рабочий вариант программы. Я их определил локально, что б можно было оперативно вносить изменения. Потом я перенесу их во флеш __flash char (без static). Это я заметил еще вчера и написал в 12 посте. Снова повторюся - программа еще "сырая" и в процессе написания. Я тоже стараюсь так делать. Когда-то читал статью о фирме TOYOTA и к чему там привело использование глобальных переменных. Но как в моём случае передать ISR информацию о том, что обрабатывать. Я передаю первый байт в п/п, а остальные уже в ISR. Тут я полностью согласен и стараюсь тоже придерживаться определенных правил: переменные - все маленькие буквы функции - первая буква каждого слова прописная константы, указатели, массивы - все буквы прописные Также стараюсь придерживаться определенных правил в оформлении кода и комментариев. Может где-то и ошибся, но по ходу отладки программы я это исправляю.
  6. Длина имени указателя IAR AVR

    Я как раз пытаюсь понять. Что касается volatile, я спорить не буду, возможно Вы правы. А вот по стилю хотел бы кое-что уточнить. VladislavS предложил; 1. AT-команды хранить во флэш. Для некоторых команд это подойдёт, тут я согласен. А вот для AT+Cxxx (где х= 0 - 127) все равно придется использовать формирование строки в п/п. 2. Не вычислять длину строки буфера, а воспользоваться нуль-терминированием. Но в программе обработки прерываний UART мне нужно будет передавать не только строки, но и 16-ные данные из другого буфера. В таком случае проще иметь длину буфера данных. Это займет немного машинного времени, но упростится программа обработки прерываний. Возможно, я в чем-то ошибаюсь. Буду рад выслушать Ваш комментарий. P.S. Вот только что посмотрел, что длину строки можно вычислять один раз перед выдачей в UART.
  7. Длина имени указателя IAR AVR

    Может я чего-то не понимаю. Чем я создаю себе трудности? Зачем везде сунуть оптимизацию? Объясните, пожалуйста, зачем в моём случае нужна оптимизация.
  8. Длина имени указателя IAR AVR

    Программа простая и не ограничивает меня ни по коду, ни по времени исполнения.
  9. Длина имени указателя IAR AVR

    А зачем volatile? Я не использую здесь оптимизацию.
  10. Длина имени указателя IAR AVR

    Ну во-первых, у каждого свой стиль программирования. Во-вторых , тут только часть кода. Поэтому вам не видно весь алгоритм. Скорости тут описаны как локальные для отладки. Но в будущем я их перенесу во флэш, т.к. они буду использоваться еще в другом месте. А там мне "AT+" ни к чему. В-третьих, для этой команды можна так использовать флэш. А как быть с командой "AT+Cxxx", где ххх вводится с пульта от 0 до 127. Не буду же я прописывать все варианты во флэш. Вот поэтому и остановился на таком варианте. Ну и наконец, указатель PU_OUT_BUF нужен именно глобальный, т.к. массив BUF_HC в этой п/п будет выдаваться в UART: UCSRB &=~ ( 1 << RXCIE ); UCSRB |= ( 1 << TXCIE ); P_OUT_BUF_HC = BUF_HC; UDR = *P_OUT_BUF_HC; P_OUT_BUF_HC++; А далее по прерыванию с использованием данного указателя. А что касается первого поста, то сейчас все работает. По шагам все менял и заработало. Причину пока не установил.
  11. Длина имени указателя IAR AVR

    А что б не расслаблялась. Пусть свои деньги отрабатывает
  12. Вот подпрограмма, которая формирует AT-команду. void Form_AT (void) { uchar i; char preamb[4] = "AT+"; char *P_IN; char BAUD_HC_12[8][7] = {"1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200"}; // P_OUT_BUF = BUF_HC; P_OUT_BUF_HC = BUF_HC; for(i = 0; i < 15; i++) BUF_HC[i] = 0x00; strcat (BUF_HC, preamb); switch (command) { case 3: strcat (BUF_HC, "B"); strcat (BUF_HC, BAUD_HC_12[baud_HC]); count_buf_HC = strlen (BUF_HC); break; case 4: strcat (BUF_HC, "C"); Bin_To_ASCII(channel_HC); P_IN = Rab.symv6.symv3; // P_OUT_BUF += 4; P_OUT_BUF_HC += 4; // for(i = 0; i < 3; i++) *P_OUT_BUF++ = *P_IN++; for(i = 0; i < 3; i++) *P_OUT_BUF_HC++ = *P_IN++; count_buf_HC = strlen (BUF_HC); break; } } В хидерном файле есть описание указателя char BUF_HC[15]; //char *P_OUT_BUF; char *P_OUT_BUF_HC; все нормально работает, если имя указателя P_OUT_BUF. Если меняю имя указателя на P_OUT_BUF_HC, то в цикле for ничего не происходит (не записывает в буфер и длина остается = 4) . В чем может быть причина?
  13. Если вам что-то подсказывает, то "душите это" в зародке. А то последствия могут быть непредсказуемыми.!!!(шутка) А если серьёзно, то читайте внимателно мои посты. Там я детально все описывал. И с такой средой как Algorythm Builder я вообще не знаком. Когда я только начал заниматься МК, то программировал на ассемблере (8051). Потом перешел на СИ (Franklin, Keil). Уже с AVR начал использовать IAR. С самого начала я сделал программатор PonyProg (LPT), которым пользуюсь до сих пор. И работает у меня все нормально. И на работе и дома и на командировочном ноутбуке есть еще LPT. Хотя смотрю, что стоит "оживить" свой AVR ISP MKII, так как на новых ПК этого старья (LPT) уже нигде нет. А Вам, уважаемый VladislavS, стоило бы больше доверять людям. Если у Вас будет свободное время, то можете просмотреть все мои сообщения на этом форуме. Я не так часто обращаюсь на форум, а только тогда, когда есть какие-то проблемы (а не "просто поговорить"). И я благодарен тем людям, которые помогали мне решать эти проблемы. Вот первую проблему в этой ветке я с Вашей помощью решил, а вот вторая проблема осталась не решенной (касательно AB). Пришлось сменить среду программирования, а заодно уже и программатор. Может это и к лучшему, т.к. перспектив у AB нет (уже нет поддержки). Я уже второй год рекомендую своему другу перейти на СИ. Он даже поставил себе IAR и написал кое-какие программы, когда надо было подключить датчик давления. Там в datasheet был пример на СИ. Но на этом все закончилось. Хотя сейчас он занимается ESP8266 и там есть (с его слов) СИ-подобный язык. Может это его подтолкнет к нормальному программированию на СИ. Вот в этом (ESP8266) он как раз помагает мне. Я пишу программы на AVR, а он на ESP8266. Ну вот пока и все. Это было маленькое лирическое отступление. Желаю Вам всего наилучшего и всем на этом форуме. P.S. Есть еще у меня вопрос по IAR, но это пока не так критично. Все работает, но дает предупреждение Warning[Pe1422]: multicharacter character literal (potential portability problem) Будет время, сформулирую вопрос, но уже, наверное, в новой теме.
  14. У меня этого программатора нет, я им не пользуюсь и с ним не разбирался. Я только приводил информацию от своего друга. Возможно, я был просто "испорченым телефоном". Если он в чем-то ошибался, то прошу извинить. А разбирались в начале не с программатором, а со средой (AB). Но оказалось, что оттуда запрограммировать нельзя. В итоге нашли клон AVR ISP MKII и с ним работем. А насчет "поговорить", то это не ко мне. Для этого у меня нет времени.
  15. Так я так и писал, что AB делает "свой" hex под свой программатор.