Jump to content

    

NewMaestro

Свой
  • Content Count

    73
  • Joined

  • Last visited

Community Reputation

0 Обычный

About NewMaestro

  • Rank
    Участник
  • Birthday 02/02/1982

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. г.Минск Запад з/п по результатам собеседования, от 12 млн и выше на полную занятость. Рассмотрим, также, частичную занятость, либо удаленную работу. 1. PCB-дизайнер. Опытный пользователь Altium Designer. 2-4-6-слойные платы. Схемотехника. 2. Инженер-конструктор. Creo, Pro/E, Autocad, Inventor. Проектирование корпусов РЭА, металлоконструкций, пластмассовых изделий, разработка КД, ТУ Присылайте в личку информацию о себе и контактные данные.
  2. Как-то уж очень геморно. Интеррапты запрещать как-то читабельней. Хотя, тоже фигня... А если не в майне обнулять, то где? Для того, чтобы ошибки не было нужно только там же, где приращение происходит, т.е. в прерывании. A volatile - это в данном случае и не обязательно как я понимаю. volatile ведь нужно применять для переменных, которые могут быть изменены аппаратно. А тут только софтово, просто в прерывании. Я тему открыл потому, что ситуация эта неправильная какая-то. Я считаю, что компилятор должен об этом заботиться, а он игнорирует и заставляет юзера принимать доп.меры. Вот я и пытаюсь узнать как заставить компилятор правильно компилировать. ...Дело в том, что таких ситуаций немеренно, когда в функциях происходят сравнения данных, которые могут быть изменены в прерывании. Это ж повсеместно!! И что?? Перед каждым if, case, while, for... запрещать прерывание, чтобы переменная правильно сравнивалась??????....... Ну не гемор разве?... PS. zltigo тему быстренько перенес в ветку для ламеров, а сам как всегда определенного ответа дать не смог. Сколько помню его, все ходит вокруг да около и мало кому реально помогает. Я уж и сомневаюсь что он профессионал.
  3. Для какой платформы это проблемы компилятора? Другой метод? Какой например?
  4. Такой код: volatile unsigned int msCounter = 0; ... if (msCounter >= 1000) { msCounter = 0; //... } Иногда сравнение выполняется неправильно и входит в блок при значении msCounter = 768. Установлено, что при двухбайтном сравнении происходит прерывание, в котором инкрементируется msCounter, что и приводит в последствии к ошибке. if (msCounter >= 1000) { 00014A E9EB LDI R30,0x9B 00014C E0F1 LDI R31,0x01 00014E 8100 LD R16,Z ...тут прерывание и инкрементирование сравниваемой величины... 000150 8111 LDD R17,Z+1 000152 3E08 CPI R16,0xE8 000154 4013 SBCI R17,0x03 000156 F390 BRCS 0x13C ... Вопрос: Можно ли заставить компилятор автоматически разруливать такие вещи?? Или это нужно постоянно держать в голове и делать вот так: __disable_interrupt(); if (msCounter >= 1000) { msCounter = 0; //... } __enable_interrupt(); Заранее благодарен!
  5. Палыч, Вы монстр! Вы точно поймали суть, хотя вопрос я изначально поставил не корректно, не указав, что в дефайне стоит выражение, а не число. Спасибо за правильный ответ! Я целый день тупил с этим, а все дело оказалось просто в скобках. А я-то думал, что define на этапе компиляции вычисляется, а потом подставляется в выражение. А оказалось, что он сначала подставляеся в выражение, затем расставляются приоритеты операций, и потом только вычисляется. Без скобок приоритеты-то неверно расставлялись... :-) Спасибо. Вопрос снят!
  6. Верно. Так работает. Но только есть одно Но. На самом деле моя константа определяется не числом а выражением также состоящим из констант. И как только я подставлю вычесленный результат-константу в выражение в функции - тут же облом. Но если присвоить эту коснтанту переменной, и использовать в выражении переменную - то тоже все ок. Неужели без введения переменной нельзя обойтись. В Выражениях с константами я уже пробовал и приведение типов делать и UL подставлять - нифига! Работает только если в лоб число - например 720UL. А в выражении забивает компилер на этот UL.
  7. Не могу врубится в чем проблема. IAR 5.11. ATmega168 В h-файле объявлены константы: #define CONST1 8640 #define CONST2 720 В С-файле функция вида: void func(void) { static unsigned short w, x; w = (unsigned short)((unsigned long)CONST1 * x / CONST2 + 1); } w вычисляется не верно. Проверял операцию по действиям: CONST1 * x вычисляется верно, а вот деление уже возвращает фигню. Что поразительно, начинает считать верно, когда вместо CONST2 подставляю в код ее реальное значение 720: w = (unsigned short)((unsigned long)CONST1 * x / 720 + 1); Это работает. В чем прикол?
  8. Это ж так коряво! При серийном производстве для каждого микроконтроллера выставить fuse - это сколько ж лишних телодвижений нужно делать!! Я AVRISP mk2 юзаю из под AVR Studio. Как запарило эти фузы каждый раз ставить, это просто трындец! Одну плату отключаешь, другую подключаешь - фузы снова в состоянии по умолчанию. И снова прокручивай и проставляй. Умные люди, расскажите как вы делаете??
  9. Лежит в земле 10 км телефонной лапши. Нужно данные передавать туда и обратно. Скорость не важна. Кто как поступил бы?
  10. Шнуром этим я работаю больше года. Питание очень стабильное и отфильтровано хорошо. И вовсе я не такой чайник, как некоторые подумали. Про блокировочные конденсаторы я никогда не забываю. Обвязку даже не знакомых мне микроконтроллеров обычно я делаю правильно с первого раза. Чуть позже попробую отладку выполнять на другой плате, сам отладчик проверю. У меня подозрения либо на сам проц, либо на среду. Может там какой баг есть в версии 7.60
  11. PULL-UP

    Значит в вашем мультиметре села батарейка :)
  12. PULL-UP

    Это ерунда. Если пин настроен на вход и включен pull-up то напряжение на данном пине будет близким к напряжению питания. Если у вас 0.5 вольта, значит что-то не так. А, может, у вас внешняя цепь не дает поднятся напряжению до 5 вольт, т.е. ваш pull-up вместе с внешней цепью образует делитель 1:10 :)
  13. У меня все время стояла более старая версия MPLAB IDE. Там в настройках проекта была специальная галочка "link for ICD2". Eсли при компиляции перед отладкой эту галочку не поставить, то линкер расположит стек и память, которую юзает ICD2, в одно и тоже место. Помоему так... Такая ситуация вызывала сбой отладки при первом использовании стека, например при попытке вызова функции. Не так давно я поставил MPLAB IDE v6.60. Там в настройках проекта галочки "link for ICD2" уже нет. Я пытался выяснить что к чему и нашел на каком-то буржуйском форуме информацию о том, что в новых версиях опция "link for ICD2" заменена на переключатель Release<->Debug на основной панели среды. Помоему вполне логично. Ну а даже если задефайнить символ __ICD2RAM, как предлагается в сценарии линкера, то ситуация все-равно остается прежней. Глючит отладка и все. Иногда, когда запускаю в run, еще вот так пишет: MPLAB ICD 2 Ready Running Target ICD0154: Invalid target mode for requested operation (TM = Running) ICD0069: Debug: Unable to run target
  14. Господа боги по пикам, кто-нибудь сталкивался с проблемой сбоя ICD2 в процессе отладки ? Я пару лет работаю с dsPIC30. Обычно если что-то не так, то ICD2 просто не входит в дебаг-моде и все. А вот на днях возникла ситуация, когда программирование и вход в дебаг-моде происходит нормально, но при пошаговом исполнении дебаг периодически слетает. Пишет: Resetting Target MPLAB ICD 2 Ready Stepping Target MPLAB ICD 2 Ready Stepping Target MPLAB ICD 2 Ready Stepping Target MPLAB ICD 2 Ready ICD0082: Failed MPLAB ICD 2 operation ICD0151: Failed to sync memory (MT = Data) (Dir = 0x0) Слетает иногда при 2-3 шаге, иногда при 20-30... вобщем, такое чувство, что процесс случайный. Release на Debug я переключил, так что с резервированием ресурсов проца под ICD2 должно быть все ок. Какие есть мысли?
  15. А тем людям, которые сталкиваются с микроконтроллерами впервые, всегда нравится именно тот микроконтроллер, с которым столкнулись)) Все ж в сравнении познается. В моем универе часть "устаревших" преподавателей до сих пор не знают, что есть другие микроконтроллеры , кроме PIC, и другие интерфейсы, кроме RS-232. :) У меня дипломный проект был по частотному регулированию асинхронных двигателей. Сделано было на Микрочиповском dsPIC30F4012 (Motor Control & Power Conversion Family). После того, как я 10 минут рассказывал комиссии о 30 мипсах, об аппаратной релизации комплементарных ШИМ-каналов, об быстродействующем АЦП, способном сэмплировать синхронно 4 канала, о CAN-контроллере, об аппаратном умножителе и делителе, о DSP-ядре с помощью которого можно выполнять не только операции ЦОС, но и просто считать интеграл... один из первых вопросов был таким: "А почему Вы не сделали все это на PIC16 ?" Ответить было нечего. Я сказал, что на PIC16 дорого