AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
22.12.2013, 17:26
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Помогите разобраться с таймером
Знатоки помогите правильно настроить прерывание по таймеру.Я ниже приведу все свои расчеты по вычислению числа для компаратора.
Я взял микросхему ATiny2313 вернее ее аналог AT90S2313 с целью научиться работать с портами и прерываниями. Код пишу в AVR Studio5 симулирую в протеусе 7.10. И задался я целью написать програмку где у МК на порте В висят 8 диодов и через каждые 8сек они по очереди загораются, тактовую частоту микроконтроллера взял за 5Мгц. Дальше мои вычисления.
Период МК : 1/5Мгц =200наносек.
Сброс таймера через : 8/8 = 1000милисек (каждый диод горит 8 сек)
При частоте кварца от МК 5Мгц таймер досчитает до 65535 за : 200нс*65535=13милисек.
Частота таймера : 13мс*256=3328мс=3,3сек.
период частоты таймера : 200нс*256=51Микросек.
получаем число которое нужно загрузить в таймер 1000мс/51мкс=19607.
19607(10)=4с97(16) и это число я записываю в регистр программка компилируется нех файл гружу в протеус и по результатам симуляции диоды загораются 2 раза в секунду каждый, приблизительно ))). Подскажите где моя ошибка.
Цитата:
|
Код:
|
.include "2313def.inc"
.def temp=R16
.def temp1=R17
.def temp2=R18
.def temp3=R19
.def temp4=R20
.cseg
.org 0
rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
RESET: ldi TEMP,0xff
OUT DDRB,TEMP ;ИНИЦИАЛИЗАЦИЯ ПОРТА НА ВЫХОД
LDI TEMP,0B01000000 ; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ КОМПАРАТОРА
OUT TIMSK,TEMP
LDI TEMP,0B00000100 ;РЕЖИМ ТАКТОВОГО СИГНАЛА ТАЙМЕРА
OUT TCCR1B,TEMP
LDI TEMP,0X4C ;ЗАГРУЖАЕМ ЧИСЛО ДЛЯ СРАВНЕНИЯ (ИНИЦИАЛИЗАЦИЯ КОМПАРАТОРА)
OUT OCR1AH,TEMP
LDI TEMP,0X97
OUT OCR1AL,TEMP
LDI TEMP,RAMEND ;УКАЗАТЕЛЬ НА ПАМЯТЬ
OUT SPL,TEMP
LDI TEMP1,0X01 ;ИНИЦИАЛИЗАЦИЯ ИНДИКАТОРА
LDI TEMP,0
OUT TCNT1H,TEMP
OUT TCNT1L,TEMP
SEI ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ
START: RJMP START ;БЕСКОНЕЧНЫЙ ЦИКЛ
TIMER1_COMP1: LDI TEMP,0
OUT TCNT1H,TEMP
OUT TCNT1L,TEMP
BEGIN: OUT PORTB,TEMP1
CPI TEMP1,0X80
BREQ UNIT
LSL TEMP1
RJMP BEGIN
RJMP BEGIN
UNIT: LDI TEMP1,0B00000001
RJMP BEGIN
END: |
|
|
|
|
|
22.12.2013, 19:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Ребята помогите разобраться с таймером
Начнем с того, что Ваши расчеты слегка не верны.
Если используете таймер 1, то у него есть предделитель. Максимальное число 1024. Т.е. период инкрементирования 1024/5МГц=0,0002048с.
Если нужно получить тайминг 8с, то 8/0,0002048=39062,5. Это число (без дробной части) загружаете в ригистр сравнения и получаете нужную выдержку. Как-то так.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
22.12.2013, 21:14
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ребята помогите разобраться с таймером
alvadep, я вычислил позже по другому : 5Мгц/1024=4883 тактов секунду и после для получения числа загружаемого в таймер : 4883*8секунд=39064(10) и 9898(16) это число загрузил в таймер но в протеусе снова диоды моргают не так как задумывалось. Не выдерживается временной интервал в 8 секунд.
|
|
|
|
22.12.2013, 22:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Ребята помогите разобраться с таймером
Fraktal, я что-то не вижу выхода из прерывания Timer1_comp1.
У Вас получается программа крутится по циклу BEGIN не выходя из прерывания, соответственно перебор светиков происходит все время, а не по прерыванию.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
22.12.2013, 23:06
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ребята помогите разобраться с таймером
alvadep, Благодарю Вас я разобрался с Вашей помощью!!! и ВОЗНИК ЕЩЕ ОДИН ВОПРОС - при отладке программы в AVR Studio5 в окне просмотра I/O View в регистре TIMSK поднимается 5-й бит т.е. бит-OCIE1B хотя я записываю в TIMSK значение 01000000 и по идее должен подниматься 6-й бит : OCIE1A. Почему так? или это настройки среды программирования на это влияют?
Код:
|
.include "2313def.inc"
.def temp=R16
.def temp1=R17
.def temp2=R18
.def temp3=R19
.def temp4=R20
.cseg
.org 0
rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
RESET: ldi TEMP,0xff
OUT DDRB,TEMP ;ИНИЦИАЛИЗАЦИЯ ПОРТА НА ВЫХОД
LDI TEMP,0B01000000 ; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ КОМПАРАТОРА
OUT TIMSK,TEMP
LDI TEMP,0B00000101 ;РЕЖИМ ТАКТОВОГО СИГНАЛА ТАЙМЕРА
OUT TCCR1B,TEMP
LDI TEMP,0X98 ;ЗАГРУЖАЕМ ЧИСЛО ДЛЯ СРАВНЕНИЯ (ИНИЦИАЛИЗАЦИЯ КОМПАРАТОРА)
OUT OCR1AH,TEMP
LDI TEMP,0X98
OUT OCR1AL,TEMP
LDI TEMP,RAMEND ;УКАЗАТЕЛЬ НА ПАМЯТЬ
OUT SPL,TEMP
LDI TEMP1,0X80 ;ИНИЦИАЛИЗАЦИЯ ИНДИКАТОРА
LDI TEMP,0
OUT TCNT1H,TEMP
OUT TCNT1L,TEMP
SEI ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ
START: RJMP START ;БЕСКОНЕЧНЫЙ ЦИКЛ
TIMER1_COMP1: LDI TEMP,0
OUT TCNT1H,TEMP
OUT TCNT1L,TEMP
BEGIN:
CPI TEMP1,0X80
BREQ UNIT
LSL TEMP1
RJMP OUTPUT
UNIT: LDI TEMP1,0B00000001
OUTPUT: OUT PORTB,TEMP1
RETI
END: |
|
|
|
|
23.12.2013, 00:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: Помогите разобраться с таймером
Вы в настройках проекта выбрали какой контроллер?
Пробуйте так написать
ldi TEMP,(1‹‹OCIE1A)
out TIMSK,TEMP
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
23.12.2013, 02:22
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с таймером
gary2007, указал команду как Вы мне посоветовали , все равно поднимается 5-й бит OCIE1B. Контроллер в настройках выбрал ATtiny2313
|
|
|
|
23.12.2013, 02:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: Помогите разобраться с таймером
Выберете тот который стоит. У них TIMSK отличаются, если верить ДШ.
Или что-то не так в настройках проекта.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
23.12.2013, 03:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите разобраться с таймером
Для 4МГц 8 минут.
UPD
Вставил формулу - так удобнее
Последний раз редактировалось omercury; 23.12.2013 в 04:36.
|
|
|
Сказали "Спасибо" omercury
|
|
|
23.12.2013, 09:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Помогите разобраться с таймером
Сообщение от omercury
|
Для 4МГц 8 минут.
|
Не верю! (Станиславский). ![Улыбка](images/smilies/icon_smile.gif)
При 4 МГц и предделителе 1024 переполнение таймера 1 будет происходить примерно каждые 17 сек.
Последний раз редактировалось alvadep; 23.12.2013 в 10:09.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:57.
|
|