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

vladimir_orl

Участник
  • Постов

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

  • Посещение

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


  1. 1) Даталоггер - в моём понимании читает значения линий (цифровых) в определённые значения времени. простенький цифровой осциллограф. А дальше уже на данные компьютере просматриваю что и как. 2) Я все переменные объявил как register. В листинге посмотрел - по честному в регистрах находятся. 3), 4) Попробую рискнуть без сохранения контекста поработать. 5) Тем более что написание программ на ассемблере чревато сложноуловимыми багами. 6) Да. Скорее всего буду сохранять значения линий во время ISR, а в основном теле уже смотреть. 3в) Можно что-нибудь ещё придумать. Например не логировать ничего - вам действительно нужны эти байты? Может эту задачу и решать-то не надо? Лучший выход - купить хороший цифровой осциллограф. Или PCI плату сбора данных... Пробую сам сделать на ARM LPC, но пока не доделал.
  2. Спасибо большое. Это очень хорошо. Дальше буду смотреть по документации.
  3. Здравствуйте. Использую связку STK500 + mega128 + AStudio6 в качестве даталоггера. По прерыванию INT2 читаются значения двух пинов. Вот такой простой код: ISR (INT2_vect) { m_master_byte |= (PINF & 0x01); m_slave_byte |= (PINC & 0x01); if (m_bit_counter <= 7) { ++m_bit_counter; if (m_bit_counter <= 7) { m_master_byte <<= 1; m_slave_byte <<= 1; } else { a_master_byte_array[m_byte_counter] = m_master_byte; a_slave_byte_array[m_byte_counter] = m_slave_byte; } } else { m_master_byte = 0; m_slave_byte = 0; m_bit_counter = 0; ++m_byte_counter; } } Но AVR GCC как известно наворачивает сохранение и восстановление контекста при работе с подпрограммами, вот касок листинга: 00000204 <__vector_3>: 204: 1f 92 push r1 206: 0f 92 push r0 208: 0f b6 in r0, 0x3f; 63 20a: 0f 92 push r0 20c: 11 24 eor r1, r1 20e: 0b b6 in r0, 0x3b; 59 210: 0f 92 push r0 212: 8f 93 push r24 214: 9f 93 push r25 216: ef 93 push r30 218: ff 93 push r31 ... собственно сама работа ... 246: ff 91 pop r31 248: ef 91 pop r30 24a: 9f 91 pop r25 24c: 8f 91 pop r24 24e: 0f 90 pop r0 250: 0b be out 0x3b, r0; 59 252: 0f 90 pop r0 254: 0f be out 0x3f, r0; 63 256: 0f 90 pop r0 258: 1f 90 pop r1 25a: 18 95 reti Т.е. время реакции на прерывание увеличивается. Подскажите, есть ли какие опции у AVR GCC, позволяющие отключать эту обёртку. А то уже думаю этот ISR в отдельном asm файле сделать. Но обработчик хоть и небольшой, придётся повозиться, да и перепроверять заново надо будет. Отказаться от ISR тоже не выходить, т.к. там в основном цикле while тоже кода много. Кто-нибудь сталкивался с таким? P.S. Кусок конечно у листинга, а не касок. Вроде текст перечитывал...
  4. Точнее в восьмом протеусе к примеру модель LPC2101 принимает axf файлы а модель LPC1311 этого не делает. Разбираюсь дальше.
  5. Да. Какая-я то мешанина получилась по этим кортексам. Седьмой протеус отлично работает с файлами .axf. А вот восьмой их почему-то не видит. Вот и приходится elf-файлы исать. Или протеус такой. Подскажите, можно ли устройства из 8-го протеуса перенести в 7-й. Иначе говоря, добавлять устройства кроме тех которые есть изначально. Хотя это уже совсем далеко от названия темы.
  6. Здравствуйте. Продолжаю тему. Если можно теперь вопрос по keil5. Скачал его. Установил. Скачал и установил дополнения совместимости с предыдущими версиями. Заработало. И тут обнаружил что не генерится elf файл. Подскажите что это и чем можно исправить. Хочется всё-таки в протеусе нормально симулировать. Заранее благодарен.
  7. В частности вот по этой ссылке Обсуждение здесь http://www.raspberrypi.org/phpBB3/viewtopi...=64&t=46413
  8. Спасибо. Вопрос возник в процессе исследования дисплея нокиа 5800. Там написано что у него интерфейс LoSSI и HiSSI. Вот я и смотрю как его подключить.
  9. Здравствуйте. Подскажите, где можно почитать про интерфейс SSI. А конкретнее про LoSSI и HiSSI. А то не нашёл ничего дельного, только общее описание, что это дескать "extended RS422". И что используется с энкодерами. А я слышал что сейчас по нему МК с дисплеями общается.
  10. У меня keil4. Контроллер - LPC1102. Создал проект, откомпилил. Запустил дебаггер. Смотрю перифералс. А там только Cjre Peripherals. Или так и должно быть? Хотелось бы и порты ввода-вывода и таймеры и etc.
  11. Я, скорее всего буду применять либо продукцию LPC либо ST. Спасибо. Скачал.
  12. Здравствуйте. Насколько я понимаю, вопросы по кортексам тоже сюда писать? Так как к кортексам только подступаю, а отладочную плату привезти обещают в обозримом будущем, то изучаю их по даташитам и кейлу (до 32 кБ он условно-бесплатный). Имеются совсем дилетантскае вопросы. Смотрю на примере LPC1102 и LPC1311. 1. Почему в кейле нет симуляции периферии кортексов? Или это я плохо смотрел? Можно ли как её подключить? Есть ли там понятие Fast GPIO? 2. Каковы наклюдные расходы (примерно в тактах) входа в обработчик внешних прерываний? Есть ли смысл программу писать а ассемблере? 3. Насколько я понял, блоки MAM отсутствует и FIQ отсутствуют? Или у кортексов с выборкой команд всё хорошо? Программа может выполняться только из флеша? 5. Можно ли настроить выход из спящего режима по SPI? По завершению приёма байта или по приёму первого бита? Или просыпание лучше завести от внешнего прерывания? 6. Сколько примерно тактов (если не сложно ответить) будет занимать каждая команда в таком вот простом коде: int i = 0; int datas[1000]; for (i = 0; i < 1000; ++i){ datas[i] = IOPIN; }
  13. Пошёл читать документацию. Всем большое спасибо за исчерпывающие ответы.
  14. Да. Похоже, пока не освоил CPLD, буду Cortex M0-M3 использовать. Скажите, а в CPLD есть аналог Power-Down и Wake-Up по внешнему прерыванию?
  15. Не хватает именно скорости. А именно скорости реакции на внешние прерывания. Т.е. в AVR-ках время отклика на внешние прерывания достигает ~6 тактов (минимальное). Плюс ещё прочесть состояние порта, выставить состояние порта. А собственно программка простая: в зависимости от очерёдности внешних прерываний и состояния одного пина на второй пин подаём 1 или 0 согласно таблицы. Там по осциллографу видно, что сдвиг между изменением уровня на входе (внешним сигналом) и реакцией на выходе составляет 1,5 мкс. Этого уже много. Вот я и думаю что делать. Смотрел в сторону FPGA, но это пока для меня тёмный лес. Конечно, в будущем придётся их ставить. А пока, действительно, посмотрел LPC11XX. Очень хорошие. Спасибо за совет. Думаю, они от LPC2000 не сильно отличаются. P.S. Смотрю LPC1102. До чего прогресс дошёл...
  16. Здравствуйте. Переделываю сейчас преобразователь интерфейсов. Программка простая, всё просто. Раньше там стояла ATtiny4313 с кварцем на 20 МГц. Её вполне хватало. В процессе работы потребовалось вдвое увеличить частоту передачи данных. И её скорости уже не хватает. Посоветуйте, что бы мне туда поставить? Чтобы и по скорости с запасом хватало и по цене приемлемо. Думал вначале LPC2101 использовать. Но это уже как-то несовременно. Или кортексы семейства LPC17ХХ может? Или может PIC-контроллеры? Одним словом, хотелось что-нибудь среднее между AVR и AM-ом. Посоветуйте, что лучше выбрать.
  17. Здравствуйте. Поднимаю уже давнюю тему дабы не плодить много новых. Сейчас приходится писать SPI slave на attiny (2313 или 4313), где, как я понимаю, SPI отсутствует. Режим работы третий. Т.е. вначале идёт выставление бита на шину, затем его чтение. Как я посмотрел в даташитах, в USI, в отличие от SPI, старший выставляемый бит уже отображён на линию (MISO). В SPI когда мы сдвигаем байт, его старший бит «уходит» на линию, а его место занимает следующий бит, как и полагается. В USI же старший бит уже отображён на линию. И когда мы работаем в режиме «сначала выставление(сдвиг), затем чтение» выставляется не старший а следующий за ним бит. Так вот я это понял. И подскажите про просыпание в tiny2313. Правильно ли я понял, что в режиме power-down мы можем просыпаться по состоянию "старт" на шине USI? Но это состояние возможно только в two-wire режиме? В режиме эмуляции SPI можно ли сделать просыпание?
  18. Читаю эту тему. И возникает вопрос. Вот для режимов когда вначале читаем, затем сдвигаем всё просто. А для режима когда вначале сдвигаем, затем выставляем - ка-то всё запутанно получается. А всё потому, что в настоящем SPI есть дополнительная защёлка, а в USI её нет. И самый старший бит уже "виден" наружу. И когда мы пытаемся сдвинуть байт, этот бит уходит. Думал-думал. И реализовал просто программный SPI. Кстати, в протеусе USI нормально эмулируется.
  19. Да. Работает-таки правильно. Просто я определял частоту по времени задержки реакции на внешнее прерывание, которое, как оказалось, не зависит от частоты.
  20. Вот. Выбирал и первую и последнюю строки. И внутренний rc-генератор на 8 МГц. Хотя, скорее всего, у меня где-то недоработано. Я думал, может уже кто-то сталкивался с таким. Сейчас ещё раз даташит просмотрю.
  21. Здравствуйте. Столкнулся со странностью. Имеется tiny2313. В составе STK500. Тактирую её от разных источников - внутренний 8 МГц, и внешний кварцевый генератор 16 МГц. Причём внешний пробую выставить во фьюзах и как генератор и как осциллятор. Смотрю, работает от них, т.к. когда снимаю внешний клок, мк останавливается. При этом, судя по работе мк (смотрю по осциллографу), его внутренняя частота совершенно не меняется. Такое впечатление что он запитывается от внешней частоты, делённой на 2. К сожалению, пока других кварцев нет, так что своё предположение проверить не могу. Подскажите, может ещё что настроить надо.
  22. Да. Вот только что попробовал Power Down на tiny2313. Ура! Ток потребления всего 1 мкА. Причём работает и по смене уровня. Если можно, объясните, в чём отличие этих понятий "фронт" и "смена уровня". И почему всё-таки работает и по спаду.
  23. Разобрался с режимом Idle. Там всё просто: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> unsigned long m_value = 0; unsigned long m_counter = 0; void my_delay(){ for (m_value = 0; m_value < 300; ++m_value){ asm("nop"); } } ISR(INT1_vect) // Выставление данных { asm("nop"); m_counter = 0; sleep_disable(); } ISR(INT0_vect) // Чтение данных { asm("nop"); m_counter = 0; sleep_disable(); } int main(void) { cli(); MCUCR = 0x0B; GIMSK = 1 << INT0 | 1 << INT1; DDRB = 0xFF; asm("sei"); while(1){ my_delay(); PORTB = 0; my_delay(); PORTB = 0xFF; if (++m_counter > 5){ // sleep_enable(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); set_sleep_mode(SLEEP_MODE_IDLE); asm("sleep"); } } } Светодиод помигал 5 раз, МК остановился. Кнопочку нажали - обработка прерывания, опять работаем. А вот с режимом Power Down как-то сложнее. Засыпает, но просыпаться не хочет. Где-то читал, что внешние прерывания только по уровню должны быть. Думаю, как бы их переключить. Точнее там в коде так: sleep_enable(); // set_sleep_mode(SLEEP_MODE_PWR_DOWN); set_sleep_mode(SLEEP_MODE_IDLE);
×
×
  • Создать...