Генератор импульсов в BASCOM AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Вс ноя 06, 2011 00:44:41
Откуда: Киев

Сообщение muhomka »

Подскажите пожалуйста, я хочу сделать генератор коротких импульсов 1 мкс через прерывания по таймеру. Частота кварца 16 МГц, до переполнения присваиваю счетчику новое значение, но не хочет работать ниже 8 мкс импульс. В чем проблема вы не знаете? в статьях пишут что вся эта прелесть работает покуда время выполнения программы остается меньше дергания ножки 1,0... и т.д. Что получается нельзя быстрее дергать что ли? Как тогда быть???? :shock: :o
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Вы наверняка просчитали сколько времени к МК уходит на выполнение комманды.

Я с BASCOM не работал, но вот небольшой пример на языке Си.

Вот прерывание

Код: Выделить всё

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
	TCNT1=0xFC2F;

    PORTB.0 = 1;
}
свиду всего две строки, но это на Си.

Открываем ассемблерный листинг, который создал компилятор, находим наше прерывание и видим

Код: Выделить всё

;interrupt [TIM1_OVF] void timer1_ovf_isr(void)
;{
_timer1_ovf_isr:
	ST   -Y,R30
	ST   -Y,R31
;TCNT1=0xFC2F;
	LDI  R30,LOW(64559)
	LDI  R31,HIGH(64559)
	OUT  0x2C+1,R31
	OUT  0x2C,R30
;PORTB.0 = 1;
	SBI  0x18,0
;}
	LD   R31,Y+
	LD   R30,Y+
	RETI
;
и строк стало уже десять и это без использования переменных и условий внутри подпрограммы (прерывания).

Есть такая штука "стек" называется так вот при входе в подпрограмму содержимое нужных регистров "прячется" в стеке, а при выходе из прерывания соответственно восстанавливается.
muhomka писал(а): Что получается нельзя быстрее дергать что ли? Как тогда быть????
попробуйте оптимизировать прерывание.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Вс ноя 06, 2011 00:44:41
Откуда: Киев

Сообщение muhomka »

1 мкс это всего лишь 500 кГц, неужели от диалекта языка зависит скорость выполнения программы? Кстати как узнать сколько времени занимает та или иная команда сколько тактовых импульсов на это уходит? спасибо
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Поставил Васик, написал программу:

Код: Выделить всё

$Regfile = "attiny2313a.dat"                                'настройки
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Pinb.0 = Output

Do
  Portb.0 = 0
  Portb.0 = 1
Loop

End
скомпилировал, проверил результат в Протеусе.

Написал программу на Си:

Код: Выделить всё

#include <tiny2313a.h>

void main(void)
{

// Port B initialization
DDRB=0x01;

while (1)
      {
        PORTB.0 = 0;
        PORTB.0 = 1;
      }
}
скомпилировал, проверил результат в Протеусе.

Обе картинки идентичны.
Изображение
При частоте работы тини2313 в 1МГц цифры: 3,98 мкс и 5,97 мкс соответственно

и т.к. BASCOM не дает asm-листинга привожу листинг от CVAVR

Код: Выделить всё

;while (1)
_0x3:
;{
;PORTB.0 = 0;
	CBI  0x18,0
;PORTB.0 = 1;
	SBI  0x18,0
;}
	RJMP _0x3
;}
в обоих программах никаких прерываний, стеков и никаких условных переходов. Все по минимуму и производительность по максимуму.

Если результат (4 мкс и 6 мкс) поделить на 16 т.е. перевести на 16МГц то Вы теоретически можете получить импульс в 0,25 мкс.

Это практический ответ на Ваш вопрос.
Вложения
test.zip
кексы и проект в Протеусе
(14.08 КБ) 192 скачивания
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Вс ноя 06, 2011 00:44:41
Откуда: Киев

Сообщение muhomka »

Огромное спасибо Danko! Наверно у меня что то с фьюзами что за частоту отвечают что ли. Буду искать проблему. Спасибо Большое! Как у Вас кстати обстановка в Крыму? :? :cry:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

muhomka писал(а):генератор коротких импульсов 1 мкс
Может проще сделать на жесткой логике? Ведь обработка прерывания (если делать на нем) съест кучу времени.
Docendo discimus
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Можно и на дискретной логике сделать, а можно и на аппаратной части МК.

Нестоит забывать о том, что таймер/счётчик МК имеет как выходы так и входы это я ктому, что если не программно "дергать" ногой, а аппаратно то можно уйти от условных переходов.

В одном из своих проектов я выход одного таймера запустил на вход другого из двух диодов и транзистора собрал элемент "2И" и получил красивую пачку импульсов.
Вложения
USB_sIRCo_tiny45_BC547.GIF
(34.53 КБ) 730 скачиваний
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Ответить

Вернуться в «AVR»