Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2013, 09:56   #1
Admin2
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 40
По умолчанию AVR. Почему одно прерывание блокирует другое?

Не могу понять, что не так. В программе два прерывания. Одно прерывание по переполнению счетчика С0. Внешний сигнал генерирую с помощью свободной ножки PC3. Второе прерывание по совпадению значения таймера Т1 с числом. Проблема в том, что прерывание OVF0 никогда не выполняется и соответственно строчка out PortD, R1 тоже. А вот если Закомментировать строчки
Код:
                        .org 6 
                        rjmp OC1A ; Прерывание при совпадении значения таймера Т1 с числом А
                        OC1A:
                        reti
тогда все пучком. Подскажите, что здесь не так?
Код:
; *********************************************************
; Для AVR: AtMega8                                        *
; Тактовая частота: 8МГц                                  *
;**********************************************************
 
; Выполняемые функции: отображает частоту входного сигнала на трех
; семисегментных индикаторах
 
.device         atmega8
.nolist
.include "m8def.inc"   
.list
 
; =======================
; Обьявления
 
.def   temp            =r16
 
; =======================
; Начало программы
 
.org 0 
rjmp Init  
.org 6 
rjmp OC1A ; Прерывание при совпадении значения таймера Т1 с числом А
.org 9
rjmp OVF0 ; переход по переполнению счетчика С0     
 
 
 ; =======================
 ; Прерывание при переполнении счетчика С0
 OVF0:
   out  PortD, R1 
 reti  
 
 ; Прерывание при совпадении значения таймера Т1 с числом А
 OC1A:
 
 reti 
 
; =======================
Init:
 
  ; загрузка цифр
  ldi   temp,  0b11101110  ; 0
  mov   R0,    temp
  ldi   temp,  0b00100100  ; 1
  mov   R1,    temp
 
  ; Инициализация стека
  LDI temp,Low(RAMEND)
  OUT SPL,temp
  LDI temp,High(RAMEND)
  OUT SPH,temp
 
  ; Инициализация порта В. Светодиод, кварц, кнопки
  ldi   temp,  0b00001111   ; PB0-PB2 - не исп., PB3-голубой светодиод (указывает на кГц)
  out   DDRB,  temp         ; PB4-PB5 - кнопки (не используются), PB6, PB7 - кварц. 
  ldi   temp,  0b00110000   ; Подтяжка включена только для неиспользуемых кнопок
  out   PortB, temp    
 
  ; Инициализация порта С. Выбор семисегментного индикатора (разряда)
  ; для последовательного отображения цифры
  ldi   temp,  0b111111     ; Разряд 1: PС0, разряд 2: PС1, разряд 3: PС2 
  out   DDRC,  temp         ; PС3-соединен с ножкой PD4(T0), PC4-PС6 - не используются
  ldi   temp,  0b000010
  out   PortC, temp         ; все разряды выключены 
 
  ; Инициализация порта D. Подсветка сегментов, тактирующий вход для измерения частоты
  ldi   temp,  0b11101111   ; Светодиодный индикатор: PD0-g, PD1-f, PD2-c, 
  out   DDRD,  temp         ; PD3-d, PD4-внешнее тактирование, PD5-b, PD6-a, PD7-e.
  clr   temp
  out   PortD, R0         ; Подтяжка выключена, все выходы выключены 
 
  ; Настройка параметров счетчика Counter0
  ldi   temp,  0b00000111   ; 111 - тактирование по возрастанию импульса
  out   TCCR0, temp         ; остальные биты не используются
  ldi   temp,  0b00000001   ; 1 - прерывание по переполнению счетчика разрешено
  out   TIMSK, temp         ; остальные биты для других таймеров
 
  ; Настройка параметров 16-битного таймера Timer1
  ldi   temp,   0b00000010  ; тактовая частота / 8
  out   TCCR1B, temp        ; получаем частоту 1000000
  ldi   temp,   0b00010000  ; 
  out   TIMSK, temp         ; разрешить прерывание по совпадению
  ldi   temp,   0b00000000  ; младший байт числа для сравнения
  out   OCR1AL, temp        ;  
  ldi   temp,   0b11111010  ; старший байт числа для сравнения
  out   OCR1AH, temp        ; получаем число 64000
  ; это число тактов будет достигнуто за 0.064 сек.
 
  sei                       ; Разрешаем прерывания
 
 ; =======================
 ; Основное тело программы
 Start:
    ; бесконечное переключение ножки РС3
    : при этом должен идти счет на счетчике С0
    ldi  temp,  0b001010
    out  PortC, temp
 
    ldi  temp,  0b000010
    out  PortC, temp
 
 rjmp Start
Admin2 вне форума Ответить с цитированием
Старый 27.07.2013, 22:30   #2
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

При беглом взгляде, как минимум потому, что настройки одного таймера затирают другой. Т.е вы записали в регистр управления настройки для одного таймера, затем поверх пишите настройки другого таймера, в итоге будет работать последний.

Код:
; Настройка параметров счетчика Counter0
  ldi   temp,  0b00000111   ; 111 - тактирование по возрастанию импульса
  out   TCCR0, temp         ; остальные биты не используются
  ldi   temp,  0b00000001   ; 1 - прерывание по переполнению счетчика разрешено
  out   TIMSK, temp         ; остальные биты для других таймеров
 
  ; Настройка параметров 16-битного таймера Timer1
  ldi   temp,   0b00000010  ; тактовая частота / 8
  out   TCCR1B, temp        ; получаем частоту 1000000
  ldi   temp,   0b00010000  ; 
  out   TIMSK, temp         ; разрешить прерывание по совпадению
  ldi   temp,   0b00000000  ; младший байт числа для сравнения
  out   OCR1AL, temp        ;  
  ldi   temp,   0b11111010  ; старший байт числа для сравнения
  out   OCR1AH, temp        ; получаем число 64000
  ; это число тактов будет достигнуто за 0.064 сек.
Чтобы этого не было выставляете биты управления для всех счётчиков в какую-нибудь переменную, затем уже переносите в регистр управления. Т.е что-то типа этого для разрешения прерывания двух таймеров:

Код:
	ldi temp, 1<<TOIE0|1<<OCIE1A
	out TIMSK,temp			;Разрешение прерываний таймеров

Последний раз редактировалось С.М.С; 27.07.2013 в 22:35.
С.М.С вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Два задания по Visual Basic: одно по массивам другое по строкам lolpol Помощь студентам 0 11.05.2013 22:59
Паскаль. Процедуры. Заменить в тексте одно слово на другое JosH7 Помощь студентам 3 23.09.2012 22:06
Описание одно, в примере другое winhttp Общие вопросы Delphi 11 15.08.2012 12:48
Заменить в строке одно слово на другое, заданное с клавиатуры. trum Помощь студентам 5 05.04.2012 17:48
как одно слово заменить не другое? ilyha93 Паскаль, Turbo Pascal, PascalABC.NET 2 27.12.2011 20:07