Например TDA7294

Форум РадиоКот • Просмотр темы - Непонятки с прерываниями в AVR Studio
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пн июн 23, 2025 16:35:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 16:33:18 
Родился

Зарегистрирован: Чт янв 25, 2018 20:28:19
Сообщений: 11
Рейтинг сообщения: 0
Приветствую всех форумчан! Начинающий в программировании. Пишу программу на ассемблере в AVR Studio для ATmega16. И что-то не сходятся вектора прерываний. В документации указано, что прерывание по переполнению T1 находится на векторе 8. А в программе - по факту на 15-м. Может кто подскажет, что это. Может особенность какая-то.

И ещё вопрос: для перехода в подпрограмму обработки прерываний какую команду обычно используют? RJMP или RCALL? И для выхода из подпрограммы прерывания применяют RETI только для того, чтобы глобально разрешить прерывания? А если это не нужно - пойдет и RET?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 16:59:03 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 38
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
Vjatheslav писал(а):
А в программе - по факту на 15-м. Может кто подскажет, что это.
если подскажите в какой программе. Так то может и на втором быть.

Добавлено after 1 minute 28 seconds:
выложите код, где прерывание на 15-м

Добавлено after 2 minutes 13 seconds:
кусок кода, весь не нужно

Добавлено after 12 minutes 51 second:
Vjatheslav писал(а):
В документации указано, что прерывание по переполнению T1 находится на векторе 8. А в программе - по факту на 15-м.
Хотя в моей документации на 9-м, а в вашей программе, как у вас написано, на 17-м будет..
Но это нужно код смотреть..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 17:13:04 
Родился

Зарегистрирован: Чт янв 25, 2018 20:28:19
Сообщений: 11
Рейтинг сообщения: 0
- Программа AVR Studio 4.19


.include "m16def.inc"

.def c=R20
.def d=R17
.def e=R16
.def f=R18
.def KDEL=R19

.DEF resultL = R0
.DEF resultH = R1
;----------
.cseg
.org 0

start: jmp init
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
rjmp T1; reti
reti
reti
reti
reti
reti


;----------

init:

LDI e,Low(RAMEND) ; инициализация стека
OUT SPL,e ;

LDI e,High(RAMEND)
OUT SPH,e

;---------- тактового сигнала------------------
; ldi e, 0b10001000
; out clkpr, e

; ldi e,0x80
; out ACSR,e

;---------- портов

sbi DDRD,2
sbi DDRD,5
sbi DDRB,3


sbi PortD,2
cbi PortD,5
ldi e, 0
mov f, e
;---------- таймеров
ldi e, 0b10011010
out tccr0, e

ldi e, 50
mov KDEL, e
out OCR0, KDEL

ldi e, 0b00000000
out tccr1a, e

ldi e, 0b00000000
out tccr1b, e



;---------- прерываний счетчиков-------------
cli

ldi e, 0b00000000
out GICR, e


ldi e, 0b00000100
out TIMSK, e


;---------- АЦП--------------
ldi e,0b10000111
out ADCSRA,e

ldi e,0b01000001
out ADMUX,e

ldi e,0b00000000
out SFIOR,e


;----------
; начало основной программы
;----------

;--------динамическая индикация
main:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 17:31:31 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2907
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18720
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
у ATmega16 на каждое прерывание идет по 2 адреса, чтобы применять команду JMP.
9 - это номер прерывания, а не адрес. а адрес равен 0х10.
а команда reti - это 1 адрес. поэтому нельзя просто делать для вектора "затычку" в 1 адрес.
и нельзя просто делать одноадресный rjmp.
а чтобы "потратить" на один вектор 2 адреса, для reti и для rjmp нужно добавлять nop.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
В продаже новые LED-драйверы XLC компании MEAN WELL с диммингом нового поколения

Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 17:39:59 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 38
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
Ваш код
Спойлер
Код:
start: jmp init
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
rjmp T1; reti
reti
reti
reti
reti
reti

Адресация в 16-й меге 16-ти битная.
Т.е. jmp init - это 0x0000
а ваше T1 - это 0x0010 (16-е место, но с 0x0000 17-е место, но никак не 15-е, и в коде вашем походу ошибка)

Если остальные прерывания не нужны, то можете записать:
Код:
.cseg
.org 0x0000      jmp   init
.org 0x0010      jmp    T1

Вместо T1 пишите лучше T1_OVF, потом самому понятнее будет.

Добавлено after 1 minute 9 seconds:
T1 на 16-м месте в вашем коде.. вообще ни там ни сям

Добавлено after 6 minutes 55 seconds:
Vjatheslav писал(а):
.def c=R20
.def d=R17
.def e=R16
.def f=R18
.def KDEL=R19

Это конечно тоже шедевр)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 18:04:41 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15046
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Просто надо использовать то, что в соответствующем *.inc файле описания ресурсов МК указано...
Ищем
ДИСК:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes
и там для меги 16
m16def.inc или m16Adef.inc
на всякий случай копируем в отдельное место (дабы исходный не убить) и читаем содержимое (а далее им пользуемся).
Естественно этот файлик всегда надо в проект подключать
Спойлер
Код:
      .nolist
      .include "m16def.inc"
      .list

К примеру тот же m16def.inc:
Спойлер
Код:
;***** THIS IS A MACHINE GENERATED FILE - DO NOT EDIT ********************
;***** Created: 2011-08-25 20:59 ******* Source: ATmega16.xml ************
;*************************************************************************
;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y
;*
;* Number            : AVR000
;* File Name         : "m16def.inc"
;* Title             : Register/Bit Definitions for the ATmega16
;* Date              : 2011-08-25
;* Version           : 2.35
;* Support E-mail    : avr@atmel.com
;* Target MCU        : ATmega16
;*
;* DESCRIPTION
;* When including this file in the assembly program file, all I/O register
;* names and I/O register bit names appearing in the data book can be used.
;* In addition, the six registers forming the three data pointers X, Y and
;* Z have been assigned names XL - ZH. Highest RAM address for Internal
;* SRAM is also defined
;*
;* The Register names are represented by their hexadecimal address.
;*
;* The Register Bit names are represented by their bit number (0-7).
;*
;* Please observe the difference in using the bit names with instructions
;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc"
;* (skip if bit in register set/cleared). The following example illustrates
;* this:
;*
;* in    r16,PORTB             ;read PORTB latch
;* sbr   r16,(1<<PB6)+(1<<PB5) ;set PB6 and PB5 (use masks, not bit#)
;* out   PORTB,r16             ;output to PORTB
;*
;* in    r16,TIFR              ;read the Timer Interrupt Flag Register
;* sbrc  r16,TOV0              ;test the overflow flag (use bit#)
;* rjmp  TOV0_is_set           ;jump if set
;* ...                         ;otherwise do something else
;*************************************************************************

#ifndef _M16DEF_INC_
#define _M16DEF_INC_


#pragma partinc 0

; ***** SPECIFY DEVICE ***************************************************
.device ATmega16
#pragma AVRPART ADMIN PART_NAME ATmega16
.equ   SIGNATURE_000   = 0x1e
.equ   SIGNATURE_001   = 0x94
.equ   SIGNATURE_002   = 0x03

#pragma AVRPART CORE CORE_VERSION V2E


; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ   SREG   = 0x3f
.equ   SPL   = 0x3d
.equ   SPH   = 0x3e
.equ   OCR0   = 0x3c
.equ   GICR   = 0x3b
.equ   GIFR   = 0x3a
.equ   TIMSK   = 0x39
.equ   TIFR   = 0x38
.equ   SPMCSR   = 0x37
.equ   TWCR   = 0x36
.equ   MCUCR   = 0x35
.equ   MCUCSR   = 0x34
.equ   TCCR0   = 0x33
.equ   TCNT0   = 0x32
.equ   OSCCAL   = 0x31
.equ   OCDR   = 0x31
.equ   SFIOR   = 0x30
.equ   TCCR1A   = 0x2f
.equ   TCCR1B   = 0x2e
.equ   TCNT1L   = 0x2c
.equ   TCNT1H   = 0x2d
.equ   OCR1AL   = 0x2a
.equ   OCR1AH   = 0x2b
.equ   OCR1BL   = 0x28
.equ   OCR1BH   = 0x29
.equ   ICR1L   = 0x26
.equ   ICR1H   = 0x27
.equ   TCCR2   = 0x25
.equ   TCNT2   = 0x24
.equ   OCR2   = 0x23
.equ   ASSR   = 0x22
.equ   WDTCR   = 0x21
.equ   UBRRH   = 0x20
.equ   UCSRC   = 0x20
.equ   EEARL   = 0x1e
.equ   EEARH   = 0x1f
.equ   EEDR   = 0x1d
.equ   EECR   = 0x1c
.equ   PORTA   = 0x1b
.equ   DDRA   = 0x1a
.equ   PINA   = 0x19
.equ   PORTB   = 0x18
.equ   DDRB   = 0x17
.equ   PINB   = 0x16
.equ   PORTC   = 0x15
.equ   DDRC   = 0x14
.equ   PINC   = 0x13
.equ   PORTD   = 0x12
.equ   DDRD   = 0x11
.equ   PIND   = 0x10
.equ   SPDR   = 0x0f
.equ   SPSR   = 0x0e
.equ   SPCR   = 0x0d
.equ   UDR   = 0x0c
.equ   UCSRA   = 0x0b
.equ   UCSRB   = 0x0a
.equ   UBRRL   = 0x09
.equ   ACSR   = 0x08
.equ   ADMUX   = 0x07
.equ   ADCSRA   = 0x06
.equ   ADCH   = 0x05
.equ   ADCL   = 0x04
.equ   TWDR   = 0x03
.equ   TWAR   = 0x02
.equ   TWSR   = 0x01
.equ   TWBR   = 0x00


; ***** BIT DEFINITIONS **************************************************

; ***** TIMER_COUNTER_0 **************
; TCCR0 - Timer/Counter Control Register
.equ   CS00   = 0   ; Clock Select 1
.equ   CS01   = 1   ; Clock Select 1
.equ   CS02   = 2   ; Clock Select 2
.equ   WGM01   = 3   ; Waveform Generation Mode 1
.equ   CTC0   = WGM01   ; For compatibility
.equ   COM00   = 4   ; Compare match Output Mode 0
.equ   COM01   = 5   ; Compare Match Output Mode 1
.equ   WGM00   = 6   ; Waveform Generation Mode 0
.equ   PWM0   = WGM00   ; For compatibility
.equ   FOC0   = 7   ; Force Output Compare

; TCNT0 - Timer/Counter Register
.equ   TCNT0_0   = 0   ;
.equ   TCNT0_1   = 1   ;
.equ   TCNT0_2   = 2   ;
.equ   TCNT0_3   = 3   ;
.equ   TCNT0_4   = 4   ;
.equ   TCNT0_5   = 5   ;
.equ   TCNT0_6   = 6   ;
.equ   TCNT0_7   = 7   ;

; OCR0 - Output Compare Register
.equ   OCR0_0   = 0   ;
.equ   OCR0_1   = 1   ;
.equ   OCR0_2   = 2   ;
.equ   OCR0_3   = 3   ;
.equ   OCR0_4   = 4   ;
.equ   OCR0_5   = 5   ;
.equ   OCR0_6   = 6   ;
.equ   OCR0_7   = 7   ;

; TIMSK - Timer/Counter Interrupt Mask Register
.equ   TOIE0   = 0   ; Timer/Counter0 Overflow Interrupt Enable
.equ   OCIE0   = 1   ; Timer/Counter0 Output Compare Match Interrupt register

; TIFR - Timer/Counter Interrupt Flag register
.equ   TOV0   = 0   ; Timer/Counter0 Overflow Flag
.equ   OCF0   = 1   ; Output Compare Flag 0

; SFIOR - Special Function IO Register
.equ   PSR10   = 0   ; Prescaler Reset Timer/Counter1 and Timer/Counter0


; ***** TIMER_COUNTER_1 **************
; TIMSK - Timer/Counter Interrupt Mask Register
.equ   TOIE1   = 2   ; Timer/Counter1 Overflow Interrupt Enable
.equ   OCIE1B   = 3   ; Timer/Counter1 Output CompareB Match Interrupt Enable
.equ   OCIE1A   = 4   ; Timer/Counter1 Output CompareA Match Interrupt Enable
.equ   TICIE1   = 5   ; Timer/Counter1 Input Capture Interrupt Enable

; TIFR - Timer/Counter Interrupt Flag register
.equ   TOV1   = 2   ; Timer/Counter1 Overflow Flag
.equ   OCF1B   = 3   ; Output Compare Flag 1B
.equ   OCF1A   = 4   ; Output Compare Flag 1A
.equ   ICF1   = 5   ; Input Capture Flag 1

; TCCR1A - Timer/Counter1 Control Register A
.equ   WGM10   = 0   ; Waveform Generation Mode
.equ   PWM10   = WGM10   ; For compatibility
.equ   WGM11   = 1   ; Waveform Generation Mode
.equ   PWM11   = WGM11   ; For compatibility
.equ   FOC1B   = 2   ; Force Output Compare 1B
.equ   FOC1A   = 3   ; Force Output Compare 1A
.equ   COM1B0   = 4   ; Compare Output Mode 1B, bit 0
.equ   COM1B1   = 5   ; Compare Output Mode 1B, bit 1
.equ   COM1A0   = 6   ; Compare Ouput Mode 1A, bit 0
.equ   COM1A1   = 7   ; Compare Output Mode 1A, bit 1

; TCCR1B - Timer/Counter1 Control Register B
.equ   CS10   = 0   ; Prescaler source of Timer/Counter 1
.equ   CS11   = 1   ; Prescaler source of Timer/Counter 1
.equ   CS12   = 2   ; Prescaler source of Timer/Counter 1
.equ   WGM12   = 3   ; Waveform Generation Mode
.equ   CTC10   = WGM12   ; For compatibility
.equ   CTC1   = WGM12   ; For compatibility
.equ   WGM13   = 4   ; Waveform Generation Mode
.equ   CTC11   = WGM13   ; For compatibility
.equ   ICES1   = 6   ; Input Capture 1 Edge Select
.equ   ICNC1   = 7   ; Input Capture 1 Noise Canceler


; ***** EXTERNAL_INTERRUPT ***********
; GICR - General Interrupt Control Register
.equ   GIMSK   = GICR   ; For compatibility
.equ   IVCE   = 0   ; Interrupt Vector Change Enable
.equ   IVSEL   = 1   ; Interrupt Vector Select
.equ   INT2   = 5   ; External Interrupt Request 2 Enable
.equ   INT0   = 6   ; External Interrupt Request 0 Enable
.equ   INT1   = 7   ; External Interrupt Request 1 Enable

; GIFR - General Interrupt Flag Register
.equ   INTF2   = 5   ; External Interrupt Flag 2
.equ   INTF0   = 6   ; External Interrupt Flag 0
.equ   INTF1   = 7   ; External Interrupt Flag 1

; MCUCR - General Interrupt Control Register
.equ   ISC00   = 0   ; Interrupt Sense Control 0 Bit 0
.equ   ISC01   = 1   ; Interrupt Sense Control 0 Bit 1
.equ   ISC10   = 2   ; Interrupt Sense Control 1 Bit 0
.equ   ISC11   = 3   ; Interrupt Sense Control 1 Bit 1

; MCUCSR - MCU Control And Status Register
.equ   ISC2   = 6   ; Interrupt Sense Control 2


; ***** EEPROM ***********************
; EEDR - EEPROM Data Register
.equ   EEDR0   = 0   ; EEPROM Data Register bit 0
.equ   EEDR1   = 1   ; EEPROM Data Register bit 1
.equ   EEDR2   = 2   ; EEPROM Data Register bit 2
.equ   EEDR3   = 3   ; EEPROM Data Register bit 3
.equ   EEDR4   = 4   ; EEPROM Data Register bit 4
.equ   EEDR5   = 5   ; EEPROM Data Register bit 5
.equ   EEDR6   = 6   ; EEPROM Data Register bit 6
.equ   EEDR7   = 7   ; EEPROM Data Register bit 7

; EECR - EEPROM Control Register
.equ   EERE   = 0   ; EEPROM Read Enable
.equ   EEWE   = 1   ; EEPROM Write Enable
.equ   EEMWE   = 2   ; EEPROM Master Write Enable
.equ   EEWEE   = EEMWE   ; For compatibility
.equ   EERIE   = 3   ; EEPROM Ready Interrupt Enable


; ***** CPU **************************
; SREG - Status Register
.equ   SREG_C   = 0   ; Carry Flag
.equ   SREG_Z   = 1   ; Zero Flag
.equ   SREG_N   = 2   ; Negative Flag
.equ   SREG_V   = 3   ; Two's Complement Overflow Flag
.equ   SREG_S   = 4   ; Sign Bit
.equ   SREG_H   = 5   ; Half Carry Flag
.equ   SREG_T   = 6   ; Bit Copy Storage
.equ   SREG_I   = 7   ; Global Interrupt Enable

; MCUCR - MCU Control Register
;.equ   ISC00   = 0   ; Interrupt Sense Control 0 Bit 0
;.equ   ISC01   = 1   ; Interrupt Sense Control 0 Bit 1
;.equ   ISC10   = 2   ; Interrupt Sense Control 1 Bit 0
;.equ   ISC11   = 3   ; Interrupt Sense Control 1 Bit 1
.equ   SM0   = 4   ; Sleep Mode Select
.equ   SM1   = 5   ; Sleep Mode Select
.equ   SE   = 6   ; Sleep Enable
.equ   SM2   = 7   ; Sleep Mode Select

; MCUCSR - MCU Control And Status Register
.equ   MCUSR   = MCUCSR   ; For compatibility
.equ   PORF   = 0   ; Power-on reset flag
.equ   EXTRF   = 1   ; External Reset Flag
.equ   EXTREF   = EXTRF   ; For compatibility
.equ   BORF   = 2   ; Brown-out Reset Flag
.equ   WDRF   = 3   ; Watchdog Reset Flag
.equ   JTRF   = 4   ; JTAG Reset Flag
.equ   JTD   = 7   ; JTAG Interface Disable

; OSCCAL - Oscillator Calibration Value
.equ   CAL0   = 0   ; Oscillator Calibration Value Bit0
.equ   CAL1   = 1   ; Oscillator Calibration Value Bit1
.equ   CAL2   = 2   ; Oscillator Calibration Value Bit2
.equ   CAL3   = 3   ; Oscillator Calibration Value Bit3
.equ   CAL4   = 4   ; Oscillator Calibration Value Bit4
.equ   CAL5   = 5   ; Oscillator Calibration Value Bit5
.equ   CAL6   = 6   ; Oscillator Calibration Value Bit6
.equ   CAL7   = 7   ; Oscillator Calibration Value Bit7

; SFIOR - Special function I/O register
;.equ   PSR10   = 0   ; Prescaler reset
.equ   PSR2   = 1   ; Prescaler reset
.equ   PUD   = 2   ; Pull-up Disable


; ***** TIMER_COUNTER_2 **************
; TIMSK - Timer/Counter Interrupt Mask register
.equ   TOIE2   = 6   ; Timer/Counter2 Overflow Interrupt Enable
.equ   OCIE2   = 7   ; Timer/Counter2 Output Compare Match Interrupt Enable

; TIFR - Timer/Counter Interrupt Flag Register
.equ   TOV2   = 6   ; Timer/Counter2 Overflow Flag
.equ   OCF2   = 7   ; Output Compare Flag 2

; TCCR2 - Timer/Counter2 Control Register
.equ   CS20   = 0   ; Clock Select bit 0
.equ   CS21   = 1   ; Clock Select bit 1
.equ   CS22   = 2   ; Clock Select bit 2
.equ   WGM21   = 3   ; Waveform Generation Mode
.equ   CTC2   = WGM21   ; For compatibility
.equ   COM20   = 4   ; Compare Output Mode bit 0
.equ   COM21   = 5   ; Compare Output Mode bit 1
.equ   WGM20   = 6   ; Waveform Genration Mode
.equ   PWM2   = WGM20   ; For compatibility
.equ   FOC2   = 7   ; Force Output Compare

; TCNT2 - Timer/Counter2
.equ   TCNT2_0   = 0   ; Timer/Counter 2 bit 0
.equ   TCNT2_1   = 1   ; Timer/Counter 2 bit 1
.equ   TCNT2_2   = 2   ; Timer/Counter 2 bit 2
.equ   TCNT2_3   = 3   ; Timer/Counter 2 bit 3
.equ   TCNT2_4   = 4   ; Timer/Counter 2 bit 4
.equ   TCNT2_5   = 5   ; Timer/Counter 2 bit 5
.equ   TCNT2_6   = 6   ; Timer/Counter 2 bit 6
.equ   TCNT2_7   = 7   ; Timer/Counter 2 bit 7

; OCR2 - Timer/Counter2 Output Compare Register
.equ   OCR2_0   = 0   ; Timer/Counter2 Output Compare Register Bit 0
.equ   OCR2_1   = 1   ; Timer/Counter2 Output Compare Register Bit 1
.equ   OCR2_2   = 2   ; Timer/Counter2 Output Compare Register Bit 2
.equ   OCR2_3   = 3   ; Timer/Counter2 Output Compare Register Bit 3
.equ   OCR2_4   = 4   ; Timer/Counter2 Output Compare Register Bit 4
.equ   OCR2_5   = 5   ; Timer/Counter2 Output Compare Register Bit 5
.equ   OCR2_6   = 6   ; Timer/Counter2 Output Compare Register Bit 6
.equ   OCR2_7   = 7   ; Timer/Counter2 Output Compare Register Bit 7

; ASSR - Asynchronous Status Register
.equ   TCR2UB   = 0   ; Timer/counter Control Register2 Update Busy
.equ   OCR2UB   = 1   ; Output Compare Register2 Update Busy
.equ   TCN2UB   = 2   ; Timer/Counter2 Update Busy
.equ   AS2   = 3   ; Asynchronous Timer/counter2

; SFIOR - Special Function IO Register
;.equ   PSR2   = 1   ; Prescaler Reset Timer/Counter2


; ***** SPI **************************
; SPDR - SPI Data Register
.equ   SPDR0   = 0   ; SPI Data Register bit 0
.equ   SPDR1   = 1   ; SPI Data Register bit 1
.equ   SPDR2   = 2   ; SPI Data Register bit 2
.equ   SPDR3   = 3   ; SPI Data Register bit 3
.equ   SPDR4   = 4   ; SPI Data Register bit 4
.equ   SPDR5   = 5   ; SPI Data Register bit 5
.equ   SPDR6   = 6   ; SPI Data Register bit 6
.equ   SPDR7   = 7   ; SPI Data Register bit 7

; SPSR - SPI Status Register
.equ   SPI2X   = 0   ; Double SPI Speed Bit
.equ   WCOL   = 6   ; Write Collision Flag
.equ   SPIF   = 7   ; SPI Interrupt Flag

; SPCR - SPI Control Register
.equ   SPR0   = 0   ; SPI Clock Rate Select 0
.equ   SPR1   = 1   ; SPI Clock Rate Select 1
.equ   CPHA   = 2   ; Clock Phase
.equ   CPOL   = 3   ; Clock polarity
.equ   MSTR   = 4   ; Master/Slave Select
.equ   DORD   = 5   ; Data Order
.equ   SPE   = 6   ; SPI Enable
.equ   SPIE   = 7   ; SPI Interrupt Enable


; ***** USART ************************
; UDR - USART I/O Data Register
.equ   UDR0   = 0   ; USART I/O Data Register bit 0
.equ   UDR1   = 1   ; USART I/O Data Register bit 1
.equ   UDR2   = 2   ; USART I/O Data Register bit 2
.equ   UDR3   = 3   ; USART I/O Data Register bit 3
.equ   UDR4   = 4   ; USART I/O Data Register bit 4
.equ   UDR5   = 5   ; USART I/O Data Register bit 5
.equ   UDR6   = 6   ; USART I/O Data Register bit 6
.equ   UDR7   = 7   ; USART I/O Data Register bit 7

; UCSRA - USART Control and Status Register A
.equ   USR   = UCSRA   ; For compatibility
.equ   MPCM   = 0   ; Multi-processor Communication Mode
.equ   U2X   = 1   ; Double the USART transmission speed
.equ   UPE   = 2   ; Parity Error
.equ   PE   = UPE   ; For compatibility
.equ   DOR   = 3   ; Data overRun
.equ   FE   = 4   ; Framing Error
.equ   UDRE   = 5   ; USART Data Register Empty
.equ   TXC   = 6   ; USART Transmitt Complete
.equ   RXC   = 7   ; USART Receive Complete

; UCSRB - USART Control and Status Register B
.equ   UCR   = UCSRB   ; For compatibility
.equ   TXB8   = 0   ; Transmit Data Bit 8
.equ   RXB8   = 1   ; Receive Data Bit 8
.equ   UCSZ2   = 2   ; Character Size
.equ   CHR9   = UCSZ2   ; For compatibility
.equ   TXEN   = 3   ; Transmitter Enable
.equ   RXEN   = 4   ; Receiver Enable
.equ   UDRIE   = 5   ; USART Data register Empty Interrupt Enable
.equ   TXCIE   = 6   ; TX Complete Interrupt Enable
.equ   RXCIE   = 7   ; RX Complete Interrupt Enable

; UCSRC - USART Control and Status Register C
.equ   UCPOL   = 0   ; Clock Polarity
.equ   UCSZ0   = 1   ; Character Size
.equ   UCSZ1   = 2   ; Character Size
.equ   USBS   = 3   ; Stop Bit Select
.equ   UPM0   = 4   ; Parity Mode Bit 0
.equ   UPM1   = 5   ; Parity Mode Bit 1
.equ   UMSEL   = 6   ; USART Mode Select
.equ   URSEL   = 7   ; Register Select

.equ   UBRRHI   = UBRRH   ; For compatibility

; ***** TWI **************************
; TWBR - TWI Bit Rate register
.equ   I2BR   = TWBR   ; For compatibility
.equ   TWBR0   = 0   ;
.equ   TWBR1   = 1   ;
.equ   TWBR2   = 2   ;
.equ   TWBR3   = 3   ;
.equ   TWBR4   = 4   ;
.equ   TWBR5   = 5   ;
.equ   TWBR6   = 6   ;
.equ   TWBR7   = 7   ;

; TWCR - TWI Control Register
.equ   I2CR   = TWCR   ; For compatibility
.equ   TWIE   = 0   ; TWI Interrupt Enable
.equ   I2IE   = TWIE   ; For compatibility
.equ   TWEN   = 2   ; TWI Enable Bit
.equ   I2EN   = TWEN   ; For compatibility
.equ   ENI2C   = TWEN   ; For compatibility
.equ   TWWC   = 3   ; TWI Write Collition Flag
.equ   I2WC   = TWWC   ; For compatibility
.equ   TWSTO   = 4   ; TWI Stop Condition Bit
.equ   I2STO   = TWSTO   ; For compatibility
.equ   TWSTA   = 5   ; TWI Start Condition Bit
.equ   I2STA   = TWSTA   ; For compatibility
.equ   TWEA   = 6   ; TWI Enable Acknowledge Bit
.equ   I2EA   = TWEA   ; For compatibility
.equ   TWINT   = 7   ; TWI Interrupt Flag
.equ   I2INT   = TWINT   ; For compatibility

; TWSR - TWI Status Register
.equ   I2SR   = TWSR   ; For compatibility
.equ   TWPS0   = 0   ; TWI Prescaler
.equ   TWS0   = TWPS0   ; For compatibility
.equ   I2GCE   = TWPS0   ; For compatibility
.equ   TWPS1   = 1   ; TWI Prescaler
.equ   TWS1   = TWPS1   ; For compatibility
.equ   TWS3   = 3   ; TWI Status
.equ   I2S3   = TWS3   ; For compatibility
.equ   TWS4   = 4   ; TWI Status
.equ   I2S4   = TWS4   ; For compatibility
.equ   TWS5   = 5   ; TWI Status
.equ   I2S5   = TWS5   ; For compatibility
.equ   TWS6   = 6   ; TWI Status
.equ   I2S6   = TWS6   ; For compatibility
.equ   TWS7   = 7   ; TWI Status
.equ   I2S7   = TWS7   ; For compatibility

; TWDR - TWI Data register
.equ   I2DR   = TWDR   ; For compatibility
.equ   TWD0   = 0   ; TWI Data Register Bit 0
.equ   TWD1   = 1   ; TWI Data Register Bit 1
.equ   TWD2   = 2   ; TWI Data Register Bit 2
.equ   TWD3   = 3   ; TWI Data Register Bit 3
.equ   TWD4   = 4   ; TWI Data Register Bit 4
.equ   TWD5   = 5   ; TWI Data Register Bit 5
.equ   TWD6   = 6   ; TWI Data Register Bit 6
.equ   TWD7   = 7   ; TWI Data Register Bit 7

; TWAR - TWI (Slave) Address register
.equ   I2AR   = TWAR   ; For compatibility
.equ   TWGCE   = 0   ; TWI General Call Recognition Enable Bit
.equ   TWA0   = 1   ; TWI (Slave) Address register Bit 0
.equ   TWA1   = 2   ; TWI (Slave) Address register Bit 1
.equ   TWA2   = 3   ; TWI (Slave) Address register Bit 2
.equ   TWA3   = 4   ; TWI (Slave) Address register Bit 3
.equ   TWA4   = 5   ; TWI (Slave) Address register Bit 4
.equ   TWA5   = 6   ; TWI (Slave) Address register Bit 5
.equ   TWA6   = 7   ; TWI (Slave) Address register Bit 6


; ***** ANALOG_COMPARATOR ************
; SFIOR - Special Function IO Register
.equ   ACME   = 3   ; Analog Comparator Multiplexer Enable

; ACSR - Analog Comparator Control And Status Register
.equ   ACIS0   = 0   ; Analog Comparator Interrupt Mode Select bit 0
.equ   ACIS1   = 1   ; Analog Comparator Interrupt Mode Select bit 1
.equ   ACIC   = 2   ; Analog Comparator Input Capture Enable
.equ   ACIE   = 3   ; Analog Comparator Interrupt Enable
.equ   ACI   = 4   ; Analog Comparator Interrupt Flag
.equ   ACO   = 5   ; Analog Compare Output
.equ   ACBG   = 6   ; Analog Comparator Bandgap Select
.equ   ACD   = 7   ; Analog Comparator Disable


; ***** AD_CONVERTER *****************
; ADMUX - The ADC multiplexer Selection Register
.equ   MUX0   = 0   ; Analog Channel and Gain Selection Bits
.equ   MUX1   = 1   ; Analog Channel and Gain Selection Bits
.equ   MUX2   = 2   ; Analog Channel and Gain Selection Bits
.equ   MUX3   = 3   ; Analog Channel and Gain Selection Bits
.equ   MUX4   = 4   ; Analog Channel and Gain Selection Bits
.equ   ADLAR   = 5   ; Left Adjust Result
.equ   REFS0   = 6   ; Reference Selection Bit 0
.equ   REFS1   = 7   ; Reference Selection Bit 1

; ADCSRA - The ADC Control and Status register
.equ   ADCSR   = ADCSRA   ; For compatibility
.equ   ADPS0   = 0   ; ADC  Prescaler Select Bits
.equ   ADPS1   = 1   ; ADC  Prescaler Select Bits
.equ   ADPS2   = 2   ; ADC  Prescaler Select Bits
.equ   ADIE   = 3   ; ADC Interrupt Enable
.equ   ADIF   = 4   ; ADC Interrupt Flag
.equ   ADATE   = 5   ; When this bit is written to one,the Timer/Counter2 prescaler will be reset.The bit will be cleared by hardware after the operation is performed.Writing a zero to this bit will have no effect.This bit will always be read as zero if Timer/Counter2 is clocked by the internal CPU clock.If this bit is written when Timer/Counter2 is operating in asynchronous mode,the bit will remain one until the prescaler has been reset.
.equ   ADFR   = ADATE   ; For compatibility
.equ   ADSC   = 6   ; ADC Start Conversion
.equ   ADEN   = 7   ; ADC Enable

; ADCH - ADC Data Register High Byte
.equ   ADCH0   = 0   ; ADC Data Register High Byte Bit 0
.equ   ADCH1   = 1   ; ADC Data Register High Byte Bit 1
.equ   ADCH2   = 2   ; ADC Data Register High Byte Bit 2
.equ   ADCH3   = 3   ; ADC Data Register High Byte Bit 3
.equ   ADCH4   = 4   ; ADC Data Register High Byte Bit 4
.equ   ADCH5   = 5   ; ADC Data Register High Byte Bit 5
.equ   ADCH6   = 6   ; ADC Data Register High Byte Bit 6
.equ   ADCH7   = 7   ; ADC Data Register High Byte Bit 7

; ADCL - ADC Data Register Low Byte
.equ   ADCL0   = 0   ; ADC Data Register Low Byte Bit 0
.equ   ADCL1   = 1   ; ADC Data Register Low Byte Bit 1
.equ   ADCL2   = 2   ; ADC Data Register Low Byte Bit 2
.equ   ADCL3   = 3   ; ADC Data Register Low Byte Bit 3
.equ   ADCL4   = 4   ; ADC Data Register Low Byte Bit 4
.equ   ADCL5   = 5   ; ADC Data Register Low Byte Bit 5
.equ   ADCL6   = 6   ; ADC Data Register Low Byte Bit 6
.equ   ADCL7   = 7   ; ADC Data Register Low Byte Bit 7

; SFIOR - Special Function IO Register
.equ   ADTS0   = 5   ; ADC Auto Trigger Source 0
.equ   ADTS1   = 6   ; ADC Auto Trigger Source 1
.equ   ADTS2   = 7   ; ADC Auto Trigger Source 2


; ***** JTAG *************************
; OCDR - On-Chip Debug Related Register in I/O Memory
.equ   OCDR0   = 0   ; On-Chip Debug Register Bit 0
.equ   OCDR1   = 1   ; On-Chip Debug Register Bit 1
.equ   OCDR2   = 2   ; On-Chip Debug Register Bit 2
.equ   OCDR3   = 3   ; On-Chip Debug Register Bit 3
.equ   OCDR4   = 4   ; On-Chip Debug Register Bit 4
.equ   OCDR5   = 5   ; On-Chip Debug Register Bit 5
.equ   OCDR6   = 6   ; On-Chip Debug Register Bit 6
.equ   OCDR7   = 7   ; On-Chip Debug Register Bit 7
.equ   IDRD   = OCDR7   ; For compatibility

; MCUCSR - MCU Control And Status Register
;.equ   JTRF   = 4   ; JTAG Reset Flag
;.equ   JTD   = 7   ; JTAG Interface Disable


; ***** BOOT_LOAD ********************
; SPMCSR - Store Program Memory Control Register
.equ   SPMCR   = SPMCSR   ; For compatibility
.equ   SPMEN   = 0   ; Store Program Memory Enable
.equ   PGERS   = 1   ; Page Erase
.equ   PGWRT   = 2   ; Page Write
.equ   BLBSET   = 3   ; Boot Lock Bit Set
.equ   RWWSRE   = 4   ; Read While Write section read enable
.equ   ASRE   = RWWSRE   ; For compatibility
.equ   RWWSB   = 6   ; Read While Write Section Busy
.equ   ASB   = RWWSB   ; For compatibility
.equ   SPMIE   = 7   ; SPM Interrupt Enable


; ***** PORTA ************************
; PORTA - Port A Data Register
.equ   PORTA0   = 0   ; Port A Data Register bit 0
.equ   PA0   = 0   ; For compatibility
.equ   PORTA1   = 1   ; Port A Data Register bit 1
.equ   PA1   = 1   ; For compatibility
.equ   PORTA2   = 2   ; Port A Data Register bit 2
.equ   PA2   = 2   ; For compatibility
.equ   PORTA3   = 3   ; Port A Data Register bit 3
.equ   PA3   = 3   ; For compatibility
.equ   PORTA4   = 4   ; Port A Data Register bit 4
.equ   PA4   = 4   ; For compatibility
.equ   PORTA5   = 5   ; Port A Data Register bit 5
.equ   PA5   = 5   ; For compatibility
.equ   PORTA6   = 6   ; Port A Data Register bit 6
.equ   PA6   = 6   ; For compatibility
.equ   PORTA7   = 7   ; Port A Data Register bit 7
.equ   PA7   = 7   ; For compatibility

; DDRA - Port A Data Direction Register
.equ   DDA0   = 0   ; Data Direction Register, Port A, bit 0
.equ   DDA1   = 1   ; Data Direction Register, Port A, bit 1
.equ   DDA2   = 2   ; Data Direction Register, Port A, bit 2
.equ   DDA3   = 3   ; Data Direction Register, Port A, bit 3
.equ   DDA4   = 4   ; Data Direction Register, Port A, bit 4
.equ   DDA5   = 5   ; Data Direction Register, Port A, bit 5
.equ   DDA6   = 6   ; Data Direction Register, Port A, bit 6
.equ   DDA7   = 7   ; Data Direction Register, Port A, bit 7

; PINA - Port A Input Pins
.equ   PINA0   = 0   ; Input Pins, Port A bit 0
.equ   PINA1   = 1   ; Input Pins, Port A bit 1
.equ   PINA2   = 2   ; Input Pins, Port A bit 2
.equ   PINA3   = 3   ; Input Pins, Port A bit 3
.equ   PINA4   = 4   ; Input Pins, Port A bit 4
.equ   PINA5   = 5   ; Input Pins, Port A bit 5
.equ   PINA6   = 6   ; Input Pins, Port A bit 6
.equ   PINA7   = 7   ; Input Pins, Port A bit 7


; ***** PORTB ************************
; PORTB - Port B Data Register
.equ   PORTB0   = 0   ; Port B Data Register bit 0
.equ   PB0   = 0   ; For compatibility
.equ   PORTB1   = 1   ; Port B Data Register bit 1
.equ   PB1   = 1   ; For compatibility
.equ   PORTB2   = 2   ; Port B Data Register bit 2
.equ   PB2   = 2   ; For compatibility
.equ   PORTB3   = 3   ; Port B Data Register bit 3
.equ   PB3   = 3   ; For compatibility
.equ   PORTB4   = 4   ; Port B Data Register bit 4
.equ   PB4   = 4   ; For compatibility
.equ   PORTB5   = 5   ; Port B Data Register bit 5
.equ   PB5   = 5   ; For compatibility
.equ   PORTB6   = 6   ; Port B Data Register bit 6
.equ   PB6   = 6   ; For compatibility
.equ   PORTB7   = 7   ; Port B Data Register bit 7
.equ   PB7   = 7   ; For compatibility

; DDRB - Port B Data Direction Register
.equ   DDB0   = 0   ; Port B Data Direction Register bit 0
.equ   DDB1   = 1   ; Port B Data Direction Register bit 1
.equ   DDB2   = 2   ; Port B Data Direction Register bit 2
.equ   DDB3   = 3   ; Port B Data Direction Register bit 3
.equ   DDB4   = 4   ; Port B Data Direction Register bit 4
.equ   DDB5   = 5   ; Port B Data Direction Register bit 5
.equ   DDB6   = 6   ; Port B Data Direction Register bit 6
.equ   DDB7   = 7   ; Port B Data Direction Register bit 7

; PINB - Port B Input Pins
.equ   PINB0   = 0   ; Port B Input Pins bit 0
.equ   PINB1   = 1   ; Port B Input Pins bit 1
.equ   PINB2   = 2   ; Port B Input Pins bit 2
.equ   PINB3   = 3   ; Port B Input Pins bit 3
.equ   PINB4   = 4   ; Port B Input Pins bit 4
.equ   PINB5   = 5   ; Port B Input Pins bit 5
.equ   PINB6   = 6   ; Port B Input Pins bit 6
.equ   PINB7   = 7   ; Port B Input Pins bit 7


; ***** PORTC ************************
; PORTC - Port C Data Register
.equ   PORTC0   = 0   ; Port C Data Register bit 0
.equ   PC0   = 0   ; For compatibility
.equ   PORTC1   = 1   ; Port C Data Register bit 1
.equ   PC1   = 1   ; For compatibility
.equ   PORTC2   = 2   ; Port C Data Register bit 2
.equ   PC2   = 2   ; For compatibility
.equ   PORTC3   = 3   ; Port C Data Register bit 3
.equ   PC3   = 3   ; For compatibility
.equ   PORTC4   = 4   ; Port C Data Register bit 4
.equ   PC4   = 4   ; For compatibility
.equ   PORTC5   = 5   ; Port C Data Register bit 5
.equ   PC5   = 5   ; For compatibility
.equ   PORTC6   = 6   ; Port C Data Register bit 6
.equ   PC6   = 6   ; For compatibility
.equ   PORTC7   = 7   ; Port C Data Register bit 7
.equ   PC7   = 7   ; For compatibility

; DDRC - Port C Data Direction Register
.equ   DDC0   = 0   ; Port C Data Direction Register bit 0
.equ   DDC1   = 1   ; Port C Data Direction Register bit 1
.equ   DDC2   = 2   ; Port C Data Direction Register bit 2
.equ   DDC3   = 3   ; Port C Data Direction Register bit 3
.equ   DDC4   = 4   ; Port C Data Direction Register bit 4
.equ   DDC5   = 5   ; Port C Data Direction Register bit 5
.equ   DDC6   = 6   ; Port C Data Direction Register bit 6
.equ   DDC7   = 7   ; Port C Data Direction Register bit 7

; PINC - Port C Input Pins
.equ   PINC0   = 0   ; Port C Input Pins bit 0
.equ   PINC1   = 1   ; Port C Input Pins bit 1
.equ   PINC2   = 2   ; Port C Input Pins bit 2
.equ   PINC3   = 3   ; Port C Input Pins bit 3
.equ   PINC4   = 4   ; Port C Input Pins bit 4
.equ   PINC5   = 5   ; Port C Input Pins bit 5
.equ   PINC6   = 6   ; Port C Input Pins bit 6
.equ   PINC7   = 7   ; Port C Input Pins bit 7


; ***** PORTD ************************
; PORTD - Port D Data Register
.equ   PORTD0   = 0   ; Port D Data Register bit 0
.equ   PD0   = 0   ; For compatibility
.equ   PORTD1   = 1   ; Port D Data Register bit 1
.equ   PD1   = 1   ; For compatibility
.equ   PORTD2   = 2   ; Port D Data Register bit 2
.equ   PD2   = 2   ; For compatibility
.equ   PORTD3   = 3   ; Port D Data Register bit 3
.equ   PD3   = 3   ; For compatibility
.equ   PORTD4   = 4   ; Port D Data Register bit 4
.equ   PD4   = 4   ; For compatibility
.equ   PORTD5   = 5   ; Port D Data Register bit 5
.equ   PD5   = 5   ; For compatibility
.equ   PORTD6   = 6   ; Port D Data Register bit 6
.equ   PD6   = 6   ; For compatibility
.equ   PORTD7   = 7   ; Port D Data Register bit 7
.equ   PD7   = 7   ; For compatibility

; DDRD - Port D Data Direction Register
.equ   DDD0   = 0   ; Port D Data Direction Register bit 0
.equ   DDD1   = 1   ; Port D Data Direction Register bit 1
.equ   DDD2   = 2   ; Port D Data Direction Register bit 2
.equ   DDD3   = 3   ; Port D Data Direction Register bit 3
.equ   DDD4   = 4   ; Port D Data Direction Register bit 4
.equ   DDD5   = 5   ; Port D Data Direction Register bit 5
.equ   DDD6   = 6   ; Port D Data Direction Register bit 6
.equ   DDD7   = 7   ; Port D Data Direction Register bit 7

; PIND - Port D Input Pins
.equ   PIND0   = 0   ; Port D Input Pins bit 0
.equ   PIND1   = 1   ; Port D Input Pins bit 1
.equ   PIND2   = 2   ; Port D Input Pins bit 2
.equ   PIND3   = 3   ; Port D Input Pins bit 3
.equ   PIND4   = 4   ; Port D Input Pins bit 4
.equ   PIND5   = 5   ; Port D Input Pins bit 5
.equ   PIND6   = 6   ; Port D Input Pins bit 6
.equ   PIND7   = 7   ; Port D Input Pins bit 7


; ***** WATCHDOG *********************
; WDTCR - Watchdog Timer Control Register
.equ   WDP0   = 0   ; Watch Dog Timer Prescaler bit 0
.equ   WDP1   = 1   ; Watch Dog Timer Prescaler bit 1
.equ   WDP2   = 2   ; Watch Dog Timer Prescaler bit 2
.equ   WDE   = 3   ; Watch Dog Enable
.equ   WDTOE   = 4   ; RW
.equ   WDDE   = WDTOE   ; For compatibility



; ***** LOCKSBITS ********************************************************
.equ   LB1   = 0   ; Lock bit
.equ   LB2   = 1   ; Lock bit
.equ   BLB01   = 2   ; Boot Lock bit
.equ   BLB02   = 3   ; Boot Lock bit
.equ   BLB11   = 4   ; Boot lock bit
.equ   BLB12   = 5   ; Boot lock bit


; ***** FUSES ************************************************************
; LOW fuse bits
.equ   CKSEL0   = 0   ; Select Clock Source
.equ   CKSEL1   = 1   ; Select Clock Source
.equ   CKSEL2   = 2   ; Select Clock Source
.equ   CKSEL3   = 3   ; Select Clock Source
.equ   SUT0   = 4   ; Select start-up time
.equ   SUT1   = 5   ; Select start-up time
.equ   BODEN   = 6   ; Brown out detector enable
.equ   BODLEVEL   = 7   ; Brown out detector trigger level

; HIGH fuse bits
.equ   BOOTRST   = 0   ; Select Reset Vector
.equ   BOOTSZ0   = 1   ; Select Boot Size
.equ   BOOTSZ1   = 2   ; Select Boot Size
.equ   EESAVE   = 3   ; EEPROM memory is preserved through chip erase
.equ   CKOPT   = 4   ; Oscillator Options
.equ   SPIEN   = 5   ; Enable Serial programming and Data Downloading
.equ   JTAGEN   = 6   ; Enable JTAG
.equ   OCDEN   = 7   ; Enable OCD



; ***** CPU REGISTER DEFINITIONS *****************************************
.def   XH   = r27
.def   XL   = r26
.def   YH   = r29
.def   YL   = r28
.def   ZH   = r31
.def   ZL   = r30



; ***** DATA MEMORY DECLARATIONS *****************************************
.equ   FLASHEND   = 0x1fff   ; Note: Word address
.equ   IOEND   = 0x003f
.equ   SRAM_START   = 0x0060
.equ   SRAM_SIZE   = 1024
.equ   RAMEND   = 0x045f
.equ   XRAMEND   = 0x0000
.equ   E2END   = 0x01ff
.equ   EEPROMEND   = 0x01ff
.equ   EEADRBITS   = 9
#pragma AVRPART MEMORY PROG_FLASH 16384
#pragma AVRPART MEMORY EEPROM 512
#pragma AVRPART MEMORY INT_SRAM SIZE 1024
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60



; ***** BOOTLOADER DECLARATIONS ******************************************
.equ   NRWW_START_ADDR   = 0x1c00
.equ   NRWW_STOP_ADDR   = 0x1fff
.equ   RWW_START_ADDR   = 0x0
.equ   RWW_STOP_ADDR   = 0x1bff
.equ   PAGESIZE   = 64
.equ   FIRSTBOOTSTART   = 0x1f80
.equ   SECONDBOOTSTART   = 0x1f00
.equ   THIRDBOOTSTART   = 0x1e00
.equ   FOURTHBOOTSTART   = 0x1c00
.equ   SMALLBOOTSTART   = FIRSTBOOTSTART
.equ   LARGEBOOTSTART   = FOURTHBOOTSTART



; ***** INTERRUPT VECTORS ************************************************
.equ   INT0addr   = 0x0002   ; External Interrupt Request 0
.equ   INT1addr   = 0x0004   ; External Interrupt Request 1
.equ   OC2addr   = 0x0006   ; Timer/Counter2 Compare Match
.equ   OVF2addr   = 0x0008   ; Timer/Counter2 Overflow
.equ   ICP1addr   = 0x000a   ; Timer/Counter1 Capture Event
.equ   OC1Aaddr   = 0x000c   ; Timer/Counter1 Compare Match A
.equ   OC1Baddr   = 0x000e   ; Timer/Counter1 Compare Match B
.equ   OVF1addr   = 0x0010   ; Timer/Counter1 Overflow
.equ   OVF0addr   = 0x0012   ; Timer/Counter0 Overflow
.equ   SPIaddr   = 0x0014   ; Serial Transfer Complete
.equ   URXCaddr   = 0x0016   ; USART, Rx Complete
.equ   UDREaddr   = 0x0018   ; USART Data Register Empty
.equ   UTXCaddr   = 0x001a   ; USART, Tx Complete
.equ   ADCCaddr   = 0x001c   ; ADC Conversion Complete
.equ   ERDYaddr   = 0x001e   ; EEPROM Ready
.equ   ACIaddr   = 0x0020   ; Analog Comparator
.equ   TWIaddr   = 0x0022   ; 2-wire Serial Interface
.equ   INT2addr   = 0x0024   ; External Interrupt Request 2
.equ   OC0addr   = 0x0026   ; Timer/Counter0 Compare Match
.equ   SPMRaddr   = 0x0028   ; Store Program Memory Ready

.equ   INT_VECTORS_SIZE   = 42   ; size in words

#endif  /* _M16DEF_INC_ */

; ***** END OF FILE ******************************************************

8)


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 18:40:16 
Родился

Зарегистрирован: Чт янв 25, 2018 20:28:19
Сообщений: 11
Рейтинг сообщения: 0
Всем спасибо! Столько нового открыли!) Буду дальше осваивать


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 18:54:11 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2907
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18720
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
чтобы не задавать тут "детские" вопросы, достаточно было даташит почитать - раздел про прерывания.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 19:03:45 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15046
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Где даташит, а где и документацию на IDE - там также много интересного, особо ежли еще и с симулятором работать.
:wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 19:12:25 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 209
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1517
Рейтинг сообщения: 0
и нельзя просто делать одноадресный rjmp.
а чтобы "потратить" на один вектор 2 адреса, для reti и для rjmp нужно добавлять nop.

А еще надежнее - для всех прерываний прописать в .org абсолютные адреса.
BOB51 писал(а):
Где даташит, а где и документацию на IDE

Для ТСа: во вкладке help есть в том числе справка по ассемблерным командам. Полезная штука.
И странно, что никто не напомнил почитать Евстифеева. Или это я проглядел...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 20:06:34 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 38
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
Как по мне, ТС рано с 16-ой меги начал. На 8-й бы потренировался, она попроще.
А на 16-ой ещё сюрпризы с in/out/lds/sts/(r)jmp/(r)call будут. Разобраться можно, но не имея более простой базы - сложнее :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 20:27:43 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15046
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
У меги16 внутрисхемная отладка (если фирменный STK500 иметь)...
:roll:
Да и вероятен корпус DIP40 - такое корпусирование (40-лапка) только у меги8515, 162й и 8535...
В остальном - особо ничем не выделяется... Как вариант - просто была под руками.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пт янв 31, 2025 20:44:18 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 38
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
BOB51 писал(а):
В остальном - особо ничем не выделяется...
да, точно :facepalm:
Мне почему-то запало, что она как 328-я по регистрам. :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Сб фев 01, 2025 22:20:48 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1477
Рейтинг сообщения: 0
Асм. То советую книгу. Вольфганг Трамперт. AVR-RISC микроконтроллеры.
Очень подробно расписано по МК AVR.
Я сейчас не дома. Завтра приеду, постараюсь выложить проект как пример. С векторами прерываний.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Пн фев 03, 2025 21:21:51 
Мучитель микросхем
Аватар пользователя

Карма: 10
Рейтинг сообщений: 155
Зарегистрирован: Ср июн 29, 2022 16:25:45
Сообщений: 469
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
никто не напомнил почитать Евстифеева
Как по мне, Евстифеев - это компиляция даташитов на русском.
а разработка более интересна чуток по другим книжкам. Я начинала АВРки с Ревича - Практическое программирование AVR на ассемблере.
Еще есть книжки Белова (например, МК AVR в радиолюбительской практике Полный разбор ATTINY2313).
Плюс этих книжек - там идет разбор работы периферии на примере каких то практических кейсов.
А Евстифеев - да, маст хев, но как справочник.

_________________
Белая и Пушистая


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятки с прерываниями в AVR Studio
СообщениеДобавлено: Вт фев 04, 2025 06:07:28 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1477
Рейтинг сообщения: 0
Моей настольной книгой была книга Вольфганг Трамперт AVR RISC микроконтроллеры. Остальные книги были в качестве примеров программ. Есть ещё книжка Джон Мортон Микроконтроллеры AVR Вводный курс.
В примерах нужно быть повнимательнее. В каком то из примеров есть ошибка.

Добавлено after 17 minutes 31 second:
Смотри. На каждый камень ты создаешь вот такой файл. Это векторы прерываний. Делай по такому примеру.
vectors_m8535.inc:
Спойлер
Код:
.cseg

.org   0x0000
      rjmp   Reset

;====== INTERRUPT VECTORS ============
.org   INT0addr            ; External Interrupt 0
      reti

.org   INT1addr            ; External Interrupt 1
      reti

.org   OC2addr               ; Timer/Counter2 Compare Match
      reti // rjmp   Proc_Int_BAM // reti

.org   OVF2addr            ; Timer/Counter2 Overflow
      reti

.org   ICP1addr            ; Timer/Counter1 Capture Event
      reti

.org   OC1Aaddr            ; Timer/Counter1 Compare Match A
      reti

.org   OC1Baddr            ; Timer/Counter1 Compare Match B
      reti

.org   OVF1addr            ; Timer/Counter1 Overflow
      reti

.org   OVF0addr            ; Timer/Counter0 Overflow
      reti

.org   SPIaddr               ; SPI Serial Transfer Complete
      reti               ; rjmp   SPI_Transfer_Int

.org   URXCaddr            ; USART, RX Complete
      reti

.org   UDREaddr            ; USART Data Register Empty
      reti

.org   UTXCaddr            ; USART, TX Complete
      reti

.org   ADCCaddr            ; ADC Conversion Complete
      reti // rjmp   ADC_Complete

.org   ERDYaddr            ; EEPROM Ready
      reti

.org   ACIaddr               ; Analog Comparator
      reti

.org   TWIaddr               ; Two-wire Serial Interface
      reti

.org   INT2addr            ; External Interrupt Request 2
      reti

.org   OC0addr               ; TimerCounter0 Compare Match
      rjmp   Sys_Timer_Comp

.org   SPMRaddr            ; Store Program Memory Read
      reti
;----------
.org   INT_VECTORS_SIZE      ; size in words
;===================



Какой то проект до кучи. просто для примера.

На каждый камень есть даташит. И в нем есть таблица векторов. На каждый камень смотрим эту таблицу. И создаем файл таблицу векторов.

Младшие МК. У них 2 байтные адреса векторов.
До 8x можно спокойно применять команду rjmp.
Старшие. Типа M16, M32 и выше у них уже 4 байтные адреса векторов. Поэтому нужно использовать оператор .ORG и команду jmp.

Тут уже нужно вникать. Читать внимательно даташиты на мк. Где какую команду правильно применить. rjmp или jmp.

В AVR STUDIO на каждый камень есть заголовочный файл. Заглядываем туда. И на каждый камень есть таблица определений векторов.

По этой таблице и создаём файл.


Вложения:
LCD_4.rar [31.88 KiB]
Скачиваний: 40
Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y