Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Помогите челу избалованому Си запустить АСМ старинного 90s1200 - исходник выдает ошибку "RESET vector must contain a RJMP instruction" - что и куда вписать ? СПАСИБО !!!

Отправлено avr123.nm.ru 31 марта 2007 г. 10:18


90s1200 - исходник выдает ошибку

"RESET vector must contain a RJMP instruction"

- что и куда вписать ?


; по другим исходникам вижу что нужно воткнуть типа
;
; reset:
; rjmp

; но куда ???

\\\\\\\\\\


.include "1200def.inc"

.def number = r10
.def ind_l = r11
.def ind_m = r12
.def ind_h = r13
.def if_l = r14
.def if_h = r15
.def fl_l = r16
.def fl_h =r17
.def work_l =r18
.def work_h =r19
.def temp =r20
.def temp1 =r21
.def loop = r22
.def flagtx =r23
.def glob = r24
.def mult_l = r25
.def mult_h = r26
.def fm_h = r27
.def fm_l = r28
.def temp16_l = r29
.def temp16_h = r30
.def dat_s= r31

;PORTb
.equ DN =0
.equ UP =1
.equ SCAN=2
.equ MEM1=3
.equ MEM2=4
.equ MEM3=5
.equ SAVE=6

;PORTd
.equ TX =0
.equ SQL =1
.equ DATA =2
.equ CL =3
.equ CE =4
.equ SK = 5
.equ DI = 6


.cseg
.org 0

ldi temp, 0xFF
out PORTB,temp ;порт B на ввод
clr temp
out DDRB,temp
ldi temp, 0b10000011
out PORTD, temp
ldi temp,0B01111100
out DDRD,temp ;порт D на выход, кроме двух крайних разрядов SQL, TX
clr number
clr flagtx
ldi temp, 0x50
rcall pause_ro

;**************************
;**************************
ldi temp, fmin ;загружаем из памяти минимальную границу
rcall EERead
mov fl_h, temp
ldi temp, fmin + 1
rcall EERead
mov fl_l, temp
ldi temp, fmax ; загружаем максимальную границу
rcall EERead
mov fm_h, temp
ldi temp, fmax + 1
rcall EERead
mov fm_l, temp
ldi temp, if_freq ;загружаем частоту ПЧ
rcall EERead
mov if_h, temp
ldi temp, if_freq + 1
rcall EERead
mov if_l, temp
ldi temp,ch1 ; загружаем значение из первой ячейки памяти в рабочую
rcall EERead
mov work_h, temp
ldi temp, ch1 +1
rcall EERead
mov work_l, temp


;***********************
;ручной ввод параметров
;***********************
sbis PINB,MEM1
rjmp vvodmin

sbis PINB,MEM2
rjmp vvodmax

sbis PINB,MEM3
rjmp vvodif
rjmp initial

vvodmin:sbis PINB,MEM1
rjmp vvodmin
mov work_l, fl_l
mov work_h, fl_h
ldi fl_l, 0xA0 ;минимальное значение частоты - 20 мГц
ldi fl_h, 0x0F
ldi fm_l, 0x33 ;максимальное - 65535 кГц
ldi fm_h, 0x33
ldi temp, 0x01
mov number, temp
rjmp vision

vvodmax:sbis PINB,MEM2
rjmp vvodmax
mov work_l, fm_l
mov work_h, fm_h
ldi fl_l, 0xA0
ldi fl_h, 0x0F
ldi fm_l, 0x33
ldi fm_h, 0x33
ldi temp, 0x02
mov number, temp
rjmp vision

vvodif:sbis PINB,MEM3
rjmp vvodif
mov work_l, if_l
mov work_h, if_h
ldi fl_l, 0x50 ; минимальное значение частоты - 400 кГц
clr fl_h
ldi fm_l, 0x30 ; максимальное значение - 22000 кГц
ldi fm_h, 0x11
ldi temp, 0x03
mov number, temp


vision:rcall display


askkeys:ldi temp, 0x02
rcall pause_ro

sbis PINB,UP
rjmp up_rout1

sbis PINB,DN
rjmp dn_rout1

sbis PINB,MEM1
rjmp savemin

sbis PINB,MEM2
rjmp savemax

sbis PINB,MEM3
rjmp saveif
rjmp askkeys


up_rout1:sbis PINB,UP
rjmp up_rout1
ldi temp, 0x01
clc
add work_l, temp ; увеличить на 1 значение в рабочей ячейке
clr temp
adc work_h, temp ; если был перенос, увеличиваем на 1 старший разряд
cp fm_h, work_h ; достгло ло значение старшего разряда макс?
brne vision ; нет-выход
cp work_l, fm_l ; если да, проверяем младший разряд
brlo vision
mov work_h, fl_h ; дошло до конца - загружаем рабочую ячейку мин.
mov work_l, fl_l ; значением
rjmp vision

dn_rout1:sbis PINB,DN ; ждём отпускания кнопки
rjmp dn_rout1
clr temp
clc
subi work_l, 0x01 ;уменьшаем на 1 младший байт
sbc work_h, temp ; если был перенос, уменьшаем старший байт
cp work_h, fl_h; дошло до конца?
brne vision ; нет
cp fl_l, work_l ; дошло до конца?
brlo vision ; нет
mov work_h, fm_h ;если дошло, переписываем в рабочую ячейку
mov work_l, fm_l ;максимальное значение
rjmp vision

savemin:sbic PINB, MEM1 ;если кнопку ещё удерживают,
rjmp vision
sbic PINB, SAVE ;проверяем, нажата ли РЕП
rjmp savemin ; если РЕП отпущена, возврат
neotp1:sbis PINB, SAVE ; ждём, пока отпустят РЕП
rjmp neotp1
ldi temp, fmin ; записываем в память данные
mov temp1, work_h
rcall EEwrite
ldi temp, fmin+1
mov temp1, work_l
rcall EEwrite
vozv_1:sbis PINB, MEM1 ; когда отпущена МЕМ1, выход
rjmp vozv_1
rjmp vision

savemax:sbic PINB, MEM2 ;если кнопку ещё удерживают,
rjmp vision
sbic PINB, SAVE ;проверяем, нажата ли РЕП
rjmp savemax ; если РЕП отпущена, возврат
neotp2:sbis PINB, SAVE ; ждём, пока отпустят РЕП
rjmp neotp2
ldi temp, fmax ; записываем в память данные
mov temp1, work_h
rcall EEwrite
ldi temp, fmax+1
mov temp1, work_l
rcall EEwrite
vozv_2:sbis PINB, MEM2 ; когда отпущена МЕМ1, выход
rjmp vozv_2
rjmp vision

saveif:sbic PINB, MEM3 ;если кнопку ещё удерживают,
rjmp vision
sbic PINB, SAVE ;проверяем, нажата ли РЕП
rjmp savemax ; если РЕП отпущена, возврат
neotp3:sbis PINB, SAVE ; ждём, пока отпустят РЕП
rjmp neotp3
ldi temp, if_freq ; записываем в память данные
mov temp1, work_h
rcall EEwrite
ldi temp, if_freq+1
mov temp1, work_l
rcall EEwrite
vozv_3:sbis PINB, MEM3 ; когда отпущена МЕМ1, выход
rjmp vozv_3
rjmp vision

initial:
rcall display
rcall syntez
;***Опрос клавиш**********************
bigloop:ldi temp, 0x02
rcall pause_ro

sbis PINB,UP
rjmp up_rout

sbis PINB,DN
rjmp dn_rout

sbis PIND,TX
rjmp tx_rout

sbis PINB,SCAN
rjmp scan_rout


sbis PINB,MEM1
rjmp mem1_r

sbis PINB,MEM2
rjmp mem2_r

sbis PINB,MEM3
rjmp mem3_r


rjmp bigloop

;***Обработка опроса клавиш ************************

up_rout:sbis PINB,UP
rjmp up_rout
clr temp
clc
ldi temp, 0x01
add work_l, temp ; увеличить на 1 значение в рабочей ячейке
clr temp
adc work_h, temp ; если был перенос, увеличиваем на 1 старший разряд
cp fm_h, work_h ; достгло ло значение старшего разряда макс?
brne initial ; нет-выход
cp work_l, fm_l ; если да, проверяем младший разряд
brlo initial
mov work_h, fl_h ; дошло до конца - загружаем рабочую ячейку мин.
mov work_l, fl_l ; значением
rjmp initial

dn_rout:sbis PINB,DN ; ждём отпускания кнопки
rjmp dn_rout
clr temp
clc
subi work_l, 0x01 ;уменьшаем на 1 младший байт
sbc work_h, temp ; если был перенос, уменьшаем старший байт
cp work_h, fl_h ; дошло до конца?
brne initial ; нет
cp fl_l, work_l ; дошло до конца?
brlo initial ; нет
mov work_h, fm_h ;если дошло, переписываем в рабочую ячейку
mov work_l, fm_l ;максимальное значение
rjmp initial

tx_rout:ldi flagtx,0x01 ;устанавливаем флаг передачи в 1
ldi temp, 0x0B
mov number, temp
rcall display
rcall syntez ;выдаём в синтезатор
return: sbis PIND,TX ;ждём, пока отпустят кнопку
rjmp return
clr flagtx ;если кнопка отпущена, сбрасываем флаг
clr number
rjmp initial


scan_rout:
sbis PINB,SCAN ;ждём, пока отпустят кнопку
rjmp scan_rout
scan_up:clc
ldi temp,0x01
add work_l, temp ;увеличиваем
clr temp
adc work_h, temp ; если был перенос, увеличиваем на 1 старший разряд
cp fm_h, work_h ; достгло ло значение старшего разряда макс?
brne end3 ; нет-выход
cp work_l, fm_l ; если да, проверяем младший разряд
brlo end3
mov work_h, fl_h ; дошло до конца - загружаем рабочую ячейку мин.
mov work_l, fl_l ; значением
brne end3

end3:rcall display
rcall syntez
ldi temp,0x04 ;задержка , определяет скорость сканирования
rcall pause_ro

nachopr:sbic PINB, SCAN ;если нажата SCAN, TX, UP, DN - выход из режима сканирования
rjmp key1
voz1:sbis PINB, SCAN
rjmp voz1
rjmp bigloop
key1:sbic PIND, TX
rjmp key2
voz2:sbis PIND, TX
rjmp voz2
rjmp bigloop
key2:sbic PINB, UP
rjmp key3
voz3:sbis PINB, UP
rjmp voz3
rjmp bigloop
key3:sbic PINB, DN
rjmp key4
voz4:sbis PINB, DN
rjmp voz4
rjmp bigloop
key4:sbic PIND, SQL ;если не нажата ни одна кнопка,
rjmp scan_up ; продолжаем сканирование

ldi glob,0x40 ;подпрограмма обработки, если нажата SQL, ГЛОБ - задержка
oprotp:sbic PINB, SCAN ; если нажата SCAN, TX, UP, DN - выход из режима сканирования
rjmp key11
voz11:sbis PINB, SCAN
rjmp voz11
rjmp bigloop
key11:sbic PIND, TX
rjmp key21
voz21:sbis PIND, TX
rjmp voz21
rjmp bigloop
key21:sbic PINB, UP
rjmp key31
voz31:sbis PINB, UP
rjmp voz31
rjmp bigloop
key31:sbic PINB, DN
rjmp key41
voz41:sbis PINB, DN
rjmp voz41
rjmp bigloop
key41:sbis PIND, SQL ; если SQL всё ещё нажата,
rjmp oprotp ; ждём, пока что-нибудь нажмётся
ldi temp,0x04 ; если SQL отпущена, формируем паузу в сканировании
rcall pause_ro
dec glob ; пауза, пока не сбросится ГЛОБ
brne oprotp
rjmp scan_up ; продолжаем сканирование
;*****************************
;работа с ячейками памяти
;****************************

mem1_r:sbic PINB, MEM1 ;если кнопку ещё удерживают,
rjmp readm1
sbic PINB, SAVE ;проверяем, нажата ли SAVE
rjmp mem1_r ; если РЕП отпущена, возврат
neotpus1:sbis PINB, SAVE ; ждём, пока отпустят SAVE
rjmp neotpus1
ldi temp, ch1 ; записываем в память данные
mov temp1, work_h
rcall EEwrite
ldi temp, ch1+1
mov temp1, work_l
rcall EEwrite
vozv1: sbis PINB, MEM1 ; когда отпущена МЕМ1, выход
rjmp vozv1
rjmp bigloop
readm1:ldi temp,ch1 ;чтение данных из памяти
rcall EEread
mov work_h, temp
ldi temp, ch1+1
rcall EEread
mov work_l, temp
rjmp initial

mem2_r:sbic PINB, MEM2
rjmp readm2
sbic PINB, SAVE
rjmp mem2_r
neotpus2:sbis PINB, SAVE
rjmp neotpus2
ldi temp, ch2
mov temp1, work_h
rcall EEwrite
ldi temp, ch2+1
mov temp1, work_l
rcall EEwrite
vozv2: sbis PINB, MEM2
rjmp vozv2
rjmp bigloop
readm2:ldi temp,ch2
rcall EEread
mov work_h, temp
ldi temp, ch2+1
rcall EEread
mov work_l, temp
rjmp initial

mem3_r:sbic PINB, MEM3
rjmp readm3
sbic PINB, SAVE
rjmp mem3_r
neotpus3:sbis PINB, SAVE
rjmp neotpus3
ldi temp, ch3
mov temp1, work_h
rcall EEwrite
ldi temp, ch3+1
mov temp1, work_l
rcall EEwrite
vozv3: sbis PINB, MEM3
rjmp vozv3
rjmp bigloop
readm3:ldi temp,ch3
rcall EEread
mov work_h, temp
ldi temp, ch3+1
rcall EEread
mov work_l, temp
rjmp initial

;******отображение на дисплее******************


;************ преобразование коэфф.деления в частоту для вывода на индикатор**************
display:clr mult_l
clr mult_h
ldi temp, 0x05
cycle: add mult_l, work_l
adc mult_h, work_h
dec temp
brne cycle
ldi temp16_l, 0x10 ;определяем количество десятков тысяч
ldi temp16_h, 0x27
rcall decdig
cpi temp, 0x00
brne nextdig1
ldi temp, 0x0A
nextdig1:mov ind_h, temp
ldi temp16_l, 0xE8 ;определяем количество тысяч
ldi temp16_h, 0x03
rcall decdig
cpi temp, 0x00
brne nextdig2
ldi temp, 0x0A
nextdig2:mov ind_m, temp
swap ind_m
ldi temp16_l, 0x64 ;определяем количество сотен
clr temp16_h
rcall decdig
cpi temp, 0x00
brne nextdig3
ldi temp, 0x0A
nextdig3:add ind_m, temp
ldi temp16_l, 0x0A ; определяемколичество десятков
clr temp16_h
rcall decdig
cpi temp, 0x00
brne nextdig4
ldi temp, 0x0A
nextdig4:mov ind_l, temp ; в конце операции в ячейках инд содержится
swap ind_l ;десятичное значение рабочей частоты
;mov temp,mult_l
cpi mult_l,0x00 ;нули заменены на А - для вывода на индикатор.
brne enddig
ldi mult_l,0x0A
enddig:add ind_l, mult_l


mov temp, number
no_tx:rcall vyvdig
rcall vyvdig
clr temp
rcall vyvdig
rcall vyvdig
mov temp, ind_h
rcall vyvdig
rcall vyvdig
mov temp, ind_m
rcall vyvdig
rcall vyvdig
mov temp, ind_l
rcall vyvdig
rcall vyvdig
ret

;*****ВВод информации в синтезатор******************
syntez: ;ret ;технологический возврат
mov mult_l, work_l ; в противном случае прибавляем
mov mult_h, work_h
cpi flagtx,0x00
brne nosum ;если установлен флаг, не прибавляем ПЧ
ldi dat_s,0b11100100;0xA4
add mult_l,if_l ;добавляем ПЧ, если надо
adc mult_h,if_h
rjmp sum
nosum:ldi dat_s,0b11100010;0xA2
sum:cbi PORTD,DATA
sbi PORTD,CE ;разрешение записи
ldi loop, 0x08
mov temp,mult_l
loop2:ror temp
brcs h_l
cbi PORTD, DATA
rjmp sync
h_l:sbi PORTD, DATA
sync:rcall pulse
dec loop
brne loop2


ldi loop, 0x08
mov temp, mult_h
loop3:ror temp
brcs h_l1
cbi PORTD, DATA
rjmp sync1
h_l1:sbi PORTD, DATA
sync1:rcall pulse
dec loop
brne loop3



ldi loop, 0x08
mov temp, dat_s
loop21:ror temp
brcs h_l2
cbi PORTD, DATA
rjmp sync2
h_l2:sbi PORTD, DATA
sync2:rcall pulse
dec loop
brne loop21
cbi PORTD, DATA ;CE
cbi PORTD, CE
ret




;***вывод цифры на индикатор***
vyvdig: ; ret ;технологический возврат
ldi loop,0x04
byte_c:rol temp
brcs h_level
cbi PORTD,DI
rjmp synhro
h_level:sbi PORTD,DI
synhro:sbi PORTD,SK
ldi temp1, 0x10;
rcall zaderzh
cbi PORTD,SK
ldi temp1, 0x20
rcall zaderzh
dec loop
brne byte_c
ldi temp1, 0x40
rcall zaderzh
cbi PORTD, DI ;SK
ret
;*************************
; Запись в ЕЕПРОМ
;**************************
EEwrite: sbic EECR, EEWE
rjmp EEwrite
out EEAR, temp
out EEDR, temp1
sbi EECR, EEWE
ret
;***********************
; Чтение из памяти
;***********************
EEread: sbic EECR,EEWE
rjmp EERead
out EEAR,temp
sbi EECR,EERE
in temp,EEDR
ret
;*********************
; пауза
;*********************
pause_ro: ; ret ;технологический возврат
ldi temp1, 0xFF
retu1:ldi loop, 0xFF
retu2:dec loop
brne retu2
dec temp1
brne retu1
dec temp
brne pause_ro
ret
;*********************
; синхроимпульс
;*********************
pulse:sbi PORTD, CL
ldi temp1,0x1F
zad1:dec temp1
brne zad1
cbi PORTD, CL
ldi temp1,0x1F
zad2:dec temp1
brne zad2
ret

zaderzh: ;ret ;технологический возврат
dec temp1
brne zaderzh
ret
;**********************************************
;подпрограмма пересчёта НЕХ- десятичное число
;**********************************************
decdig:ldi temp,-1
minus:sub mult_l, temp16_l
sbc mult_h, temp16_h
inc temp
brsh minus
add mult_l, temp16_l
adc mult_h, temp16_h
ret

.eseg
.org 0

fmin:
.db 0x2C, 0x88 ;0x0F, 0xA0 ;20000/5=4000
fmax:
.db 0x2c, 0xEC ;0x33, 0x33 ;65535/5=13107
if_freq:
.db 0x08, 0x5C ;10700/5=2140
ch1:
.db 0x2C, 0x88
ch2:
.db 0x2C, 0x88
ch3:
.db 0x2C, 0x88
;ch4:
;.db 0x33, 0x32

.db "step5"




Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 6 на два:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru