AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
02.09.2012, 11:44
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Прерывание по совпадению таймера 1
Доброе утро, Форумчане! Решил у Вам просить помощи, а то чего-то не догоняю. Мне необходимо при срабатывании внешнего прерывания INT0 запустить таймер 1. Так и делаю, но отловив внешнее прерывание таймер запускается, но прерывания так и не происходит. В отладчике вижу что TCNT1 обнуляется при сравнении, но в функцию так и не заходит...Привожу функции инициализации и обработки прерываний:
Код:
|
void INCUBATOR_Init()
{
//TIME_Init();
DDRB &= (1 ‹‹ 0) | (1 ‹‹ 1);
PORTB |= (1 ‹‹ 0) | (1 ‹‹ 1);
DDRC |= (1 ‹‹ 0);
PORTC &= ~(1 ‹‹ 0);
DDRD &= ~(1 ‹‹ 2);
PORTD |= (1 ‹‹ 2);
GICR |= (1 ‹‹ INT0); //разрешили прерывание
MCUCR = 0x00;
SREG |= (1 ‹‹ 7);
}
//------------
ISR(INT0_vect)
{
if(!enableZeroCross)
{
enableZeroCross = true;
OCR1A = delay_dimmer; // Значение для сравнения
TCNT1 = 0; // счетчик в ноль
TCCR1B |= (1 ‹‹ CS10) | ( 1‹‹ WGM12); // без предделителя и режим СТС по совпадению
TIMSK = (1 ‹‹ OCIE1A); // Разрешить прерывание при совпадении TCNT1 и OCR1A
}
}
//--------------------
ISR(TIMER1_COMPA_vect)
{
if(enableZeroCross)
{
TCNT1 = 0;
TCCR1B = 0x00;
PORTC |= (1 ‹‹ 0); // включить симмистор
_delay_us(50);
PORTC &= ~(1 ‹‹ 0);
enableZeroCross = false;
}
} |
|
|
|
|
02.09.2012, 11:45
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
пишу в avr studio...
|
|
|
|
02.09.2012, 12:45
|
|
Прописка
Регистрация: 07.02.2010
Адрес: Калининград
Сообщений: 148
Сказал спасибо: 72
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Это кусок моей программы которая использует прерывания от INT0 и от TMR0,1, все работает. Пишу на АСМ так что интерпретируй под свой язык.
BANK0
CLRWDT
MOVLW b'00110001' ; 7-6 не реализованы читаются 0
MOVWF T1CON ; 5-4 коэффициент деления предделителя TMR1 11=8 (00=1 01=2 10=4)
; 3 T1OSCEN 1=вкл 0=откл внутренний генератор для таймера
; 2 T1SYNC 1=вкл 0=откл синхронизация внешнего генератора
; 1 TMR1SC 1=внешний 0=внутренний см. стр. 48
; 0 TMR1ON 1=вкл 0=выкл модуль TMR1 целиком.
MOVWF T1CON
BANK1
MOVLW b'11010000' ; разрешаем прерывание от перефирии и от внешнего контакта
MOVWF INTCON ; 7 GIE 1=разрешено 0=запрещено
; 6 PEIE 1=да 0=нет прерывание от перефирии
; 5 T0IE 1=да 0=нет прерывание от переполнения TMR0
; 4 INTE 1=да 0=нет прерывание от INT
; 3 RBIE 1=да 0=нет прерывание от RB4-7
; 2 T0IF 1=да 0=нет было ли прерывание от TMR0
; 1 INTF 1=да 0=нет было ли прерывание от INT
; 0 RBIF 1=да 0=нет было ли прерывание от RB4-7
MOVLW b'00000001' ; разрешаем прерывание от переполнения TMR1 ***
MOVWF PIE1 ; настройка переферийных прерываний
; 7 EEIE 1=разрешено 0=запрещено от окончания записи в ЕПРОМ
; 6 CMIE 1=да 0=нет разрешить прерывание от компараторов
; 5 RCIE 1=да 0=нет разрешить прерывание от приемника USART
; 4 TXIE 1=да 0=нет разрешить прерывание от передатчика USART
; 3 не реализован всегда 0
; 2 CCP1IE 1=да 0=нет разрешить прерывание от модуля ССР1
; 1 TMR2IE 1=да 0=нет разрешить прерывание от переполнения TMR2
; 0 TMR1IE 1=да 0=нет разрешить прерывание от переполнения TMR1
__________________
Лужу, паяю, ЭВМ починяю.....
|
|
|
Сказали "Спасибо" Maxim39
|
|
|
02.09.2012, 12:56
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Спасибо, правда асм я знаю поскольку-постольку, да и контроллер atmega (извиняюсь, не написал).
|
|
|
|
02.09.2012, 13:07
|
|
Прописка
Регистрация: 07.02.2010
Адрес: Калининград
Сообщений: 148
Сказал спасибо: 72
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Это я поторопился потом дошло что контроллер другой.
Но думаю порядок действий такойже
__________________
Лужу, паяю, ЭВМ починяю.....
|
|
|
Сказали "Спасибо" Maxim39
|
|
|
02.09.2012, 13:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Пока контроллер находится в прерывании (INT) то остальные прерывания (таймер) запрещены. Если надо, ручками устанавливай флаг I
TIMSK настроил?
|
|
|
|
02.09.2012, 13:15
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
флаги разные, не все конечно...просто не понятно почему не работает. Таймер работает, запускается и считает и при совпадении сбрасывается в ноль и так далее. Думал может TIMER1_COMPA_vect неправильное название прерывания, но посмотрел везде, вроде бы правильное, да и компилер не ругается...Если счет идет, значит таймер настроен верно...
|
|
|
|
02.09.2012, 13:18
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Сообщение от niXto
|
Если надо, ручками устанавливай флаг I
|
Цитата:
|
SREG |= (1 ‹‹ 7); - устанавливаю при инициализации INT0
|
или надо каждый раз?
Сообщение от niXto
|
TIMSK настроил?
|
Цитата:
|
TIMSK = (1 ‹‹ OCIE1A);
|
|
|
|
|
02.09.2012, 14:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Сообщение от gruffi
|
таймер запускается, но прерывания так и не происходит
|
Кагбэ проверил.
После конфига TIMSK прерывание как бы происходит, но как-то странно...
переходит сюда - USART Data Register(UDR) Empty. Это в отладчике, ессно.
Итак, знатоки, внимание - вопрос - Это глюк или теракт?
test.zip
ПыСы. Студию тока что переустановил 4.18 Build 716 (SP3)
|
|
|
Сказали "Спасибо" omercury
|
|
|
02.09.2012, 14:49
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Прерывание по совпадению таймера 1
Так где может быть ошибка?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Как настроить прерывание от таймера реального времени
|
c04 |
Микроконтроллеры, АЦП, память и т.д |
0 |
25.05.2010 21:19 |
Внешнее прерывание на tiny15
|
livsha |
Микроконтроллеры, АЦП, память и т.д |
8 |
21.04.2010 01:11 |
Странно работает прерывание при совпадении таймера!
|
nagano |
Микроконтроллеры, АЦП, память и т.д |
5 |
18.11.2008 09:35 |
не обрабатывается прерывание от таймера во время АЦП
|
rusakov_a |
Микроконтроллеры, АЦП, память и т.д |
0 |
03.07.2008 01:33 |
Задача - таймер. и прерывание!
|
chipic128 |
Микроконтроллеры, АЦП, память и т.д |
11 |
22.02.2005 18:11 |
Часовой пояс GMT +4, время: 14:01.
|
|