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

DmSk

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

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

  • Посещение

Репутация

0 Обычный

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

  • День рождения 14.04.1980

Информация

  • Город
    Array
  1. +100 посмотрите сайт http://easyelectronics.ru/ (не реклама , а пример) ,всегдас интересом просматриваю новые статьи, узнал много интересноо, чего не смог перевести с английского из DataSheet-ов
  2. Процессор не человек с ума не сойдет, а что ему сходить то ? какая разница программно или аппаратно флаги и указатель стека корректируется имел ввиду статус текущего процесса, например нажали кнопку "завести", статус процесса "заводи", нажали кнопку "прогрев по таймеру" - статус процесса "прогрев по таймеру", эта такая кнопка которая запускает процесс, при котором авто заводится 1 раз в час например и прогревается в течении определенного времени, это у нас в Сибири актуально при больших морозах.
  3. а я в прерывании буду смотреть статус процесса (какой процесс выполняется), если нажали кнопку "завести" и статус процесса сейчас"завести", то тогда нормально по reti возвращаемся ничего не сделав никуда не шагнув, если нажалии кнопку "прогрев по таймеру", а статус процесса "заводим" - то rjmp(переходим) на процесс "прогрев по таймеру" , , естественно если в это время крутили стартер, то всё отрубаем, таким образом можно играться кнопками до бесконечности, время реакции системы 4 такта ! дребезг по таакому алгоритму обрабатывать ненужно ? Спасибо, придется изучать професиональное програмирование :)
  4. Опечатался, конечно reti, так как прерывание а не процедура если в процедуре флаг по sei не поднять то, прерывания не будут вообще работать, так как я из прерывания сразу шагаю по rjmp в "Заводим", а этот флаг назад выставляется по "reti", а поскольку у меня его не будут, то приходится его руками выставлять. Со стеком такая же беда, нет rety, нет возврата указателя, таким образаом вызывая прерывания и не возвращаясь на место у нас стек переполнится Спасибо, можете дать ссылку в инете на какойнить шаблон/пример программы, чтобы не совсем с нуля писать ?
  5. пустой цикл немогу использовать для обработки кнопок, так как нажав кнопку я попаду в нужную мне программу, а нажав другую кнопку после неё уже нет .. потомучто программа в моем случае вернется в "пустой цикл" только после выполнения предыдущей команды . "компенсацию дребезга" - конечно будет, поскольку я пример упростил для наглядности да "защита от дурака стоит" :)
  6. спасибо всё понятно, если процессов много то конечно, а у меня 2 + переписывать код полностью неохото потому . всё же хотелось показать свой извратный код, пишу пример находу постараюсь, чтобы было понятно: main: ss: rjmp ss zavodim: // вернем указатель стека ПОСКОЛЬКУ ВЫШЛИ ИЗ ПРЕРЫВАНИЯ ПО RJMP а не RET и возвращаться несобираемся ! ldi r16,Low(RAMEND) out SPL,r16 ldi r16,High(RAMEND) out SPH,r16 sei \\ выставим флаг прерываний ПОСКОЛЬКУ ВЫШЛИ ИЗ ПРЕРЫВАНИЯ ПО RJMP а не RET rcall zavesti //процедура завода авто rjmp main timer_ovr: sbis PINB,3 RCALL zavodim \\ ВЫХОДИМ ИЗ ПРЕРЫВАНИЯ ПО RJMP и невозвращамся ВООБЩЕ поскольку там куда идем:) указатель стека правим и гл.флаг прерывания возвращаем! ret таким образом я решилэту задачу без усложния кода..
  7. нажал на кнопку - вызвалось прерывание из прерывания я сразу перехожу в нужный мне кусок кода - конкретно "завести авто". если по другому сделать, то это например я какойнить флаг бы выставил что нужно завести машину, а в это время выполняется кусок кода "прогрев авто" и висит пауза 60 минут, где я там буду проверять что нужно выйти из прогрева и заводить авто ? даже незнаю как правильно, но мой вариант тоже рабочий :laughing:
  8. На данный момент существует самодельное устройство автозавода автомобиля по таймеру, управляющий контроллер ATMEGA8. Задумал добавить кнопку, что бы можно было заводить с кнопки. Получается так: сел в машину, нажал кнопку, и авто завелось, при этом автомобиль мог до этого стоять на «программе прогрева», соответственно «программа прогрева» должна быть прекращена. Появились небольшие вопросы при реализации задуманного в программе. Программа написана на асме, весь текст приводить не буду , напишу «обычным языком» и коротко без деталей и ньансов. Вопрос: Слишком ли будет грубо переходит из прерывания в основную программу, установив указатель стека в начало и установив флаг гл. прерывания («sei») так как он при вызове прерывания сбрасывается? Решил сделать так, потому что команды от кнопок будут обрабатываться мгновенно не дожидаясь выполнения подпрограмм(паузы и т.д.) Существует ли альтернатива этому механизму ? Вот алгоритм программы ______________________________ Иницируем таймер опроса кнопок Разрешаем прерывания по IRQ1 для тахометра (считать импульсы, решать завелась или незавелась) Стек в начало; Основной цикл: Проверка статуса кнопок: Мигаем диодом, авто ждет команды Rjmp Проверка статуса кнопок // в основном цикле я разместил оба процесса, прогрев и заводим с кнопки Прогрев: Стек в начало; «Ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16» установим флаг гл.прерывания «sei» Пауза 1 час Rcall ЗавестиМашину Пауза 5 минут глушим Rjmp Прогрев ЗаводимСКнопки: Стек в начало; установим флаг гл.прерывания; //Проверка заведена ли машина Если машина заведена то rjmp Проверка статуса кнопок Иначе rcall ЗавестиМашину rjmp Проверка статуса кнопок Rjmp ЗаводимСКнопки Rjmp Основной цикл ЗавестиМашину: Запрещаем прерывание таймера опроса кнопок Заводим включая зажигание и включая стартер по определенному алгоритму Разрешаем прерывание таймера опроса кнопок Ret Прерывание таймера опроса кнопок: // если нажали кнопку завести то сразу переходим на программу завести с кнопки // тем самым команда ret не будет никогда выполнена // мы заменим её в основной программе возвратом указателя стека и установкой флага // глобального прерывания?! Если нажата кнопку 1 (завести авто) То rjmp ЗаводимСКнопки Если нажата кнопку 2 (прогрев авто по таймеру) То rjmp Прогрев Ret
  9. Схему смотри тут http://speed-light.on.ufanet.ru/speedometr-mega16.shtml работает с транзистором лучше, чем что то другое однако тоже возникают помехи, которые исправляются установкой конденцатора 0,1 Мкф вход дачика- земля. Чтобы контроллер не сбрасывался поставь по питалову контроллера диод и конденцаторы побольше, вход от датчика (если 12 вольт) не должен контроллер перегружать. всю схему в металлический корпус :)
  10. Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ? захват и переполнение, или только захват ? Соответсвенно какие прервания возникают ? захвата и потом переполнения или только захвата. Если только захвата, то о переполнение счетчика можно узнать по флагу , при этом запретить прерывание при перполнении, а при захвате если флаг выставлен игнорировать текущее значение ICR(оно неправльное), и сбрасывать флаг переполнения (ждать следующего значения- бес переполнения оно будет правильным)
  11. Считать долго нежелательно, хотел как проще, при переполнении таймера игнорировать следующий захват, а если при захвате ICR считывать и записывать туда значение ТOP таймера (65536), таким образом получится, что таймер сбрасывается и начинает считать сначала до 65536 , при этом погрешность вычисления уменьшается учитывая что при выводе информации на индикатор прерывания запрещаются, а вероятность что счеттчик дойдет до предыдущего ICR значения в это время когда прерывания запрещены невозможна
  12. Инициализация Таймер1 в режим Input Capture на Mega8 Как правильно сконфигурировать таймер 1 чтобы он работал в режиме захвата, а при захвате счетчик сбрасывался в 0 и вызывалось прервание. Также при переполнении счетчика должно быть прерывание. На данный момент в симуляторе инициировал следующим образом: ; Инициализация таймера .equ DIVIDER=64 ; ldi R16, (1<<ICNC1)|(1<<ICES1)|(0<<CS12)|(1<<CS11)|(1<<CS10)|(1<<WGM13)|(1<<WGM12) out TCCR1B, R16 ldi R16, 0 out TCCR1A, R16 ldi R16, (1<<TICIE1) out TIMSK, R16 sei
×
×
  • Создать...