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

- Реклама
Вы наверняка просчитали сколько времени к МК уходит на выполнение комманды.
Я с BASCOM не работал, но вот небольшой пример на языке Си.
Вот прерываниесвиду всего две строки, но это на Си.
Открываем ассемблерный листинг, который создал компилятор, находим наше прерывание и видими строк стало уже десять и это без использования переменных и условий внутри подпрограммы (прерывания).
Есть такая штука "стек" называется так вот при входе в подпрограмму содержимое нужных регистров "прячется" в стеке, а при выходе из прерывания соответственно восстанавливается.
Я с 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. Рассказ нечаянного революционера"
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
1 мкс это всего лишь 500 кГц, неужели от диалекта языка зависит скорость выполнения программы? Кстати как узнать сколько времени занимает та или иная команда сколько тактовых импульсов на это уходит? спасибо
Поставил Васик, написал программу: скомпилировал, проверил результат в Протеусе.
Написал программу на Си: скомпилировал, проверил результат в Протеусе.
Обе картинки идентичны.

При частоте работы тини2313 в 1МГц цифры: 3,98 мкс и 5,97 мкс соответственно
и т.к. BASCOM не дает asm-листинга привожу листинг от CVAVR
в обоих программах никаких прерываний, стеков и никаких условных переходов. Все по минимуму и производительность по максимуму.
Если результат (4 мкс и 6 мкс) поделить на 16 т.е. перевести на 16МГц то Вы теоретически можете получить импульс в 0,25 мкс.
Это практический ответ на Ваш вопрос.
Код: Выделить всё
$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. Рассказ нечаянного революционера"
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Огромное спасибо Danko! Наверно у меня что то с фьюзами что за частоту отвечают что ли. Буду искать проблему. Спасибо Большое! Как у Вас кстати обстановка в Крыму?

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


