Re: проблема с бегущим огоньком
Добавлено: Вс сен 23, 2012 12:33:44
Тогда и ассемблер по маленьку осваивай, С не мой конекmixon46 писал(а):Можно подробнее в виде написанной программы с комментариями. Просто я программирование еще не знаю. Ну пытаюсь изучить.
Спойлер
Код: Выделить всё
.include "tn2313def.inc" ; Используем ATtiny2313
.equ Prescale = 15625
; ROM ************************************************************************
.CSEG ; ROM
.org $000
rjmp RESET ; External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
reti ; INT0 Внешнее прерывание 0
reti ; INT1 Внешнее прерывание 1
reti ; TIMER1 CAPT Захват таймера/счетчика Т1
rjmp TIMER1_COMPA ; TIMER1 COMPA Совпадение «А» таймера/счетчика Т1
reti ; TIMER1 OVF Переполнение таймера/счетчика Т1
reti ; TIMER0 OVF Переполнение таймера/счетчика Т0
reti ; USART0,RX USART, прием завершен
reti ; USART0,UDRE Регистр данных USART пуст
reti ; USART0,TX USART, передача завершена
reti ; ANALOG COMP Аналоговый компаратор
reti ; PCINT Pin Change Interrupt
reti ; TIMER1 COMPB Совпадение «В» таймера/счетчика Т1
reti ; TIMER0 COMPA Совпадение «А» таймера/счетчика Т0
reti ; TIMER0 COMPB Совпадение «В» таймера/счетчика Т0
reti ; USI START USI Start Condition
reti ; USI OVERFLOW USI Overflow
reti ; EE_RDY EEPROM, готово
reti ; WDT OVERFLOW Watchdog Timer Overflow
;*****************************************************************************
; -------------------------- R E S E T ---------------------------------------
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
RESET:
cli
ldi r16, RAMEND ; Устанавливаем вершину системного стека
out SPL, r16 ;
; ----------------------- M A I N P R O G R A M M ---------------------------
TIMER1_Init:
ldi r16, (1<<OCIE1A) ; Включаем прерывание по совпадению А таймера 1
out TIMSK, r16
ldi r16, low(Prescale-1) ; Загружаем в регистр сравнения наш прескалер 1:15625
ldi r17,high(Prescale-1) ;
out OCR1AH, r17
out OCR1AL, r16
ldi r17, (0b01<<WGM12) ; Устанавливаем режим СТС таймера 1
ori r17, (0b100<<CS10) ; Prescaler 1:256
out TCCR1B, r17 ;
sei
MAIN_loop:
in r16,MCUCR
ori r16, (1<<SE) ; Процессор в спячку, если нечего делать
out MCUCR, r16
sleep ; Отдыхаем пока не началось
rjmp MAIN_loop ; Go again
; --------------------- I N T E R R U P T -----------------------------------
TIMER1_COMPA:
reti