Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ATMega8 Вопрос о Timer0 и времени выполнения программы


ATMega8 Вопрос о Timer0 и времени выполнения программы

Сообщений 1 страница 4 из 4

1

Добрый день.

программирование микроконтроллеров для меня вещь новая, поэтому хотелось бы услышать мнение более компетентных людей. Задача состоит в следующем.
Необходимо сделать генератор импульсов на ATmega8-16. Причем регулировка длительности импульсов и паузы между ними должна осуществляться раздельно. Время может изменяться от 5 микросекунд до 1 секунды.

Т.е. Время между импульсами = 5 микросекунд ... 1 секунда
      Время импульса               = 5 микросекунд ... 1 секунда
      Передача данных по RS232

для решения задачи я решил воспользоваться кварцем на 16 МГц. Подав тактовый сигнал на Timer0 через делитель на 8. Сам Timer0 предустановлен на значение 245. Таким образом я получаю каждые 5 микросекунд (1600000 / 8 / 10 = 200000 КГц) прерывание переполнения Timer0.

Программа планируется примерно такая:
(на синтаксис не обращайте внимания, сижу на работе, нет возможности опробовать)

Dim Pausa as long
Dim Dlina Pausa as long
Dim Schetchik as long
Vihod alias Portb.1

------------------------------
коммуникация по RS232
и передача данных о длительности импульсов

Pausa= 1...200000
Dlina = 1.200000
------------------------------

Dlina:
Vihod=1
While Schetchik > 0
Wend

Pausa:
Vihod=0
While Schetchik > 0
Wend

Goto Dlina

-Обработка прерывания переполнения-
Schetlik=Schetchik-1

Вот собственно и все... А теперь к моим вопросам. Счетчик будет выдавать прерывание переполнения каждые 80 тактовых импульсов (он считает с 245 до 255, т.е. 10 импульсов).  Мне удалось также узнать что "прыжок" в прерывание "стоит" микроконтроллеру около 50 тактов. Будет ли контроллер успевать выполнять основную программу на которую остается в таком случае 30 тактов?
Может я выбрал не совсем оптимальную стратегию для поставленной задачи?
Какие варианты существуют?
Надеюсь изложение было понятным, а с вопросами не перестарался... :)

0

2

Чувак. пробуй в железе. Помоем ты уже сам до всего дошел.
еще вариант:
конфигурируешь таймер 1
в основном цикле принимаешь данные по уарт
а в таймере после его срабатывания инвертируешь состояние выхода toggle portx.y , после чего присваиваешь таймеру значение, которое он отсчитает до сл. ппереполнения
timer1 = 10000
return
раздели четные и нечетные срабатывания таймера и каждому из них присваивай свое значение

Отредактировано Pasha (2010-07-23 21:07:50)

0

3

уже попробовал... не попался кварц на 16 МГц, поставил пока на 8. Но это не принципиально. Я достаточно уверен, что работать должно.
В чем коственно уже и убедился. Светодиод моргает, чем и подтверждает, что заработало.

Мои сомнения в том, что ... хотя я лучше по пунктам...

1. Успеет ли микроконтроллер обработать за 80 циклов программу и выполнить прерывание? Если нет, то не удастся достигнуть время в 5 микросекунд.
2. Как помно проверить укладывается ли микроконтроллер в указанные 80 тактов? Вариант с осциллографом сейчас не подходит, т.к. нет в данный момент.

....в основном цикле принимаешь данные по уарт... - мне кажется это не логично, если ошибаюсь поправь.... Ведь если прием данных будет в основном цикле, то программное время булет постоянно затрачиватся на прием данных, даже если они не передаются... По моему мнению лучше было бы это реализовать при помощи прерывания (URXC кажется), тогда контроллер станет "отвлекаться" на прием, только если данные действительно пересылаются.

0

4

1 Данная задача на одном микроконтроллере AVR нерешаема. В прерывании с частотой 200 кГц ничего сделать не удастся, даже
если написать на ассемблере. Это всего 20 - 30 команд.
'в начале  переход по вектору прерывания 4 такта

    Push R31                            'сохраним регистры
    In R31 , Sreg
    Push R31
    Push R30
    Push R27

'осталось место для десяти команд, а нужно загрузить и обработать два 24-битных счетчика и установить значение порта - не успеешь

    Pop R27
    Pop R30
    Pop R31
    Out Sreg , R31
    Pop R31
    Reti

2 Есть устройство таймер 1. В режиме FAST PWM на выходах OC1A или OC1B можно получить необходимый сигнал про кварце 12.8 МГц
от 5  до 327675 мкс как по длине периода так и по длительности. Чисто аппаратно.
настраивается: Fo/64, длина периода записывается в ICR1, длительность импульса в OCR1A.
3 Более  продолжительные сигналы с дискретностью 5 мкс без погрешности сформировать нельзя. Поэтому есть два варианта:
- перестроить таймер на частоту работы  Fo/256 и использовать тот же механизм формирования, но с дискретностью установки 20 мкс;
- придумать программно-аппаратный алгоритм с посчетом нескольких переполнений таймера.
4 Похоже есть еще вариант  - использовать два таймера, например, 1 и 2, оба в режиме FAST PWM . Выходы OC1A или OC2 объединить по ИЛИ.
  Таймер 2 отрабатывает младшие разряды длительности, а таймер 1 старшие. Программировать их в зависимости от заданных параметров.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ATMega8 Вопрос о Timer0 и времени выполнения программы