Страница 1 из 1
Генератор импульсов в BASCOM AVR
Добавлено: Пн июн 16, 2014 17:59:58
muhomka
Подскажите пожалуйста, я хочу сделать генератор коротких импульсов 1 мкс через прерывания по таймеру. Частота кварца 16 МГц, до переполнения присваиваю счетчику новое значение, но не хочет работать ниже 8 мкс импульс. В чем проблема вы не знаете? в статьях пишут что вся эта прелесть работает покуда время выполнения программы остается меньше дергания ножки 1,0... и т.д. Что получается нельзя быстрее дергать что ли? Как тогда быть????

Re: Генератор импульсов в BASCOM AVR
Добавлено: Вт июн 17, 2014 08:24:45
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 писал(а): Что получается нельзя быстрее дергать что ли? Как тогда быть????
попробуйте оптимизировать прерывание.
Re: Генератор импульсов в BASCOM AVR
Добавлено: Вт июн 17, 2014 09:38:49
muhomka
1 мкс это всего лишь 500 кГц, неужели от диалекта языка зависит скорость выполнения программы? Кстати как узнать сколько времени занимает та или иная команда сколько тактовых импульсов на это уходит? спасибо
Re: Генератор импульсов в BASCOM AVR
Добавлено: Вт июн 17, 2014 11:45:09
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 мкс.
Это практический ответ на Ваш вопрос.
Re: Генератор импульсов в BASCOM AVR
Добавлено: Вт июн 17, 2014 13:05:06
muhomka
Огромное спасибо Danko! Наверно у меня что то с фьюзами что за частоту отвечают что ли. Буду искать проблему. Спасибо Большое! Как у Вас кстати обстановка в Крыму?

Re: Генератор импульсов в BASCOM AVR
Добавлено: Вт июн 17, 2014 15:27:08
pyzhman
muhomka писал(а):генератор коротких импульсов 1 мкс
Может проще сделать на жесткой логике? Ведь обработка прерывания (если делать на нем) съест кучу времени.
Re: Генератор импульсов в BASCOM AVR
Добавлено: Вт июн 17, 2014 16:38:03
Danko
Можно и на дискретной логике сделать, а можно и на аппаратной части МК.
Нестоит забывать о том, что таймер/счётчик МК имеет как выходы так и входы это я ктому, что если не программно "дергать" ногой, а аппаратно то можно уйти от условных переходов.
В одном из своих проектов я выход одного таймера запустил на вход другого из двух диодов и транзистора собрал элемент "2И" и получил красивую пачку импульсов.