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

n_angelo

Members
  • Постов

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

  • Посещение

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

  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(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается. Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг. Спасибо.
  14. Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей. Ваше мнение?
×
×
  • Создать...