Меня интересует физическая величина c практической стороны типа подал +5В на вывод PC0 и должно произойти определённое действие! В симуляторе AVR Studio при установки бита0 в PortC всё срабатывает а в Протеусе не работает!!
Может что-то не так делаю - я только учусь! Код прилагается.
Спойлер
Код: Выделить всё
/*
* FAST_shim.asm
*
* Created: 19.08.2014 14:18:20
* Author: PLATON
*/
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R21
.def Temp5=R22
.def ResCnt=R20
.cseg
.org 0
;Вектора прерываний
jmp RESET ; Reset Handler
jmp EXT_INT0 ; IRQ0 Handler
jmp EXT_INT1 ; IRQ1 Handler
jmp TIM2_COMP ; Timer2 Compare Handler
jmp TIM2_OVF ; Timer2 Overflow Handler
jmp TIM1_CAPT ; Timer1 Capture Handler
jmp TIM1_COMPA ; Timer1 CompareA Handler
jmp TIM1_COMPB ; Timer1 CompareB Handler
jmp TIM1_OVF ; Timer1 Overflow Handler
jmp TIM0_OVF ; Timer0 Overflow Handler
jmp SPI_STC ; SPI Transfer Complete Handler
jmp USART_RXC ; USART RX Complete Handler
jmp USART_UDRE ; UDR Empty Handler
jmp USART_TXC ; USART TX Complete Handler
jmp ADCM ; ADC Conversion Complete Handler
jmp EE_RDY ; EEPROM Ready Handler
jmp ANA_COMP ; Analog Comparator Handler
jmp TWSI ; Two-wire Serial Interface Handler
jmp EXT_INT2 ; IRQ2 Handler
jmp TIM0_COMP ; Timer0 Compare Handler
jmp SPM_RDY
;RESET:
;EXT_INT0:
;EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADCM:
EE_RDY:
ANA_COMP:
TWSI:
;EXT_INT2:
TIM0_COMP:
SPM_RDY:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset:
; инициализация стека
LDI Temp1,Low(RAMEND)
OUT SPL,Temp1
LDI Temp1,High(RAMEND)
OUT SPH,Temp1
ldi Temp,0b11111110 ;настройка портов
out DDRC,Temp
out PORTC,Temp
ldi Temp,0b10000000 ;настройка портов
out DDRD,Temp
ldi Temp,0b11111000 ;настройка портов
out DDRB,Temp
ldi Temp,0b00100000 ; Разрешение прерывания INT2
out GICR,Temp
ldi Temp,0b01000000 ; По нарастающему фронту
out MCUCSR,Temp
sei ; Разрешить прерывания
Pusk:
jmp Pusk
EXT_INT2:
;настройка противофазы OC0 и OC2
ldi Temp,0b00000001 ;инициализация таймера0
out TCNT0,Temp
ldi Temp,0b10000011 ;инициализация таймера2
out TCNT2,Temp
ldi Temp,0b01111001 ;фаст шим0 настройка, запуск таймера
out TCCR0,Temp
ldi Temp,0b01111001 ;фаст шим2 настройка, запуск таймера
out TCCR2,Temp
EEPROM_read: ;Чтение данных с EEPROM
sbic EECR,EEWE ;Ждать завершения предыдущей записи
jmp EEPROM_read
sbi EECR,EERE ;Начать чтение
in Temp4,EEDR ;Сохранить данные
out OCR0,Temp4 ;Вывести в регистр сравнения счётчика
out OCR2,Temp4 ;Вывести в регистр сравнения счётчика
ldi Temp,0b11000000 ; Разрешение прерывания INT0, INT1
out GICR,Temp
ldi Temp,0b00000000 ; По низкому уровню
out MCUCR,Temp
sei
cikl: ; бесконечный цикл
nop
in Temp,PORTC
CPI Temp,0b11111110
brne Reset
jmp cikl
; обработчик внешнего прерывания
EXT_INT0:
ldi Temp3,0
ldi Temp2,0
l_res:
dec Temp3 ; Антидребезг
brne l_res
dec Temp2
brne l_res
inc ResCnt
CPI Temp4,0b11111000 ; сравним с крайним значением
BRSH m1 ; если больше или равно перейдём на метку
inc Temp4
inc Temp4
inc Temp4
inc Temp4
inc Temp4
inc Temp4 ; Уменьшаем Ширину импульса
inc Temp4
inc Temp4
out OCR0,Temp4
out OCR2,Temp4
EEPROM_write1: ;Запись данных в EEPROM
sbic EECR,EEWE ;Ждать завершения предыдущей записи
jmp EEPROM_write1
out EEDR,Temp4 ;Записать данные в регистр данных
sbi EECR,EEMWE ;Установить флаг EEMWE
sbi EECR,EEWE ;Начать запись в EEPROM
m1:
reti
EXT_INT1:
ldi Temp3,0
ldi Temp2,0
l_res2:
dec Temp3 ; Антидребезг
brne l_res2
dec Temp2
brne l_res2
inc ResCnt
CPI Temp4,0b10001100 ; сравним с крайним значением
BRLO m2 ; если меньше или равно перейдём на метку
dec Temp4 ; Увеличиваем Ширину импульса
dec Temp4
dec Temp4
dec Temp4
dec Temp4
dec Temp4
dec Temp4
dec Temp4
out OCR0,Temp4
out OCR2,Temp4
EEPROM_write: ;Запись данных в EEPROM
sbic EECR,EEWE ;Ждать завершения предыдущей записи
jmp EEPROM_write
out EEDR,Temp4 ;Записать данные в регистр данных
sbi EECR,EEMWE ;Установить флаг EEMWE
sbi EECR,EEWE ;Начать запись в EEPROM
m2:
reti

