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

VladimirYU

Свой
  • Постов

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

  • Посещение

Весь контент VladimirYU


  1. МК в конечном счете лишь часть системы, может быть и основная, но только часть. Опыт показывает, что тестирование отдельных элементов системы, маоэффективно. Даже работающую микросхему можно неправильно впаять. Достаточен элементарный входной контроль. А вот тест системы это как раз то, что отвечает за конечный результат и он, как правило, требует разработки не только тестового ПО, но и определенного дополнительного оборудования.
  2. Все очень просто, привожу не код, а алгоритм: Исходно имеем Summator - переменная двойной длины, Current - результат текущих измерений (данные с прибора, АЦП ...) Previos - предыдущий фильтрованный результат Далее error = Current - Previos Summator = Summator +error Previos = Summator>>N N определяет степень фильтрации ( количество результатов по которым идет усреднение). Ньюансы кода, как понимаете, зависят от формы предсавления результатов (разрядность, тип и т.д.) А математика за этим следующая 1/(TS+1) представить можно как интегратор 1/TS охваченный единичной отрицательной обратной связью. W(S) = Wпр(S)/(Wпр(S)*Wос(S) + 1)
  3. Можно испоьзовать алгоритм апериодического звена. Строится он по принципу интегратора ( сумматора накопителя) охваченного отрицательной обратной связью. Это позволяет уйти от скользящего массива, правда требуется сумматор (интегратор) двойной длины по сравнению с длиной результатов измерений и переменная для хранения предыдущего фильтрованного результата.
  4. Пока ничем, так причину и не понял. Пока есть возможность буду копаться дальше. Прицепил к нему JTAG MKII так виснет зараза, что из под IAR 4.12, что из под Студии.
  5. Два года назад, попались кристаллы, которые не реагировали на WDT. Т.е. его ни как было не запретить пришлось везде _WDT() вставлять. Не смертельно, но все же. Те же самые меги64 вели себя, согласно DS. Покупал микросхемы в ЭФО СПб. Тему обсуждал и Игорем Кривченко ( менеджер по Атмелу ЭФО), Атмел ничего не ответил. Сейчас похожая история с AT90PWM3, здесь эту тему уже поднимал не только я. Атмел опять молчит. Коллеги проверили мой код, вроде все чисто. Кристалл то удобный для приводческих приложений, но похоже тот ревижен, который достался еще сырой. Но это ИМХО.
  6. После while(1) не забудь _WDR(), в 128 приходилось на кривой WDT налетать, у Атмела все может быть.
  7. Полярность RESET

    Полностью согласен.
  8. AT90PWM3

    На выходных прицеплю ПВМ3 к JTAG MKII, по твоему совету выкину все из проекта кроме кнопок, посмотрю что будет. Результаты сообщу.
  9. AT90PWM3

    Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и MODBUS сверху пристроил, а на фигне застрял. Заранее спасибо откликнувшимся. __C_task int main() { InitWDT(); // инициализация Watchdog __enable_interrupt(); // глобальное разрешение прерываний /* Фоновый цикл: 1. Читаем направление с джампера J1 2. устанавливаем здание на скорость ( считываем с потенциометра) 3. Проверяем состояние кнопок J2 - пуск, J3 - стоп */ static char keyBuffer ; // буферы для опроса кнопок static char keyState ; // текущее состояние кнопок static char pollCounter = POLL_QUANTITY; // счетчик опосов while (1) { _WDR(); // 1. motor.SetDirection ( motor.ReadDirection () ); // установили направление // 2. // motor.SetupSpeed ( adc.GetPotentiometr() ); // устанавливаем задание на скорость /* 3. Проверяем состояние кнопок ПУСК, СТОП. Если двигатель включен: нажата ПУСК - ничего не делаем, нажата любая СТОП - переменную состояния в OFF, двигатель выключаем. Если двигатель выключен: нажата ПУСК и не нажата ни одна СТОП - переменную состояния в ON, нажата СТОП - ничего неделаем. Опрос проводим POLL_QUANTITY раз если результат не изменяется фиксируем состояние кнопок */ // Читаем состояние кнопок и пакуем их в keyState в формате MSB <- 0 0 0 0 STOP_FAIL STOP RUN_FAIL RUN <-LSB // два младших бита ПУСКовые, 2 и 3 биты СТОПовые keyState = PINB & 0x1c; // выделяем кнопки на порте B PINB_Bit4 , PINB_Bit3, PINB_Bit2 keyState >>=2; // сдвигаем keyState |=( ( PIND & 0x40)>>3); // кнопкой с порта D (PIND_Bit6) // Проверяем состояние кнопок if ( keyState == keyBuffer ) pollCounter--; else { keyBuffer = keyState; pollCounter = POLL_QUANTITY; } // перезапускаем опрос // Смотрим закончен ли опрос if ( pollCounter == 0) { pollCounter = POLL_QUANTITY; // переустанавливаем счетчик switch ( motor.GetState() ) // смотрим состояние двигателя { case ON: { // проверяем нажата ли хоть одна кнопка СТОП if ( (keyBuffer&0x0c) != 0x0c ) motor.TurnOFF(); // выключаем } break; case OFF: { // проверяем условие пуска ( не нажата ни одна СТОП)&(нажата любая ПУСК) motor.SetupSpeed(0); if ( ( (keyBuffer&0x0c) == 0x0c ) && ( (keyBuffer&0x03) != 0x03) ) motor.TurnOn(); // включаем двигатель } break; default: break; } } } return 0; }
  10. AT90PWM3

    Спасибо за предложения обязательно попробую, но. Я полагал, что макросы определяющие имена PINB_Bit2 и тому подобное позволяют использовать их как булевы переменные, если я не прав, поясните доходчиво, чтобы в голове ясность наступила. Глаз на самом деле замылился, да и мозги уже клинит. Я в IAR подобные конструкции использовал не один десяток раз никогда не было проблем, может быть я удачно ходил по минному полю? Хотелось бы понять.
  11. AT90PWM3

    __C_task int main() { InitWDT(); // инициализация Watchdog __enable_interrupt(); // глобальное разрешение прерываний /* Фоновый цикл: 1. Читаем направление с джампера J1 2. устанавливаем здание на скорость ( считываем с потенциометра) 3. Проверяем состояние кнопок J2 - пуск, J3 - стоп */ static bool stopBuffer = false; // буферы для опроса кнопок static bool runBuffer = false; static char pollCounter = POLL_QUANTITY; // счетчик опосов while (1) { _WDR(); // 1. motor.SetDirection ( motor.ReadDirection () ); // установили напраление // 2. motor.SetupSpeed ( adc.GetPotentiometr() ); // устанавливаем задание на скорость /* 3. Проверяем состояние кнопок ПУСК, СТОП. Если двигатель включен: нажата ПУСК - ничего не делаем, нажата СТОП - переменную состояния в OFF. Если двигатель выключен: нажата ПУСК и не нажата СТОП - переменную состояния в ON, нажата СТОП - ничего неделаем. Опрос проводим POLL_QUANTITY раз если результат совпадает фиксируем состояние кнопок */ // Проверяем состояние кнопок if ( (runBuffer == RUN) && (stopBuffer == STOP) ) pollCounter--; else { runBuffer = RUN; stopBuffer = STOP; pollCounter = POLL_QUANTITY; } // перезапускаем опрос // Смотрим закончен ли опрос if ( pollCounter == 0) { pollCounter = POLL_QUANTITY; // переустанавливаем счетчик switch ( motor.GetState() ) // смотрим состояние двигателя { case ON: { if ( !stopBuffer ) motor.TurnOFF(); // выключаем } break; case OFF: { if ( (!runBuffer) && stopBuffer ) motor.TurnOn(); // включаем двигатель } break; default: break; } } } return 0; } // как определяются и инициализируются RUN и STOP см. предыдущие посты. Буду рад если ткнешь в ошибку. Есть еще более просой вариант без антидребезга, результат тот же.
  12. В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри.
  13. Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме.
  14. AT90PWM3

    В программе есть функция опроса этих двух кнопок, так вот, когда эти кнопкм подключены к одной паре пинов МК (первый выриант) все нормально, когда к другой с соответствующими с переопределениями RUN, STOP и изменениями в инициализации пинов портов функция не работает. Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET. Заранее спасибо за любые идеи.
  15. AT90PWM3

    11.2.1 Configuring the Pin Each port pin consists of three register bits: DDxn, PORTxn, and PINxn. As shown in “Register Description for I/O-Ports” on page 77, the DDxn bits are accessed at the DDRx I/O address, the PORTxn bits at the PORTx I/O address, and the PINxn bits at the PINx I/O address.The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one, Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is configured as an input pin.If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pinThe port pins are tri-stated when reset condition becomes active, even if no clocks are running If PORTxn is written logic one when the pin is configured as an output pin, the port pin is driven high (one). If PORTxn is written logic zero when the pin is configured as an output pin, the port pin is driven low (zero). Это из DS на PWM3, похоже в моем случае собака где то в другом месте порылась, буду искать. Заранее спасибо всем откликнувшимся.
  16. AT90PWM3

    Ну это можно и так: while (1) PORTB ^=0xff; Только поясни пожалуйста, что даст постоянное переключение порта с входа на выход и обратно? Сорри, не свхода на выход, а включение и отключение внутренней подтяжки на 5в?
  17. AT90PWM3

    Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не B), одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант: ..... #define RUN PINB_Bit2 #define STOP PIND_Bit6 Далее в инициализации DDRB_Bit2 = 0; // вход PORTB_Bit2= 0; // HI-Z DDRD_Bit6 = 0; // вход PORTD_Bit6= 0; // HI-Z Все работает Второй вариант: #define RUN PINB_Bit3 #define STOP PINB_Bit4 Далее в инициализации DDRB_Bit3 = 0; // вход PORTB_Bit3= 0; // HI-Z DDRB_Bit4 = 0; // вход PORTB_Bit4= 0; // HI-Z Ни хрена не работает. Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле. Альтернативные функции пинов в программе не используются. Ничего не понимаю. Пробовал на трех кристаллах в разных платах .
  18. Fatal error(15)

    У меня часто так, но проблем не было. Какая вепсия IAR?
  19. mega32l

    Может ошибаюсь, но вроде для printf_P() надо не забыть putchar() прописать (для IAR).
  20. Fatal error(15)

    Входной файл многократно определен. Проверьте в первую очередь h-файлы проекта, не встречаются ли там вложенные одни и те же файлы. Как проходит компиляция и компановка при Release.
  21. Что еще в проекте? Проверьте модель памяти, нужна модель small, провенрьте конфигурацию процессора -cpu=m128, ATmega128 ( закдадка target в General options)
  22. В опциях проекта не забыли поставить галку разрешения работы с внешним ОЗУ и выставить конфигурацию адаресов
  23. AT90PWM3

    Шить PWM3 спокойно можно AVReal..ом, это не проблема. Предлагаю обсудить грабли и непонятки. Например, сделал проект на PWM3 (кручу вентильный двигатель), все вроде нормально, но AMP1 синхронизировать от PSC не получается, приходится выворачиваться через (_|_).
  24. Пример передачи символа из DS не привязан к конкретной реализации интерфейса, сам налетел на эти грабли с RS485. Смотри предыдущие сообщения ( биты окончания передачи и освобождения буфера) и все будет нормально.
×
×
  • Создать...