Перейти к содержанию

DegNet2

Members
  • Постов

    5
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Ростов-на-Дону

Электроника

  • Стаж в электронике
    Менее года

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения DegNet2

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Проблема решена, дело было в отсутствии обработчика прерывания в коде. @Grig96, спасибо за помощь!!
  2. В том числе на основе этого источника я строю свой проект. Но цели у меня немного другие. Проблема не решена... Просто забыл раскомментировать TIMSK и подумал что дело в задержке...
  3. Измерение периода импульсов с большой точностью, где расстояние между импульсами может превышать 2^16 тактов генератора, так что переполнение мне нужно обрабатывать..
  4. Начал восстанавливать необходимый мне функционал в вашем коде постепенно. Обнаружилось, что виной всему прерывания. Я в TIMSK устанавливаю бит разрешающий прерывания по переполнению т.к оно мне нужно. Если закоментировать строку с TIMSK или sei(); то все работает. С TIMSK |= (1<<5); тоже все работает. А вот если поставить прерывание по переполнению все ломается. Сейчас немного увеличил задержку в теле if. до 15 ms. Все хорошо. В чем же истинная причина такого поведения и не будет ли проблем в железе?
  5. #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> void setup() { DDRB = 0x00; PORTB = 0x00; PORTB |= (1<<1); //конфигурация общих параметров для всех таймеров TIMSK |= (1<<2)|(1<<5); TIMSK &= ~(1<<3); //---------------------------- DDRD = 0xFF; PORTD = 0x00; //конфигурация таймера 1 TCCR1B = 0x00; TCCR1A = 0x00; TCNT1H = 0x00; TCNT1L = 0x00; TCCR1B |= (1<<6); //--------------------------- DDRC = 0xFF; PORTC = 0x00; sei();// разрешаем прерывания } ISR( TIMER1_CAPT_vect )//прерывание захвата таймера 1 { //PORTD = ICR1; } int main(void) { setup(); int tmp = 1; while(1) { if((!(PINB&(1<<1))) && tmp) { TCCR1B |= (1<<0);//start timer1 tmp = 0; /* PORTD |= (1 << 2); _delay_ms(1); PORTD &= ~(1 << 2);*/ } PORTD = TCCR1B; } } test.pdsprj
  6. Доброго времени суток!! Я в замешательстве! Atmega8, AtmelStudio, отладка в Proteus. int main(void) { setup();//Там устанавливаются конфигурации входов и регистров таймера1 while(1) { if(!(PINB&(1<<1)))// pb1 через кнопку на землю. pb1 притянут к питанию внутренним резистором. { TCCR1B |= (1<<0);//Устанавливаем нулевой бит регистра, что бы запустить таймер без делителя частоты, //остальные биты этого регистра в сетапе обнулялись } PORTD = TCCR1B;// в Порт Д засылаем значения регистра и смотрим шо происходит. } } А происходит следующее. При нажатии кнопки загорается PD0, вроде бы норм. Но при отпускании кнопки тухнет. Почему? Стоит вынести TCCR1B |= (1<<0); из тела условия в любое другое место все работает как надо. Но вот еще прикол. int main(void) { setup(); int tmp = 1;// Добавляем переменную while(1) { if((!(PINB&(1<<1))) && tmp)// Тело условия должно выполниться только 1 раз после нажатия { TCCR1B |= (1<<0);//start timer1 tmp = 0; } PORTD = TCCR1B; } } Казалось бы, теперь момент отпускания кнопки никак не должен влиять на результат. Но поведение PD0 то же самое. Горит только во время удержания кнопки. МК для меня новая область изучения, по этому прошу помочь разобраться и установить этот чёртов бит))
  7. Спасибо большое, это то что нужно! Делаю режим захвата, должно получиться без проблем...
  8. Да так и есть. С МК дела никогда не имел от того и каша в голове. Давайте по порядку. Сейчас это работает так. МК по команде пользователя генерирует ОДИН прямоугольный импульс. Этот импульс устанавливает выход D-триггера в высокий уровень. Выход этого триггера подключен в качестве разрешающего сигнала для счётчиков и они начинают считать. Затем через некоторое время из другой схемы приходит еще одни импульс который возвращает триггер в 0 и счетчики перестают считать. Видимо я что то сильно не понимаю в МК. По этому прошу в общих чертах накинуть алгоритм реализации сего чюда техники используя только МК и его встроенный таймер. И после, наверное я смогу задать более конкретные вопросы. Спасибо))
  9. На данном этапе не важно. Какой подойдет такой и буду использовать, рассчитываю на ваши рекомендации. Боюсь без контроллера не обойтись. Будет еще куча периферии, и самое главное обработка результата. По поводу камней, интересует частота с которой я могу считывать состояние входа контроллера. Она равна частоте дискретизации АЦП или для цифровых сигналов тактовой частоте контроллера? И мне в некоторых случаях придется различать разницу между импульсами равную одному периоду генератора, соответственно равную единственному инкременту счетчика, а мне еще и прочитать нужно значение счетчика из регистра. Всвязи с чем вопрос: 50 МГц-ового Мк будет мало? Или время на чтение регистра всегда фиксировано и это приведет к систематической погрешности, которую потом можно нивелировать? Первый импульс в моей схеме инициирует контроллер. Я так понимаю его можно послать по прерыванию когда счетчик обнуляется и ждать второй импульс. И по приходу второго импульса на один из входов МК, мне нужно прочитать регистр счетчика таймера. Я правильно понимаю? Или проще не колупать мозги и оставить внешние синхронные счетчики? Но так получится очень громоздко... Т.к. мне нужно 17 бит отсчитывать..
  10. Доброго времени суток!! Есть задача, измерить время между импульсами с точностью до периода 50МГц - ового генератора. Этим периодом ограничена и минимальная задержка между импульсами. Уже собрал в proteus-е схему на синхронных счетчиках и стал разбираться с МК, что бы управлять этой схемой. Оказалось в МК есть встроенный таймер, который может считать со скоростью тактового генератора МК. Вопрос: Возможно ли используя встроенный таймер МК на частоте >= 50 МГц нормально померить такую задержку и какие могут быть подводные камни?
×
×
  • Создать...