Hi, All!
тут решил написать первую тестовую программку... подключил к самопальному программатору (провода, резисторы и рутина на паскале и асме). заработала девайсина. а вот программу тестовую я не осилил. помогите, кто может... где тут ошибка?
программа состоит из: главной части, где я пытаюсь проинициализировать все управляющие регистры (как я понимаю, io-registers). ставим прерывания по таймеру-0, таймер работает на частоте (1.6МГц / 1024). прерывание "делит" частоту на 250 и на 10. и "дёргает" ногами порта pb3, pb4.
=== Hачало tn15test.asm... === ; ─────────────────────────────────────────────────────────────────────── ; *** тестовая программа "мигалка" ; ─────────────────────────────────────────────────────────────────────── ; .include "tn15def.inc"
; *** объявляем константы .equ ck_tune =$8b ; байт калибровки частоты
; *** объявляем регистры .equ ddrb =$17 ; регистр функций portb .equ portb =$18 ; регистр portb .equ osccal =$31 ; регистр настройки частоты .equ tccr0 =$33 ; регистр управления tc0 .equ timsk =$39 ; регистр масок прерываний tc .equ gimsk =$3b ; регистр масок общих прерываний .equ sreg =$3f ; регистр состония
.def div250 =r16 ; .def div10 =r17 ; .def mask =r18 ; .def temp =r19 ; .def loader =r20 ;
; *** таблица векторов прерываний .cseg ; переходим на сегмент flash .org $0000 ; вектор начального сброса rjmp cold_start ; .org $0001 ; вектор внешнего прерывания 0 reti ; не назначено .org $0002 ; прерывание по изменению "пина" reti ; не назначено .org $0003 ; reti ; не назначено .org $0004 ; переполнение таймера 1 reti ; не назначено .org $0005 ; переполнение таймера 0 rjmp t0_int ; .org $0006 ; готовность eeprom reti ; не назначено .org $0007 ; компаратор reti ; не назначено .org $0008 ; преобразование a-to-d reti ; не назначено
; ─────────────────────────────────────────────────────────────────────── ; *** подпрограммы .cseg ; переходим на сегмент flash .org $0009 ; t0_int: dec div250 ; brne quit ; div_by_250: ldi div250, $fa ; dec div10 ; brne quit ; div_by_10: ldi div10, $0a ; changing_port: in temp, portb ; eor temp, mask ; andi temp, $18 ; out portb, temp ; quit: reti ;
; ─────────────────────────────────────────────────────────────────────── ; *** основной блок управляющей программы cold_start: ldi loader, ck_tune ; настройка частоты на 1.6MHz out osccal, loader ; ldi loader, $05 ; пределитель частоты на 1024 out tccr0, loader ; ldi loader, $02 ; прерывание по переполнению tc0 out timsk, loader ; sei ; разрешаем все прерывания xm0: ldi loader, $18 ; pb4, pb3 как выходы out ddrb, loader ; xm1: ldi div250, $fa ; ldi div10, $0a ; ldi mask, $ff ; ; endless: jmp endless ; зацикливаем программу
.exit ; === ...конец tn15test.asm. ===
oleg