Помогите с таймером на Atmega 16

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Помогите с таймером на Atmega 16

Сообщение Slavast »

Помогите плииз написать программу на Atmega16 с инициализацией таймера с прерыванием для вывода на светодиод сигнала с задержкой в 1с. Частота контроллера 7.3728 Мгц!
Заранее, огромное спасибо.
Реклама
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Помогите с таймером на Atmega 16

Сообщение lix »

делать надо так: в ОСR1A записываешь 28800(десятичное). таймер1 настраиваешь на режим CTC c ТОP - OCR1A (биты WGM1*). предделитель настраиваешь на 256 (биты СS1*). включаешь прерывания по переполнениею для timer1. прерывание будет вызываться 1 раз в секунду. т.е. с частотой 1Гц. в прерывании меняешь состояние светодиода на противоположное. светодиод будет мигать с частотой 0.5Гц. чтобы увеличить до 1 герца, нужно уменьшить значение OCR1A до 14400.

на своем языке реализуешь?
Реклама
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение Slavast »

Спасибо. Пишу на ассемблере, но не могу разобраться с инициализацией прерываний вообще.
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение Slavast »

HEELP!!!!
Реклама
Эиком - электронные компоненты и радиодетали
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Помогите с таймером на Atmega 16

Сообщение lix »

соответствующий бит (TOIE1) в TIMSK установили и sei выполнили да?
Реклама
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение Slavast »

да. там записал, но не пойму где должен быть цикл таймера, а где прерывание. И каким образом в каком месте вызвать прерывание.
Реклама
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Помогите с таймером на Atmega 16

Сообщение Vov123 »

Сделайте себе вот такой шаблон,хотя эти процы не сильно и отличаются.
Вложения
Шаблон программы AVR_8535.rar
(1.83 КБ) 372 скачивания
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение Slavast »

Маска ясна. Но там внешнее прервание, а у меня получается внутреннее, от переполнения таймера. Как его прописать?
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Помогите с таймером на Atmega 16

Сообщение lix »

прерывания вызывать не надо. они сами вызываются. вам надо только обработчик положить в нужное место (прыгнуть на него из нужного места :) ). что такое цикл таймера? в твоей задаче главный цикл программы можно оставить пустым.
какая маска ясна? в TIMSK маскируются прерывания от таймеров.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Помогите с таймером на Atmega 16

Сообщение Vov123 »

Добавлю-я когда то-же писал только на асме,но для установки регистров использовал калькулятор CVAVR.Вещь уникальная,его стартовый код можно использовать в любой среде разработки для avr,разумеется.
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение Slavast »

Вот написанная программа. Но не получается зайти в прерывание
.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
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Помогите с таймером на Atmega 16

Сообщение lix »

инициализацию стэка надо делать после таблицы прерываний. перед ней надо добавить .org 0
таблицу сами набирали? она соответствует меге16? еще написано в комментах прерывание по переполнению, а обработчик по совпадению.
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Помогите с таймером на Atmega 16

Сообщение lix »

и зачем темы плодить одинаковые???
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Помогите с таймером на Atmega 16

Сообщение akl »

Slavast писал(а):Вот написанная программа. Но не получается зайти в прерывание
У Вас неправильная адресация таблицы векторов прерываний mega16.
Вот, что получилось после коррекции первого варианта программы
t_mega16.asm
А это картинка ее работы
t_mega16.GIF
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение GP1 »

akl
уж если учить студентов, то правильному.
везде и всем советую оформлять адреса прерываний только так:

Код: Выделить всё

.org	OC1Aaddr	; 0x000c	 Timer/Counter1 Compare Match A
       rjmp(jmp) <имя_обработчика>

причем название вектора очень рекомендую копи/пастить из def-файла.
проблем на порядок сразу уменьшится.

и не пишите, это уже студентам :))) , вы абсолютные значения, используйте имена регистров и битов
Чем дальше, тем больше становлюсь занудой...
Изображение
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: Помогите с таймером на Atmega 16

Сообщение Slavast »

Всем спасибо!
Разобрался!)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»