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

VladimirYU

Свой
  • Постов

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

  • Посещение

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


  1. Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?

     

    Самый простой способ - использовать INT0, например, и сконфигурировать прерывание по изменению состояния ноги (нога на вывод), в результате - достаточно шевельнуть ножкой (изменив ее, скажем OUT'ом в PINx) и флаг прерывания установится; соответственно, когда будет разрешено прерывание INT0 - оно и произойдет. Но, к сожалению, INT0 и INT1 заняты, надо изобретать что-то другое.

     

    Вот мысль появилась использовать прерывание от компаратора, причем следующим образом:

     

    Компаратор штатно выключен (он не нужен в проекте), для установки флага прерывания от него использовать последовательность

    ACSR=(1<<ACD)|(1<<ACIS1)|(1<<ACIS0); //Comparator Interrupt on Rising Output Edge.
    ACSR=(1<<ACD)|(1<<ACIS1); //Comparator Interrupt on Falling Output Edge.

     

    Т.е. переключить туда-сюда "по фронту/по спаду". На идею натолкнула фраза

     

    в даташите.

     

    К сожалению, сейчас негде попробовать этот чит. Посему пара вопросов:

     

    1. Может кто делал такое и уже знает результат?

    2. Может у кого есть под рукой макеточка, проверить бы?

    3. А может кто гламурнее способ знает?

     

    А почему хочется именно пограммное прерывание, почему нелзя обычный вызов обработчика.

  2. Решение привел выше singlskv.

    А в начале обработчика ассемблерной вставкой сохраняйте регистры куда угодно. Только чем это поможет непонятно.

    Реализуемый, но жостаточно рискованный способ, можно задеть, например, глобальные переменные или static. Данный подход это первый шаг к откату на asm. Искать выход нужно в организации программы в целом.

  3. Все дело IMHO в разных способах организации стека. В ИАР он рганизован программно без использования регистра указателя стека, поэтому там St/Ld, а у вас фактически аппаратно с использованием регистра указателя стека, такова реализация компилятора. Боюсь, что никак эту особенность вам не обойти.

  4. когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, которые в свою очередь используются в прерывании, в результате стек слетает:( чуть расширю вопрос, есть ли какие нибудь дериктивы чтоб локальные переменные ни при каких условиях не занимали область памяти стека???

     

    может быть static поможет?

     

    может быть static поможет?

     

    или через heap. Сначала new потом обязательно delete.

  5. Не могу пройти по шагам, тут дело, видимо, даже не в вызове конкретной процедуры. Только что получил такое же сообщение, просто остановив отладчик. Плата при этом работает нормально. Так что дело совершенно определенно не в том, что кто-то переполняет стек, нет такого. Дело именно в ошибке, инициируемой самим отладчиком JTAG-ICE.

     

    Вы попробуйте воспльзоваться родным симулятором IAR или Студией, я думаю у вас будут те же самые ворнинги. ИМХО JTAG здесь не причем. Выбросите или "зашунтируйте" куски программы которые явно зависят от "железа", и вперед по шагам, как рекомендовал Сергей Борщ.

  6. Помогите, пожалуйста, советом!

    Столкнулся с непонятными эффектами при работе IAR AVR с отладчиком JTAG-ICE.

    При вызове одной из функций в программе происходит выпадение отладчика. То есть, работа как бы продолжается, но при попытке останова появляется следующее сообщение:

    Tue May 13 16:35:37 2008: The stack 'CStack' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90%.

    Tue May 13 16:35:37 2008: The stack 'RStack' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90%.

    Tue May 13 16:35:37 2008: The stack pointer for stack 'CStack' (currently DATA:0x00FFFF) is outside the stack range (DATA:0x000100 to DATA:0x000500)

    Tue May 13 16:35:37 2008: The stack pointer for stack 'RStack' (currently DATA:0x00FFFF) is outside the stack range (DATA:0x000500 to DATA:0x000900)

    При этом ранее все то же самое работал и с куда меньшим размером стека. Что удивительно для превышения размеров стека - плата с прошивкой совершенно нормально работает и далее. А вот отладчик уже ничего сделать не может. Сама процедура тоже не исполняется. Чем это может быть вызвано - ума не приложу :( Сейчас попробую откатиться на более старую версию, посмотрю, как это функционировало там. Процедура, которая вызывает сбой, имеет следующий синтаксис:

    TBool Print_Report(TReport __flash *PrReport);

    typedef struct

    {

    char name_fmt[80];

    TByte type;

    } TReport;

     

    Если у кого будут идеи - с удовольствием их выслушаю!

     

    Версия IAR AVR - 4.21A/W32 (4.21.0.3)

     

     

    Tue May 13 16:35:37 2008: The stack 'CStack' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90%.

    Tue May 13 16:35:37 2008: The stack 'RStack' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90%.

    Tue May 13 16:35:37 2008: The stack pointer for stack 'CStack' (currently DATA:0x00FFFF) is outside the stack range (DATA:0x000100 to DATA:0x000500)

    Tue May 13 16:35:37 2008: The stack pointer for stack 'RStack' (currently DATA:0x00FFFF) is outside the stack range (DATA:0x000500 to DATA:0x000900)

     

    Подобные предупреждения у меня встречались когда пытался создать статический локальный объект, для которого по мнению компилятора не хватало места в стеке. На железе тем не менее все работало. Переместив его в кучу (heap), сделав динамическим, предупреждения ушли. Мджет у вас нечто подобное.

  7. Ну и чему вы удивляетесь?

    int упорядочен по 2 байта, вот и получите!

     

    Если уж приводить к типу, то хотя бы к такому же, то есть unsigned long long tmp =(unsigned long long)data

     

    Пробовал, не помогает, да это и не принципиально ИМХО. А выделенную фразу поясните, если нетрудно. Версия 4.12 для AVR.

  8. В IAR AVR 4.12 столкнулся вот с чем:

     

    // имею

    int data = 0xabd6;

     

    // хочу увеличить разрядность до 32 без знака

    unsigned int tmp = (unsigned int) data;

     

    // получаю tmp = 0x0000abd6, что и хотел

     

    а теперь вместо 32 захотел увеличить разрядность до 64 без знака из исходного data

    unsigned long long tmp = (unsigned int) data;

     

    // получаю tmp = 0x6dba000000000000

     

    ?????????????

  9. Здравствуйте!

    Возникла задача, схемно и програмно (желательно на ASM) реализовать передачу данных с AVR на стандартную USB флешку.

    Посмотрите в сторону микросхемы VNC1L, на АСМе конечно нелегко будет. Зато все проблемы с ФАТ уже решены. Имеется набор стандартных прошивок под разные задачи. Сам использую и пока без проблем.

  10. Не просто.

     

    Поэтому контроллер должен быть обязательно сброшен при напряжении питания ниже критического.

    Полностью согласен. При этом, из собственного опыта, не доверяю ни каким BODам, а ставлю внешний супервизор. +20 рублей, но про такие проблемы забываешь раз и навсегда.

  11. Я тоже думаю что вроде ничего не написано про какие то ограничения. Буду пользовать. Не хочется делители ещё городить, когда таймера свободные в МК есть.

     

    Вполне корректно, только ИМХО контроллер полностью загружен только одной указанной задачей.

  12. Люди подскажите какую микросхему можно (нужно) испоьзовать для следующих целей:

    из микроконтроллера данные должны передоваться на одно из четырех устройств по RS 485, перед преобразователем в RS485 нужно делать выбор канала (1 из 4), что для этого можно применить.

    ИМХО, ничего не нужно. Все решается на уровне протокола обмена, MODBUS например.

  13. Прошу помощи в освоении шины TWI.

    В какой-то момент связь между мастером и слейвом прекращается, момент этот может прийти через 5с работы, а может всю ночь простоять (не устойчиво).

     

    В одном из вариантов документации на TWI в AVR прочитал следующее:

     

    .....

    TWBR должен быть равен не менее 10, если TWI работает в ведущем режиме. Если TWBR меньше 10, то ведущий может генерировать некорректное состояние на линиях SDA и SCL. Проблема возникает при работе в ведущем режиме при передаче условий СТАРТ+ПОДЧИН_АДР+ ЧТЕНИЕ/ЗАПИСЬ подчиненному.

    ........

     

    Речь идет о выборе одного из параметров определяющего SCL мастера. Не ваш ли это случай?

  14. Господа! Поясните, пожалуйста, смысл процедуры синхронизации контроллера с VNC1L. Необходима ли подобная процедура при использовании FIFO интерфейса?

    Если я правильно понял речь идет о команде ECHO? Кроме как получение обратно того, что послал ни какой синхронизации, на мой взгляд, не просматривается. Косвенно можно судить о готовности VNC1L к работе, хотя это можно сделать прочитав сообщение STARTUP. А вообще то загадка, что они хотели.

  15. The entire message frame must be transmitted as a continuous stream. If a silent

    interval of more than 1.5 character times occurs before completion of the frame,

    the receiving device flushes the incomplete message and assumes that the next

    byte will be the address field of a new message.

    Similarly, if a new message begins earlier than 3.5 character times following a

    previous message, the receiving device will consider it a continuation of the

    previous message. This will set an error, as the value in the final CRC field will not

    be valid for the combined messages..

     

    Выдержка из оригинального описания.

  16. да так и сделал уже

     

    Всем кто откликнулся спасибо. :biggrin:

     

    Можно ввести аппаратное управление потоками сигналы RTC и CTC, тогда проблем с рассинхронизацией вообще не должно быть. Правда потребуются дополнительные аппаратно-программные затраты.

  17. А ещё может кто по памяти скажет приёмник начинает принимать байт

    по фронту старт бита или по уровню (если при включении приёмника уже идёт старт бит)

     

    Синхронизация приемника начинается по фронту.

     

    When the clock recovery logic detects a high (idle) to low (start) transition on the RxD

    line, the start bit detection sequence is initiated.

     

    выдержка из DS на ATmtga128 стр.186 рис. 83

  18. Всем привет!

     

    Тож пытаюсь собрать схему управление BLDC на этих МК :)

    За основу взял схему ATAVRMC100. Как я понял, у них она построена на AT90PWM3 ревА. Но ведь в errata на этот МК (версия даташита 4317H–AVR–12/06) сказано (п.5), что

     

    5. PSC: Output Polarity in Centered Mode

    In centered mode, PSCOUTn1 outputs are not inverted, so they are active at the same time as PSCOUTn0.

    Workaround:

    Use an external inverter (or a driver with inverting output) to drive the load on PSCOUTn1

     

    А ATAVRMC100 ведь использует именно этот режим! Так как же у них оно работало, если в схеме нет инвертора?

     

    И еще, все пункты в errata относиться к AT90PWM3 ревА, а в ревБ это все уже исправлено? Т.е. лучше использовать ревБ?

     

    Уже как раз заказывать нужно эти МК, а я немного запутался в их багах:)

     

    1. Это еще не все, в rev. A у меня не работает AMP1.

    2. Управляете только верхними ключами, а на нижние подаете задание обеспечивающее постоянно открытое состояние ( естественно соблюдая закон коммутации).

  19. На вашем месте я бы взял совершенно оффтопичный частотник Altivar11 и не изобретал бы самопал ради одного станка.

    +1

    Судя по постановке вопроса, Вы с электроприводом далеко не на "короткой ноге", поэтому на собственную разработку потратите немало времени. Рекомендую для вашей задачи посмотреть в в сторону серийных частотников, выбор огромный от достаточно дорогих до дешевых, LG например.

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