Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 09.09.2014, 17:24  
SAHA_T
Прописка
 
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
SAHA_T на пути к лучшему
По умолчанию Re: Задержка импульса

Ан-162 - смотрю на коммутатор и вижу 4 вывода и понимаю что действительно внутри может стоит преобразователь, я не задавался целью покупать готовое и тем более КИТАЙСКОЕ, что мы РУССКИЕ глупее китайцев. Поэтому я решил сделать свое и по своему.

На счет настройки двигателя, я уже это продумал, думаю ничего сложного, но повозиться придется.
Реклама:
SAHA_T вне форума  
Непрочитано 09.09.2014, 18:02  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Задержка импульса

Сообщение от SAHA_T Посмотреть сообщение
пробовать делать все в одном таймере
Соединяем по схеме на картинке. Программа, например, такая

Код:
main()
{
 - установить режим Timer1
 - разрешить работу выхода сравнения, нога OC1A
 - установить прерывание INT0 по фронту
 - разрешить прерывания
  while(1){};
}

interrupt [EXT_INT0] void ext_int0_isr(void)
{
int oborot;
- остановить Timer1
- прочитать значение  oborot = TCNT1H‹‹8 +TCNT1L;
- занулить таймер
   TCNT1H=0x00;
   TCNT1L=0x00;
- стартовать Timer1
- проверить, не выша ли переменная за пределы
  if(oborot›Length(Tabl)) oborot = Length(Tabl)-1;
 - записать в регистр сравнения значение Tabl[oborot]
 - сбросить ножку OC1A в ноль
}
При совпадении равенства нога OC1A прыгнет в 1.
Миниатюры:
Нажмите на изображение для увеличения
Название: kazus_зажигание1.png
Просмотров: 29
Размер:	6.3 Кб
ID:	69405  
Yurkin2014 вне форума  
Сказали "Спасибо" Yurkin2014
SAHA_T (09.09.2014)
Непрочитано 09.09.2014, 19:37  
SAHA_T
Прописка
 
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
SAHA_T на пути к лучшему
По умолчанию Re: Задержка импульса

//используем 16-ти битный таймер Counter1 - захват обороты
OCR1A=0x4E2; // значение для сравнения делитель 256
OCR1BL=OCR1BH=0xff; // настраиваем регистры таймера
TIMSK=0xE0; //прерывания по переполнению и сравнению таймера

PORTB.4=0; //выключаем КЗ
PORTB.3=1; //вкл. светодиод

TCNT1=0x00; //сбрасываем счётчик 1 в 0
TCCR1B=0x04; //делитель 256
while(1)
{ };

interrupt [EXT_INT0] void ext_int0_isr(void) я так понял что это прерывание работает по входу и это замена while(PIND.2==0), как таким прерыванием управлять ?
я вот думал использовать такое interrupt [TIM1_COMPA] void timer1_compa_isr(void) прерывание по сравнению


interrupt [EXT_INT0] void ext_int0_isr(void)
{
int oborot;
//- остановить Timer1
TCCR1B=0x00;
//- прочитать значение oborot = TCNT1H‹‹8 +TCNT1L;
oborot = TCNT1H‹‹8+TCNT1L; //(TCNT1L|((int)TCNT1H‹‹8 ));
//- занулить таймер
TCNT1L=TCNT1H=0x00;
//- стартовать Timer1 да а как можно стртовать если я делитель обнулил или снвоа включать делитель
TCCR1B=0x04; //делитель 256
//- проверить, не вышла ли переменная за пределы
// if(oborot›Length(Tabl)) oborot = Length(Tabl)-1;
i=60000/oborot; //вычисляем ячейку таблицы об в минуту
if(oborot›tablica[i]) oborot = tablica[i]-1; //вычисляем задержку
// - записать в регистр сравнения значение Tabl[oborot]
OCR1AH=(char)(tablica[oborot]››8 ); //заносим задержку
OCR1AL=(char)tablica[oborot]; //в счётчик

// - сбросить ножку OC1A в ноль
PORTB.3=0;
}

чет я совсем запутался, у меня есть таблица записанная в памяти МК flash char tablica[i] ={} где i изменяется от 1 до 105 т.е tablica[i] 1=100 оборотов, 2=200 оборотов ... 105=10500 оборотов. В флеш мне нужно заносить маленькие значения т.к обем флеш памяти мал.

Наверное я тут ошибся

Последний раз редактировалось SAHA_T; 09.09.2014 в 19:59.
SAHA_T вне форума  
Непрочитано 09.09.2014, 20:25  
SAHA_T
Прописка
 
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
SAHA_T на пути к лучшему
По умолчанию Re: Задержка импульса

Не могу понять как работает данное прерывание
interrupt [EXT_INT0] void ext_int0_isr(void) смотрю в отладчике, подаю на INT0 1 а прерывание не происходит, по какому принципу оно работает, если прерывания таймера работают по переполнению и сравнению и с флагом

В отладчике не вижу, как сделать разрешение данному внешнему прерыванию interrupt [EXT_INT0] void ext_int0_isr(void)

Последний раз редактировалось SAHA_T; 09.09.2014 в 20:40.
SAHA_T вне форума  
Непрочитано 09.09.2014, 20:46  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Задержка импульса

Сообщение от SAHA_T Посмотреть сообщение
чет я совсем запутался
Без паники! Помните об улитке на склоне Фудзиямы. Как бы высока гора ни была, улитка всё равно доползёт до вершины!

Сообщение от SAHA_T Посмотреть сообщение
как можно стртовать если я делитель обнулил
Вот на картинке устройство МК. Вы один раз установили прескейлер TCCR1B=0x04 и больше его не трогаете. Он молотит с постоянной частотой.
С регистрами таймера делайте что хотите. Строка TCNT1L=TCNT1H=0x00; просто сбрасывает счётчик таймера на начальное положение счёта, чтобы считал с нуля. Через какое-то время можно посмотреть на TCNT1L,TCNT1H и узнать, сколько там уже накопилось. Когда числа в TCNT1L,TCNT1H сравняются с числами в OCR1AH, OCR1AL на выходе OC1A появится единичка.



Сообщение от SAHA_T Посмотреть сообщение
это прерывание работает по входу и это замена while(PIND.2==0), как таким прерыванием управлять ?
Процессор выполняет код программе main(), строчка за строчкой. Когда он достигнет инструкции while(1){ };, процессор застрянет на ней навсегда, т.е. будет проверять, когда же 1==0. А это не случется никогда. Хорошо.
Если при этом на вход INT0 придёт положительный импульс, случится событие пррерывания. Процессор остановится, запомнит место в main(), где он остановился, и перепрыгнет на процедуру обработки прерывания. То есть прыгнет внутрь
interrupt [EXT_INT0] void ext_int0_isr(void){}
и будет её выполнять, пока не дойдёт до конца процедуры. После этого процессор вернётся в запомненное место в main() и будет снова крутиться в бесконечном цикле.
Таким образом, с каждым импульсом от датчика тут же будет каждый раз выполняться обработка прерывания. Если мы в обработке будем читать значения таймера, то будем знать, сколько мкс времени прошло за один оборот.

Сообщение от SAHA_T Посмотреть сообщение
// - сбросить ножку OC1A в ноль
PORTB.3=0;
Ног у процессора мало, а функций много. Поэтому несколько функций сидят на одной ноге. Нога может быть выводом порта В, а может быть выходом OC1A регистра сравнения. Если мы решили использовать ногу, как выход регистра, то эта нога от порта отключается внутри и уже не реагирует на PORTB.3=0, потому что к потру не имеет отношения. Надо её гасить по-другому.
Миниатюры:
Нажмите на изображение для увеличения
Название: kazus_zajig1.png
Просмотров: 28
Размер:	5.3 Кб
ID:	69407  
Yurkin2014 вне форума  
Сказали "Спасибо" Yurkin2014
SAHA_T (09.09.2014)
Непрочитано 09.09.2014, 21:03  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Задержка импульса

Сообщение от SAHA_T Посмотреть сообщение
В отладчике не вижу, как сделать разрешение данному внешнему прерыванию interrupt [EXT_INT0] void ext_int0_isr(void)
Честно признаюсь, что ни с процессорами Atmel, ни с Протеусом никогда дела не имел. Вашу тиньку сижу у открытого мануала и изучаю в первый раз по мере Ваших вопросов. В мануале все написано. Мне нужно некоторое время, чтобы прочитать про разрешение внешнего прерывания.
Yurkin2014 вне форума  
Непрочитано 09.09.2014, 21:08  
SAHA_T
Прописка
 
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
SAHA_T на пути к лучшему
По умолчанию Re: Задержка импульса

Сообщение от Yurkin2014 Посмотреть сообщение
Процессор выполняет код программе main(), строчка за строчкой. Когда он достигнет инструкции while(1){ };, процессор застрянет на ней навсегда, т.е. будет проверять, когда же 1==0. А это не случется никогда. Хорошо.
Я встречал такой код while(1){ }; в некоторых исходниках, получается что пока процессор ждет 0, можно с ним делать абсолютно любые операции с помощью прерываний, а прерываний я так понял очень много
Прерывания в atmega8
На приведённом примере также видно, как задаются векторы прерываний в Code Vision AVR (interrupt [EXT_INT0] void ext_int0_isr(void)). Аналогично задаются вектора прерываний и для других случаев:
EXT_INT0 2
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC 11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
TWI 18
SPM_READY 19

я думаю в тини 2313 тоже хватает прерываний
Сейчас я попробую разобраться, какие нужно выставлять регистры для внешних прерываний.

Yurkin2014, спасибо огромное, очень доступно объясняешь !!!
SAHA_T вне форума  
Непрочитано 09.09.2014, 21:20  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Задержка импульса

Во, нашел:

GIMSK|=0x40; разрешаем INT0
MCUCR=0x03; разрешаем срабатывание по фронту импульса
EIFR=0x40; гасим флаг прерывания, на всякий случай

Ну, и затем делаем общее разрешение прерывания

Последний раз редактировалось Yurkin2014; 09.09.2014 в 21:30.
Yurkin2014 вне форума  
Сказали "Спасибо" Yurkin2014
SAHA_T (09.09.2014)
Непрочитано 09.09.2014, 21:23  
SAHA_T
Прописка
 
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
SAHA_T на пути к лучшему
По умолчанию Re: Задержка импульса

Сообщение от Yurkin2014 Посмотреть сообщение
Честно признаюсь, что ни с процессорами Atmel, ни с Протеусом никогда дела не имел. Вашу тиньку сижу у открытого мануала и изучаю в первый раз по мере Ваших вопросов. В мануале все написано. Мне нужно некоторое время, чтобы прочитать про разрешение внешнего прерывания.
Дак я мануал тоже листаю и исходники ищу, но вы как то все уверенно говорите, наверное вы все же с МК знакомы

сейчас попробую прерывания
GICR|=0x40; разрешаем INT0
MCUCR=0x03; разрешаем срабатывание по фронту импульса
GIFR=0x40; гасим флаг прерывания, на всякий случай

хочу походу понять как они работают, и не понимаю почему этих прерываний нет в отладчике AVRStudio 4.0


почему то не понимает строчку GICR|=0x40;

Последний раз редактировалось SAHA_T; 09.09.2014 в 21:26.
SAHA_T вне форума  
Непрочитано 09.09.2014, 21:34  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Задержка импульса

Я там поправил названия регистров
Yurkin2014 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задержка или опережение импульса SAHA_T Микроконтроллеры, АЦП, память и т.д 85 19.08.2014 00:51
Измерение длительности импульса STM32 anton_1000 ARM 28 22.10.2013 10:51
Ограничитель длительности импульса Pajatel Микроконтроллеры, АЦП, память и т.д 161 05.04.2012 00:35
Как выделить срез импульса? vicselc Поиск схем. Делимся схемами 10 09.07.2007 01:27
LCD DEM 16261(4 bit mode) + AT89C51 ajborman Микроконтроллеры, АЦП, память и т.д 8 21.03.2007 15:26


Часовой пояс GMT +4, время: 02:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot