Помогите с таймером на Atmega 16
Помогите с таймером на Atmega 16
Помогите плииз написать программу на Atmega16 с инициализацией таймера с прерыванием для вывода на светодиод сигнала с задержкой в 1с. Частота контроллера 7.3728 Мгц!
Заранее, огромное спасибо.
Заранее, огромное спасибо.
- Реклама
Re: Помогите с таймером на Atmega 16
делать надо так: в ОСR1A записываешь 28800(десятичное). таймер1 настраиваешь на режим CTC c ТОP - OCR1A (биты WGM1*). предделитель настраиваешь на 256 (биты СS1*). включаешь прерывания по переполнениею для timer1. прерывание будет вызываться 1 раз в секунду. т.е. с частотой 1Гц. в прерывании меняешь состояние светодиода на противоположное. светодиод будет мигать с частотой 0.5Гц. чтобы увеличить до 1 герца, нужно уменьшить значение OCR1A до 14400.
на своем языке реализуешь?
на своем языке реализуешь?
Re: Помогите с таймером на Atmega 16
Спасибо. Пишу на ассемблере, но не могу разобраться с инициализацией прерываний вообще.
Re: Помогите с таймером на Atmega 16
HEELP!!!!
Re: Помогите с таймером на Atmega 16
соответствующий бит (TOIE1) в TIMSK установили и sei выполнили да?
- Реклама
Re: Помогите с таймером на Atmega 16
да. там записал, но не пойму где должен быть цикл таймера, а где прерывание. И каким образом в каком месте вызвать прерывание.
Re: Помогите с таймером на Atmega 16
Сделайте себе вот такой шаблон,хотя эти процы не сильно и отличаются.
- Вложения
-
- Шаблон программы AVR_8535.rar
- (1.83 КБ) 372 скачивания
Re: Помогите с таймером на Atmega 16
Маска ясна. Но там внешнее прервание, а у меня получается внутреннее, от переполнения таймера. Как его прописать?
Re: Помогите с таймером на Atmega 16
прерывания вызывать не надо. они сами вызываются. вам надо только обработчик положить в нужное место (прыгнуть на него из нужного места
). что такое цикл таймера? в твоей задаче главный цикл программы можно оставить пустым.
какая маска ясна? в TIMSK маскируются прерывания от таймеров.
какая маска ясна? в TIMSK маскируются прерывания от таймеров.
Re: Помогите с таймером на Atmega 16
Добавлю-я когда то-же писал только на асме,но для установки регистров использовал калькулятор CVAVR.Вещь уникальная,его стартовый код можно использовать в любой среде разработки для avr,разумеется.
Re: Помогите с таймером на Atmega 16
Вот написанная программа. Но не получается зайти в прерывание
.include "m16def.inc"
.device ATMEGA16
;--задаем имена регистрам------------------
.def temp = r16 ;рабочая переменная
; ---------------Проинициализировали указатель стека------
ldi r16,high(RAMEND) ; Начало
out SPH,r16 ; основной программы
ldi r16,low(RAMEND)
out SPL,r16
;--прерывания------------------------------
rjmp RESET ;Reset Handle
reti; jmp EXT_INT0 ; IRQ0 Handler
reti; jmp EXT_INT1 ; IRQ1 Handler
reti; jmp TIM2_COMP ; Timer2 Compare Handler
reti; jmp TIM2_OVF ; Timer2 Overflow Handler
reti; jmp TIM1_CAPT ; Timer1 Capture Handler
jmp TIM1_COMPA ; Timer1 CompareA Handler
reti; jmp TIM1_COMPB ; Timer1 CompareB Handler
reti; jmp TIM1_OVF ; Timer1 Overflow Handler
reti; jmp TIM0_OVF ; Timer0 Overflow Handler
reti; jmp SPI_STC ; SPI Transfer Complete Handler
reti; jmp USART_RXC ; USART RX Complete Handler
reti; jmp USART_UDRE ; UDR Empty Handler
reti; jmp USART_TXC ; USART TX Complete Handler
reti; jmp ADC ; ADC Conversion Complete Handler
reti; jmp EE_RDY ; EEPROM Ready Handler
reti; jmp ANA_COMP ; Analog Comparator Handler
reti; jmp TWSI ; Two-wire Serial Interface Handler
reti; jmp EXT_INT2 ; IRQ2 Handler
reti; jmp TIM0_COMP ; Timer0 Compare Handler
reti; jmp SPM_RDY ; Store Program Memory Ready Handler
RESET:
;------ Инициализация портов --------
ldi r17, 0x00
out PINA, r17 ; деактивируем Pull-up резисторы
ldi r17, 0x00
out DDRA, r17 ; порт на вывод
;--настройка прерываний------------------------------------
ldi R16,(0<<ISC00)|(1<<ISC01) ;Условие прерывания - спадающий фронт сигнала
out MCUCR,R16
; инициализация прерывания
sei ;разрешаем прерывания
;--//настройка прерываний------------------------------------
;------ Инициализация таймера --------
ldi r16, 0x10
out TIMSK, r16 ; разрешение прерывания по переполнению TCNT
ldi r16, 0x00
out OCR1AH, r16 ;
ldi r16, 0x04
out OCR1AL, r16 ; устанавливаем предел счета 65535
;------------- Тело ----------------------------
ldi r20, 0xAA ; загрузка 10101010 на вывод в PORTA
ldi r21, 0xFF ; слагаемое для Суммы по модулю 2
ldi r16, 0x00
out TCCR1A, r16 ; очистка TCCR1A
ldi r16, 0x0B ; запуск Таймера
out TCCR1B, r16 ; ставим предделитель в CLK/1024
Cycle: ; основной пустой цикл
out PORTA, r20
jmp Cycle
;------- Прерывание --------------
TIM1_COMPA:
push R16
in R16,SREG
push R16
in r20,PORTA ; загрузка 10101010 на вывод в PORTA
ldi r21, 0xFF ; слагаемое для Суммы по модулю 2
eor r20, r21 ; Изменение 10101010 на 01010101
out PORTA, r20
pop R16 ;Востанавливаем регистры
out SREG,R16
pop R16
reti
.include "m16def.inc"
.device ATMEGA16
;--задаем имена регистрам------------------
.def temp = r16 ;рабочая переменная
; ---------------Проинициализировали указатель стека------
ldi r16,high(RAMEND) ; Начало
out SPH,r16 ; основной программы
ldi r16,low(RAMEND)
out SPL,r16
;--прерывания------------------------------
rjmp RESET ;Reset Handle
reti; jmp EXT_INT0 ; IRQ0 Handler
reti; jmp EXT_INT1 ; IRQ1 Handler
reti; jmp TIM2_COMP ; Timer2 Compare Handler
reti; jmp TIM2_OVF ; Timer2 Overflow Handler
reti; jmp TIM1_CAPT ; Timer1 Capture Handler
jmp TIM1_COMPA ; Timer1 CompareA Handler
reti; jmp TIM1_COMPB ; Timer1 CompareB Handler
reti; jmp TIM1_OVF ; Timer1 Overflow Handler
reti; jmp TIM0_OVF ; Timer0 Overflow Handler
reti; jmp SPI_STC ; SPI Transfer Complete Handler
reti; jmp USART_RXC ; USART RX Complete Handler
reti; jmp USART_UDRE ; UDR Empty Handler
reti; jmp USART_TXC ; USART TX Complete Handler
reti; jmp ADC ; ADC Conversion Complete Handler
reti; jmp EE_RDY ; EEPROM Ready Handler
reti; jmp ANA_COMP ; Analog Comparator Handler
reti; jmp TWSI ; Two-wire Serial Interface Handler
reti; jmp EXT_INT2 ; IRQ2 Handler
reti; jmp TIM0_COMP ; Timer0 Compare Handler
reti; jmp SPM_RDY ; Store Program Memory Ready Handler
RESET:
;------ Инициализация портов --------
ldi r17, 0x00
out PINA, r17 ; деактивируем Pull-up резисторы
ldi r17, 0x00
out DDRA, r17 ; порт на вывод
;--настройка прерываний------------------------------------
ldi R16,(0<<ISC00)|(1<<ISC01) ;Условие прерывания - спадающий фронт сигнала
out MCUCR,R16
; инициализация прерывания
sei ;разрешаем прерывания
;--//настройка прерываний------------------------------------
;------ Инициализация таймера --------
ldi r16, 0x10
out TIMSK, r16 ; разрешение прерывания по переполнению TCNT
ldi r16, 0x00
out OCR1AH, r16 ;
ldi r16, 0x04
out OCR1AL, r16 ; устанавливаем предел счета 65535
;------------- Тело ----------------------------
ldi r20, 0xAA ; загрузка 10101010 на вывод в PORTA
ldi r21, 0xFF ; слагаемое для Суммы по модулю 2
ldi r16, 0x00
out TCCR1A, r16 ; очистка TCCR1A
ldi r16, 0x0B ; запуск Таймера
out TCCR1B, r16 ; ставим предделитель в CLK/1024
Cycle: ; основной пустой цикл
out PORTA, r20
jmp Cycle
;------- Прерывание --------------
TIM1_COMPA:
push R16
in R16,SREG
push R16
in r20,PORTA ; загрузка 10101010 на вывод в PORTA
ldi r21, 0xFF ; слагаемое для Суммы по модулю 2
eor r20, r21 ; Изменение 10101010 на 01010101
out PORTA, r20
pop R16 ;Востанавливаем регистры
out SREG,R16
pop R16
reti
Re: Помогите с таймером на Atmega 16
инициализацию стэка надо делать после таблицы прерываний. перед ней надо добавить .org 0
таблицу сами набирали? она соответствует меге16? еще написано в комментах прерывание по переполнению, а обработчик по совпадению.
таблицу сами набирали? она соответствует меге16? еще написано в комментах прерывание по переполнению, а обработчик по совпадению.
Re: Помогите с таймером на Atmega 16
и зачем темы плодить одинаковые???
Re: Помогите с таймером на Atmega 16
У Вас неправильная адресация таблицы векторов прерываний mega16.Slavast писал(а):Вот написанная программа. Но не получается зайти в прерывание
Вот, что получилось после коррекции первого варианта программы А это картинка ее работы
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Помогите с таймером на Atmega 16
akl
уж если учить студентов, то правильному.
везде и всем советую оформлять адреса прерываний только так:
причем название вектора очень рекомендую копи/пастить из def-файла.
проблем на порядок сразу уменьшится.
и не пишите, это уже студентам
, вы абсолютные значения, используйте имена регистров и битов
уж если учить студентов, то правильному.
везде и всем советую оформлять адреса прерываний только так:
Код: Выделить всё
.org OC1Aaddr ; 0x000c Timer/Counter1 Compare Match A
rjmp(jmp) <имя_обработчика>
проблем на порядок сразу уменьшится.
и не пишите, это уже студентам
Re: Помогите с таймером на Atmega 16
Всем спасибо!
Разобрался!)
Разобрался!)



