0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
1

Затупил с парой таймеров

12.09.2013, 20:14. Показов 5673. Ответов 9
Метки нет (Все метки)

Уже пару дней не получается решить простую задачу на меге8: первый таймер в режиме СТС ставит вывод ОС1В на 1 и выдаёт прерывание с частотой от 500 до 2000 Гц для запуска таймера 2, а таймер два после запуска отсчитывает 10 мкс, сбрасывает ногу OC1B и после пары простых проверок и вычислений забрасывает в ICP1 новое значение или останавливает таймер1.
наиболее близкий результат пока получался: импульсы на OC1B нужной продолжительности, но с частотой 250Гц.
Метод который раньше работал (читаем книгу и пишем по ней в управляющие регистры) не работает в сей раз, видимо простуда, сопли и мигрень тому виной :(
Помогите парой строчек кода, плиз
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2013, 20:14
Ответы с готовыми решениями:

затупил((
Для начала Вам необходимо скачать данный патч. После этого, извлеките содержимое архива в каталог с...

затупил с таймером
Всем привет! затупил с таймером, ошибка видимо банальная, но не могу найти. atmega 328,...

Затупил на простом вводе
Извините. за банальный вопрос, но как проверить, что в поле edit введенно именно...

Браузер затупил. А может не он.....
Всех приветствую и надеюсь на квлифицированную помощь. Ситуация: стоит роутер dlink 320 к нему...

9
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
12.09.2013, 22:30 2
Не вопрос. Задержка 10 мкс под кварц 8 МГц, частоту таймера 1 подбираем сами ;)

Код
;инициализация

OUTI   OCR1AH,0x00  ;тут подстраиваем частоту
OUTI   OCR1AL,0xF5
OUTI   TCCR1B,(1<<WGM12)|(1<<CS10)

OUTI   OCR2,0x50  ;а тут- длительность импульса (для 8 МГц такта- 10 мкс)

OUTI   TIMSK,(1<<OCIE1A)|(1<<OCIE2)  ;ну и прерывания разрешим

t1_int:   ; Timer/Counter1 Compare Match A

sbi   portb,2  ;ножку в "1"

outi   tcnt2,0x00  ;пуск второго таймера
OUTI   TCCR2,(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20)

reti

t2_int:   ; Timer/Counter2 Compare Match

cbi   portb,2  ;ножку в "0"
OUTI   TCCR2,(1<<WGM21)|(0<<CS22)|(0<<CS21)|(0<<CS20) ;стоп машина (сам себя)

;тут после пары простых проверок и вычислений забрасывает в ICP1 новое значение или останавливает таймер1.

reti
Как-то так. Обработчики прерываний написал без сохранения регистров. И значение забрасывать не в ICP1, а в OCR1AH : OCR1AL.

upd. для 500 Гц должно быть 3е80, для 2000Гц 0fa0
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
13.09.2013, 00:40 3
Цитата Сообщение от hixFF
И значение забрасывать не в ICP1, а в OCR1AH : OCR1AL.
На самом деле в ICR1 (не ICP1 - очепятка) тоже можно забрасывать новое значение TOP. В Меге8 Таймер1 умеет и от OCR1A, и от ICR1 брать верхнее значение.
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
13.09.2013, 00:47 4
знаю, но я привык к OCR1A, на нем и сделал.
0
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
13.09.2013, 01:24 5
Цитата Сообщение от OtyxPM
Цитата Сообщение от hixFF
И значение забрасывать не в ICP1, а в OCR1AH : OCR1AL.
На самом деле в ICR1 (не ICP1 - очепятка) тоже можно забрасывать новое значение TOP. В Меге8 Таймер1 умеет и от OCR1A, и от ICR1 брать верхнее значение.

Вот с использованием регистра захвата
Код
include <avr/io.h>
#include <avr/interrupt.h>

#define  T2_START() (0 << CS22)|(1 << CS21)|(0 << CS20)
#define  T2_STOP() (0 << CS22)|(0 << CS21)|(0 << CS20)

int main(void)
{
DDRB=0xFF;
PORTB=0x00;

TCCR1B = (1 << WGM13)|(1 << WGM12)|(0 << CS12)|(1 << CS11)|(0 << CS10);
ICR1 = 2000;
TIMSK = (1 << TICIE1)|(1 << TOIE2);
asm("sei");

while(1)
{
asm("NOP");
}
}

ISR(TIMER1_CAPT_vect)
{
PORTB |= (1 << PB2);
TCNT2 = 246;         // инициализация 10 ms
TCCR2 = T2_START();
}

ISR(TIMER2_OVF_vect)
{
PORTB &= ~(1 << PB2);
TCCR2 = T2_STOP();
}
Но чего-то я не вкурю, почему в студии код работает, а в протеусе нет. В чем глюк?
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
13.09.2013, 08:39 6
Вот и я делал по такому же принципу, но у меня в симуляции и в железе полный бред. Может быть всё же регистры сохранять?
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
13.09.2013, 22:12 7
Цитата Сообщение от Kosym
Вот и я делал по такому же принципу, но у меня в симуляции и в железе полный бред. Может быть всё же регистры сохранять?
если на асме- да, сишный же компилятор это сам сделает
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
15.09.2013, 08:28 8
Странно, но через ICP1 у меня так и не захотело работать - не возникает прерывание, хотя всё включено, хз что происходит. Через OCR1a работает, код тот же, только дополнительно разрешил прерывание, поменял вектор и добавил значение в sompare1a.
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
15.09.2013, 14:05 9
Через ICP- не знаю, не делал никогда. OCR1A выручало. Сегодня попробую.
На каком языке пишете?
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
15.09.2013, 14:24 10
я в баскоме пишу, партийная кличка - барсик :)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2013, 14:24
Помогаю со студенческими работами здесь

Затупил с выбором роутера! (ограничение скорости)
Здравствуйте форумчани,недавно купил роутер,раньше с ними дела не имел соответственно не очень...

Помогите, пожалуйста. Где-то затупил и не могу найти ошибку
$this-&gt;first_player-&gt;clear(); $this-&gt;second_player-&gt;clear(); ...

Помогите с парой вопросов
Я только на прошлой неделе взялся за Basic поэтому ответы ,если можно, более подробные. 1)Как...

Помогите с парой прог на C
1. Известны три натуральных числа, характеризующие данный момент времени: часы, минуты, секунды....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru