Подскажите пожалуйста как сделать программу где срабатывает прерывание при TCNT0=OCR0.
Как я понимаю нужно создать вектор прерывания типа .ORG $XXX ?
Я рекомендую писать вот так (адреса взяты из файла-описания на ATmega128):astrgan писал(а):А может есть пример, а то все равно не получается.
Код: Выделить всё
.org 0x00
jmp RESET
jmp INT0addr ; External Interrupt0 Vector Address
jmp INT1addr ; External Interrupt1 Vector Address
jmp INT2addr ; External Interrupt2 Vector Address
jmp INT3addr ; External Interrupt3 Vector Address
jmp INT4addr ; External Interrupt4 Vector Address
jmp INT5addr ; External Interrupt5 Vector Address
jmp INT6addr ; External Interrupt6 Vector Address
jmp INT7addr ; External Interrupt7 Vector Address
jmp OC2addr ; Output Compare2 Interrupt Vector Address
jmp OVF2addr ; Overflow2 Interrupt Vector Address
jmp ICP1addr ; Input Capture1 Interrupt Vector Address
jmp OC1Aaddr ; Output Compare1A Interrupt Vector Address
jmp OC1Baddr ; Output Compare1B Interrupt Vector Address
jmp OVF1addr ; Overflow1 Interrupt Vector Address
jmp OC0addr ; Output Compare0 Interrupt Vector Address
jmp OVF0addr ; Overflow0 Interrupt Vector Address
jmp SPIaddr ; SPI Interrupt Vector Address
jmp URXC0addr ; USART0 Receive Complete Interrupt Vector Address
jmp UDRE0addr ; USART0 Data Register Empty Interrupt Vector Address
jmp UTXC0addr ; USART0 Transmit Complete Interrupt Vector Address
jmp ADCCaddr ; ADC Conversion Complete Handle
jmp ERDYaddr ; EEPROM Write Complete Handle
jmp ACIaddr ; Analog Comparator Interrupt Vector Address
jmp OC1Caddr ; Output Compare1C Interrupt Vector Address
jmp ICP3addr ; Input Capture3 Interrupt Vector Address
jmp OC3Aaddr ; Output Compare3A Interrupt Vector Address
jmp OC3Baddr ; Output Compare3B Interrupt Vector Address
jmp OC3Caddr ; Output Compare3C Interrupt Vector Address
jmp OVF3addr ; Overflow3 Interrupt Vector Address
jmp URXC1addr ; USART1 Receive Complete Interrupt Vector Address
jmp UDRE1addr ; USART1 Data Register Empty Interrupt Vector Address
jmp UTXC1addr ; USART1 Transmit Complete Interrupt Vector Address
jmp TWIaddr ; TWI Interrupt Vector Address
jmp SPMRaddr ; Store Program Memory Ready Interrupt Vector Address
;Заглушки неиспользуемых обработчиков прерываний
INT0addr: ; External Interrupt0 Vector Address
INT1addr: ; External Interrupt1 Vector Address
INT2addr: ; External Interrupt2 Vector Address
INT3addr: ; External Interrupt3 Vector Address
INT4addr: ; External Interrupt4 Vector Address
INT5addr: ; External Interrupt5 Vector Address
INT6addr: ; External Interrupt6 Vector Address
INT7addr: ; External Interrupt7 Vector Address
OC2addr: ; Output Compare2 Interrupt Vector Address
OVF2addr: ; Overflow2 Interrupt Vector Address
ICP1addr: ; Input Capture1 Interrupt Vector Address
OC1Aaddr: ; Output Compare1A Interrupt Vector Address
OC1Baddr: ; Output Compare1B Interrupt Vector Address
OVF1addr: ; Overflow1 Interrupt Vector Address
;OC0addr: ; Output Compare0 Interrupt Vector Address
OVF0addr: ; Overflow0 Interrupt Vector Address
SPIaddr: ; SPI Interrupt Vector Address
URXC0addr: ; USART0 Receive Complete Interrupt Vector Address
UDRE0addr: ; USART0 Data Register Empty Interrupt Vector Address
UTXC0addr: ; USART0 Transmit Complete Interrupt Vector Address
ADCCaddr: ; ADC Conversion Complete Handle
ERDYaddr: ; EEPROM Write Complete Handle
ACIaddr: ; Analog Comparator Interrupt Vector Address
OC1Caddr: ; Output Compare1C Interrupt Vector Address
ICP3addr: ; Input Capture3 Interrupt Vector Address
OC3Aaddr: ; Output Compare3A Interrupt Vector Address
OC3Baddr: ; Output Compare3B Interrupt Vector Address
OC3Caddr: ; Output Compare3C Interrupt Vector Address
OVF3addr: ; Overflow3 Interrupt Vector Address
URXC1addr: ; USART1 Receive Complete Interrupt Vector Address
UDRE1addr: ; USART1 Data Register Empty Interrupt Vector Address
UTXC1addr: ; USART1 Transmit Complete Interrupt Vector Address
TWIaddr: ; TWI Interrupt Vector Address
SPMRaddr: ; Store Program Memory Ready Interrupt Vector Address
reti
OC0addr: ; Output Compare0 Interrupt Vector Address
;Ваш код обработчика прерывания по совпадению
reti
RESET:
;Основная программа
Код: Выделить всё
;---------------------------
;________________________
;
.nolist
.include "m128def.inc"
.list
:-----------------------------------------------------------------------------
;
.cseg
.org 0x0000
;________________________
; здесь размещаются вектора прерываний
; или короткие подпрограммы их обслуживания
;
irq_res:
rjmp init ; вектор RESET, если небыло переконфигурации таблицы векторов и самого Вектора сброса (см. config fuse)
.org (irq_res+OC0addr)
rjmp ISR_OC0 ; или как я его хочу обозвать
;________________________
;
.org (irq_res+INT_VECTORS_SIZE)
; обход блока векторов прерываний
; блок начальной инициализации кристалла
init:
; точка входа в модуль начальной инициализации
;-----------------------------------------------------
ISR_OC0:
; а здесь уже сам обработчик данного прерыванияВо-первых, я показал лишь подход. Имена можно написать свои, убрав окончания "addr", это неважно. А в файле-описателе микросхемы прописаны соответствия имен обработчиков прерываний с адресами их расположения в памяти, но это не освобождает от необходимости расписывать всю таблицу векторов с командами jmp или rjmp (в зависимости от модели памяти контроллера) на адрес конкретного обработчика.BOB51 писал(а):Alkul, вот это как раз и есть классическая ошибка...![]()
в стандартном заголовочном файле avr studio обычно всегда подключается шаблон (в данном случае m128def.inc) - а там уже заявлены адреса векторов под собственными именами, которые повторно использовать не рекомендуется!
Имеется ввиду ошибка программиста-нуба. Кстати, давно хотел проверить в железе как выполняется опкод 0xFFFF? Протеус ругается и встает, AVR студия предупреждает, но едет дальше... Как до макетки доберусь, проверю.BOB51 писал(а):а с чего Вы взяли, что будут произвольно выполняться какие-либо из запрещенных прерываний?
Код: Выделить всё
.cseg
RJMP RESET ;RESET
RETI ;INT0
RJMP PIN_READ ;PCINT
RETI ;T0_OV
RETI ;EE_RDY
RETI ;ANA_COMP
RJMP CALC_BEMF ;T0=A
RETI ;T0=B
RETI ;WDT
RETI ;ADC
RESET:
Совершенно верно. К примеру, если в программе определен какой-то байт состояния, хранящийся, допустим, в ОЗУ, бит 0 которого, к примеру, определяет разрешение прерываний таймера 0. А другие биты определяют какие-то флаги состояния программы. Если забыть маскировать незначащие биты и напрямую занести содержимое байта состояния в регистр TIMSK, то окажутся разрешенными и другие прерывания таймеров. Ошибка, вполне достойная начинающего.Engineer_Keen писал(а):Имеется ввиду ошибка программиста-нуба.BOB51 писал(а):а с чего Вы взяли, что будут произвольно выполняться какие-либо из запрещенных прерываний?
Все верно, только следует помнить, что у контроллеров с объемом памяти программ больше 16 килобайт на каждый вектор отводится не одно слово, а два.Engineer_Keen писал(а):Что касается моего варианта - я просто перепечатываю таблицу прерываний из даташита и в ненужных строчках пишу RETI, а в нужных JMP/RJMP,Код: Выделить всё
.cseg RJMP RESET ;RESET RETI ;INT0 RJMP PIN_READ ;PCINT
Вот именно, что в инклюдах есть только записи вида:Engineer_Keen писал(а):Я не знал что в инклудах есть адреса векторов, с тех пор привык все писать сам.
Код: Выделить всё
; ***** INTERRUPT VECTORS ************************************************
.equ INT0addr = 0x0002 ; External Interrupt Request 0
.equ INT1addr = 0x0004 ; External Interrupt Request 1
.equ INT2addr = 0x0006 ; External Interrupt Request 2
//и так далее все адреса векторов
Код: Выделить всё
.cseg
.org 0
;*************************************************
;* ;;/Initialization Interrupts;;* *
;*************************************************
jmp RESET ; Reset Handler
.org OC2addr
jmp TIM2_COMP ; Timer2 Compare Handler
.org URXC0addr
jmp RS232_VESS; USART0 RX Complete Handler
.org ADCCaddr
jmp ADC_Complet
.org URXC1addr
jmp USART1_RXC; USART1 RX Complete Handler
.org UDRE1addr
jmp USART1_UDRE; USART1 TX Complete HandlerКод: Выделить всё
out TIMSK,R16
Код: Выделить всё
.include "m128def.inc"
.cseg
.org 0x00
jmp RESET
.org 0x30
RESET:
nop
nop
ldi R16,0x10
out TIMSK,R16
Если при этом Вы не описываете каждый вектор, а пишете только те, которые используете, то чем Ваш способ принципиально отличается от способа, предложенного BOB51?ILYAUL писал(а):Внесу свою лепту в Ваш разговор . Я делаю так
Всё лишнее (не нужное для данной программы) для остаётся "за бортом"
Не внимательно посмотрел его код , да похоже. И полностью принимаю его аргументы в его защиту. От себя добавлю , ни разу не было ни одного сбоя при такой организации адресов прерывания, правда место это не зкономит во FLASH, но вы можете убрать в def адреса по умолчанию и присвоить свои тем же прерываниям расположив их как Вам удобно , например только используемые и подряд учитывая специфику адресации применяемого процессораAlkul писал(а):[ли при этом Вы не описываете каждый вектор, а пишете только те, которые используете, то чем Ваш способ принципиально отличается от способа, предложенного BOB51?
И все потенциальные возможности для ошибок, описанные мной, полностью относятся и к Вашему способу.
Вы невнимательно прочли то, что писал я о проблемах, могущих возникнуть при использовании такого способа.ILYAUL писал(а):Не внимательно посмотрел его код , да похоже. И полностью принимаю его аргументы в его защиту. От себя добавлю , ни разу не было ни одного сбоя при такой организации адресов прерывания
Код: Выделить всё
.cseg
.org 0
;*************************************************
;* ;;/Initialization Interrupts;;* *
;*************************************************
jmp RESET ; Reset Handler
.org OC2addr
jmp TIM2_COMP ; Timer2 Compare Handler
.org URXC0addr
jmp RS232_VESS; USART0 RX Complete Handler
.org ADCCaddr
jmp ADC_Complet
.org URXC1addr
jmp USART1_RXC; USART1 RX Complete Handler
.org UDRE1addr
jmp USART1_UDRE; USART1 TX Complete Handler
.org SPIaddr
reti
.org SPMRaddr
reti
.org INT_VECTORS_SIZE
; основной код
Симмулятор Atmel "до ума" всё таки довести пока не может . И перед его использованием для любого MC надо обязательно лезть в его описание и смотреть , что он поддерживает , а что нет именно для данного MC. В том числе и прерывания.BOB51 а замечания-то насчет ограничений симулятора относительно таймеров и прочего народ не воспринял...