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

n_angelo

Members
  • Постов

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

  • Посещение

Информация

  • Город
    Новокузнецк

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    микроконтроллеры

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

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения n_angelo

Новобранец

Новобранец (2/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

-6

Репутация

  1. Полагаю, что есть какая-то защита от зависания в прерывании.
  2. Да, простите, уже и забыл про этот код. В текущей версии удалил его. Я его взял из SPL-библиотеки от STM для STM8S в дефайнах для IAR.
  3. Я всегда думал, что очистка Pending Bit инициирует выход из прерывания. Сегодня проверю. Получается, если этого статус-регистра не существует, то любое прерывание может прервать текущее? (Если не настраивать специально приоритеты). На два раза перечитал свои сообщения. Где я говорил о запрете/разрешении прерывании? Процитируйте.
  4. я сначала тоже подумал, что дребезг, но для этого у прерывания должно быть что-то вроде стека, который складывает дребезг в очередь, пока текущее прерывание отрабатывает. Но такого стека нет – в течении одного прерывания, другое такое же прийти не может, если ты этого явно не запрограммировал. В общем, перенёс я код в основной цикл, а в прерывании просто включаю таймер. Теперь всё работает как надо. Может быть какой-то механизм смотрит за длительностью прерывания, ну или просто гон контроллера.
  5. Поверьте, этого регистра в STM8S просто нет. Я по привычке хотел обнулить флаг, но статус-регистра там нет. Не знаю как в STM32, а в STM8L, прерывание отработает и зависнет в конце прерывания, до тех пор пока не сбросить флаг, т.е. повторяться оно не будет.
  6. В stm8s нет флага выхода из прерывания. Я сам удивился, когда пытался долго его найти. В коде я сбрасываю флаг переполнения таймера для подсчёта секунд. Контроллер больше не будет ничего делать — это законченная программа, поэтому я пренебрёг правилу быстрой отработки прерывания. Кстати, нет мыслей почему два раза входит в прерывание? UPD: Проверил весь порт A осциллографом. Повторных импульсов нет. Значит проблема в коде.
  7. По приходящему на ножку A1 импульсу настроено прерывание. Прерывание должно отработать один раз и должно делать следующее: пауза 7 секунд, потом на 1,5 секунды открыть реле. Во время прерывания светодиод на плате гаснет и загорается в такт секундам. Код отрабатывает верно за исключением того, что прерывание отрабатывает 2 раза. Т.е. подали импульс, заморгал светодиод в течении 7ми секунд, потом щёлкнуло реле (открылось), затем опять щёлкнуло (закрылось), потом всё повторяется еще раз (7+1,5). В режиме дебага работает нормально. Пробовал отключать реагирование на прерывания во время его отработки: disableInterruupts(); ... enableInterruupts(); но не помогает. STM8S103F3P6 Код прерывания Код в main.c
  8. Моя благодарность! Помогло. Установил приоритет над ядром. Теперь тайминг правильный. Насколько приоритет над ядром может замедлить саму программу? Я так понимаю здесь нужно самому выбирать, либо работа в реалтайм связки (TIM->DMA->DAC) и пустить в жертву работу программы, либо никакого реалтайма в этой связке, но зато код будет работать без задержек? Насколько RTOS помогает с этим справиться?
  9. Наверное он имел ввиду самое первое прерывание, которое включает таймер. Прилагаю код. Осциллограф выдаёт полный период за ≈4мс, хотя должен за ≈2,29мс. main.c main.h
  10. К сожалению, мой осциллограф одноканальный и показывает только то, что произошло от момента триггера. А график в дебаггере показывает, что один семпл (1/44100) выводится раз в 5 секунд. Других способов измерить я пока не придумал.
  11. Я не бросаю читать тему, когда дочитываю до слишком свежего комментария, относительно создания темы. Может я неправильно пользуюсь форумами?
  12. Ну, раз не важна оптимизация и экономия, зачем вообще Си + STM32? Ставьте Raspberry и пишите на Питоне.
  13. Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален. Используемая периферия: DAC, DMA, TIM4, CLK, GPIO Задача у программы такая: В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод. Проблема: Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом. Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается. Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг. Спасибо.
×
×
  • Создать...