Я - любитель и только начал разбираться с Мегой16. Глядя в книжки и даташит написал учебную программу, сигнализирующую переполнение таймера 1 в нормальном режиме хотя бы один раз. Ниже прилагаю код. Увы, эффекта нет((( Ломаю голову уже 16 часов, сил больше нет... Прошу помощи! В чем ошибка???
; АТМега16 ; Учебная программа работы с таймером 1 в нормальном режиме ; Первое прерывание по любому событию таймера 1 зажигает светодиод
.include "m16def.inc" ; Присоединение файла описаний .list ; Включение листинга
.def temp = r16 ; Определение главного рабочего регистра
;------------------------- Вектора прерывания rjmp RESET reti ;rjmp Прерывание 1 reti ;rjmp Прерывание 2 reti ;rjmp Прерывание 3 reti ;rjmp Прерывание 4 rjmp TIM1 ;Прерывание 5 Захват таймера-счетчика 1 rjmp TIM1 ;Прерывание 6 Совпадение А таймера-счетчика 1 rjmp TIM1 ;Прерывание 7 Совпадение В таймера-счетчика 1 rjmp TIM1 ;Прерывание 8 Переполнение таймера-счетчика 1 reti ;rjmp Прерывание 9 reti ;rjmp Прерывание 10 reti ;rjmp Прерывание 11 reti ;rjmp Прерывание 12 reti ;rjmp Прерывание 13 reti ;rjmp Прерывание 14 reti ;rjmp Прерывание 15 reti ;rjmp Прерывание 16 reti ;rjmp Прерывание 17 reti ;rjmp Прерывание 18 reti ;rjmp Прерывание 19 reti ;rjmp Прерывание 20
RESET: cli ; общий запрет прерываний
ldi temp, 0x80 ;Выключение компаратора out ACSR, temp
;-------------------------- Инициализация стека ldi temp, 0x7F ; Выбор адреса вершины стека out SPL, temp ; Запись его в регистр стека
;-------------------------- Инициализация портов ВВ ldi temp, 0xFF ; Запись числа $FF в регистр temp out DDRB, temp ; Запись этого числа в DDRB (порт PB на вывод) out PORTB, temp ; Запись то же числа в PORTB (потушить светодиод) ;--------------------------- Инициализация таймера-счетчика 1 out TIMSK, temp ;Разрешение прерываний по любому событию таймеров
ldi temp,0b00000000 out TCCR1A, temp ;Нормальный режим Таймера 1
ldi temp,0b00000011 ;Нормальный режим Таймера 1, Предделитель 1/64 out TCCR1B, temp ;---------------------------
sei ; общее разрешение прерываний
;-------------------------- Основной пустой цикл main: nop rjmp main ; К началу цикла
;-------------------------- Прерывания по таймеру 1 ; Если хотя бы раз происходит прерывание, загорается светодиод TIM1: ldi temp, 0x00 ; Записываем число $00 в регистр temp out PORTB, temp ; Записываем число 0x00 в PORTB (включить светодиод) reti
|