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

controller_m30

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о controller_m30

  • Звание
    Местный

Контакты

  • Сайт
    http://
  • ICQ
    0

Посетители профиля

4 555 просмотров профиля
  1. Странное поведение ATtiny26

    Ещё вариант такой. По тексту программы, на светодиод выводится значение старшего бита 1-го канала АЦП. А из пояснений в первом посте следует, что переменный резистор подключен к каналу 0 АЦП, а канал 1, видимо, "висит" в воздухе. И возможно на этом 1-м канале, в неподключенном состоянии, напряжение больше пол-питания, и потому старший бит (и светодиод) всегда равны 1.
  2. Странное поведение ATtiny26

    В тексте программы не видно команды инициализации порта A на вывод (а светодиод подключен к PA7, как я понял). Т.е. PA7 работал как вход. Поэтому, точно сказать отчего горел светодиод, трудно. Может от Pull-Up резистора входной линии. Или, из-за отсутствия питания на AVCC, что-то "глючило" на портах ввода-вывода. А если светодиод подключен анодом к VCC а катодом к порту, то при переводе порта на ввод, светодиод тоже может светиться в пол-яркости.
  3. Странное поведение ATtiny26

    Два предложения. 1. Проверьте питание на ноге AVCC - равно ли питанию VCC контроллера? Попробуйте добавить конденсатор на эту ногу 0.1uF, и индуктивность 10uH (как в даташите на стр.106). 2. Если предыдущее не поможет. И если нет возможности быстро подключить дисплей, чтобы посмотреть регистры ADC и PWM. Добавьте на выход PWM схемку как на картинке (я пользуюсь номиналами из нижней схемы, но и номиналы верхней схемы тоже рабочие). Это для того, чтобы значения PWM смотреть в виде напряжения мультиметром напрямую. При VCC=5 вольт, и PWM=255 - на выходе цепочки будет 5 вольт. При PWM=128 - на выходе будет 2.5 вольт (пол питания), а при PWM=0 - на выходе 0 вольт. Т.е. получится такой себе DAC. Дальше попробуем измерить значение внутреннего источника 1.18v, и вывести на выход PWM - посмотрим сколько покажет. Потом тоже самое, но с опорным напряжением ADC=2.56v. Сколько покажет?
  4. Странное поведение ATtiny26

    Попробуйте значения, считанные из АЦП, сначала поделить на 2 (команда LSR Rx), а потом загружать в PWM. Что получится?
  5. Странное поведение ATtiny26

    Уточните, какие напряжения: 1. Питания контроллера 2. Переменного резистора, которым регулируете PWM 3. При каком напряжении на выходе резистора PWM сбрасывается в 0? Интересно узнать именно напряжение, а не просто какая часть шкалы.
  6. Нужно подать на (VS-) отрицательное напряжение. Или, раз сделали "виртуальную землю" на делителе - подключать резистор R3 к этой "виртуальной земле", а не к настоящей.
  7. atmega 328 странно дохнет

    Не знаю что и посоветовать. Я программирую на ассемблере, а к этому прилагаются и всякие познания о состоянии "железа" в разных ситуациях. Это обычная рутина программирования на низкоуровневом языке :laughing: А так чтоб статьи о работе железа, но для программистов на Си... чесслово, не знаю о таком. Может кто-то из программирующих на Си, предложит что-то интересное? PS. Может статьи о причинах зависания цифровых устройств, и средствах борьбы с этим (Brown-out Detector, Watch Dog timer) чем то помогут? Зависание ПК (вики), Зависание МК.
  8. atmega 328 странно дохнет

    В Arduino нет никакого "загрузчика". А есть программа прошивки контроллера по UART, записанная в защищённую область памяти. Эту, защищаемую от перезаписи область памяти, фирма Atmel и назвала "Boot Loader". А содержимое этой области может быть любым. Например разработчик Arduino придумал хранить там программу-прошивальщик :laughing: Считать это "загрузчиком" можно лишь в контексте развлекательно-обучающей игрушки под названием Arduino. А при серьёзном применении контроллера, этот код лучше считать "бомбой, заложенной под основание" вашей программы. "Загрузчиком" очень удобно пользоваться на этапе отладки, но перед вводом в эксплуатацию готового изделия, этот код лучше стереть. Способов, как может программный счётчик "перепрыгнуть" на любой случайный участок кода множество. Например такая ситуация: при помехе по питанию, в ОЗУ контроллера, всего один бит переключился с 0 на 1 (или наоборот). А в этой ячейке как раз хранился адрес возврата из подпрограммы. По команде RET, с вершины стека снимется такое "повреждённое" значение и загрузится в программный счётчик, после чего выполнение программы "улетит в неизведанную даль". "Загрузчик" содержит реализацию алгоритма Self Programing, с соответствующими командами в коде. Случайное выполнение таких команд может приводить к повреждению программной памяти. Поэтому в конечной реализации вашей программы, всё, что могло бы повредить программный код, лучше удалить. Да. Заливать прошивку через ISP. Если у вас нет ISP-программатора, то его легко можно сделать из ещё одной Arduino, залив соответствующий скетч.
  9. atmega 328 странно дохнет

    Моя версия. В контроллерах применяемых в Arduino присутствует программа-прошивальщик, зашитая на заводе (чтоб удобно было программировать через UART или USB). При помехах по питанию, программный счётчик может "перепрыгнуть" в том числе и на код прошивальщика, и рандомно что-то стереть/записать в памяти программ. Предложение - затереть код прошивальщика, и поменять "ардуиновские" значения бит BootRST и BootSize на стандартные.
  10. Да, попробуйте убрать прерывание для TX канала DMA совсем. Флаг TX USART в режиме DMA обычно сбрасывается автоматически, поэтому дублировать его сброс программно не нужно. Зато есть такой нюанс: В большинстве известных мне контроллеров, прерывание USART TX происходит в начале передачи байта (буфер TX переписали в регистр сдвига - и тут же прерывание TX), а прерывание USART RX происходит в конце приёма байта (из регистра сдвига переписали в буфер RX - и только тогда прерывание RX). Если USART отключить по прерыванию TX, то прерывание на приём последнего байта пакета может не наступить. И канал DMA RX, соответственно, запрос на последний байт не получит.
  11. В чём может быть дело не знаю. Тем более не известно какой контроллер :laughing: Мои варианты: 1. Попробуйте поменять местами каналы DMA: тот что был для RX сделать для TX, и наоборот. Если каналов DMA больше 2-х, попробуйте и остальные. (что-то, где-то читал, про приоритет каналов DMA на доступ к внутренней шине данных). 2. Уменьшите скорость SPI - например в 2 раза. Может пары дополнительных тактов хватит для "разруливания" ситуации? Также увеличьте скорость SPI ещё больше (если настройки позволяют) - не будет ли ошибка проявляться ещё чаще? 3. Попробуйте для режима чтения оставить прерывание только по RX, а для записи только по TX. Всё равно сразу два прерывания в каждом из режимов лишние, но вдруг это тоже что-то выявит.
  12. режим LPM0

    Выходить из LPMx можно только по прерыванию. Значит используем какое-либо из незадействованных на данный момент (список векторов прерываний и их источников в даташите на конкретный контроллер). Прерывание должно перед своим завершением извлечь из стека сохранённый там регистр статуса SR, изменить флаг CPUOFF, и "положить" модифицированный SR на место. При завершении прерывания, по команде RETI, из стека считается изменённое состояние SR, и в основном цикле будет либо Active Mode, либо LPMx. Например: 1. Если WDT не занят, то использовать его прерывание в режиме таймера. Можно настроить 4 скорости срабатывания. 2. Прерывание таймера A или B - добавить в конце уже имеющегося обработчика такие действия: Перед выходом из прерывания, программа проверяет какой-то бит (или байт) в ОЗУ, и в зависимости от его значения модифицирует сохранённый в стеке регистр статуса SR. Если к примеру в ОЗУ был 0, это значит что основной цикл должен "бодрствовать", и программа прерывания сбросит CPUOFF в 0. Если в ОЗУ было <> 0, значит CPUOFF нужно установить в 1. И тогда после завершения прерывания, основной цикл будет "спать". А в основном цикле нужно только менять ячейку ОЗУ, чтоб сообщать обработчику прерывания о своей "занятости работой", или наоборот - об отсутствии дел.
  13. Наверное нужно указать адрес компиляции (ассемблирования) файла IAR - в конце адресного пространства файла стека. Как по приведенной мной по ссылке советовали. Тогда, вероятно, файлы стека и прошивки не будут мешать друг другу.
  14. Возможно в этом топике есть что-то полезное Easyelectronics. Мои предложения: 1. Проверить программатор-отладчик на другом устройстве, которое не прошито. 2. Стереть-прошить чип тем файлом, который был залит в него на заводе (найти файл в интернете, или считать с другого устройства). 3. Проверить доступ к чипу из другой программы: заводская утилита для прошивки/стирания (если такая существует), другая среда разработки. 4. Проверить настройки IAR (режим Debug/Release, модель чипа, галка "Run to -- main" в настройках Debugger, и прочее). 5. Попробовать отладку в симуляторе IAR (в симуляторе хотя бы IAR программу отлаживает?). 6. Попробовать сбросить настройки IAR. 7. Переустановить IAR. Установить IAR другой версии (младше/старше).
  15. как таймером Timer A останавливать Timer B?

    Наверное можно через внешние выводы: у обоих таймеров есть внешние входы тактового сигнала, и есть выходы модулей сравнения-захвата. С модуля сравнения одного таймера, вывести частоту для тактирования другого таймера. И при остановке одного - остановится и другой. Можно и ещё один модуль сравнения вывести наружу, и уже по его сигналу - разрывать связь двух вышеупомянутых выводов контроллера (но придётся, наверное, транзистор ставить, для коммутации, или лог.элемент). Только не совсем понятно, что значит "останавливать"? В зависимости от чего он должен останавливаться или запускаться? Но! Если надо останавливать именно внутренними механизмами, то только программно - через прерывание. Другого способа я не знаю :laughing: