код из assembler в arduino
- Войдите на сайт для отправки комментариев
Сб, 30/05/2015 - 15:15
Всем доброго времени суток.
Появилась необходимость перевести программный код с assemblera на среду arduino.
Изначально схема собиралась на микроконтроллере atmega8a. После некоторых доработок, микроконтроллер atmega8a из системы убрался, а на его место был вставлен arduino uno на микроконтроллере atmega328. Также убрался и семисегментный идикатор отображения, а на его место установлен lcd на hd4480.
Теперь необходимо зашить arduino, а сам средой разработки под неё не владею. Посему прошу помощи кто хорошо её знает.
.include "m8Adef.inc"
.dseg
Digit: .byte 3
Sara: .byte 3
Mona: .byte 2
.cseg
.org 0
rjmp RESET
rjmp EXT_INT0
rjmp EXT_INT1
rjmp TIM2_COMP
rjmp TIM2_OVF
rjmp TIM1_CAPT
rjmp TIM1_COMPA
rjmp TIM1_COMPB
rjmp TIM1_OVF
rjmp TIM0_OVF
rjmp SPI_STC
rjmp USART_RXC
rjmp USART_UDRE
rjmp USART_TXC
rjmp AD
rjmp EE_RDY
rjmp ANA_COMP
rjmp TWSI
rjmp 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:
AD:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:
reti
RESET:
ldi R16,Low(RAMEND) ;инициализация стека
out SPL,R16
ldi R16,High(RAMEND) ;инициализация стека
out SPH,R16
;Настройка таймера TIM0
ldi R16,0b00000100
out TCCR0,R16 ;СК/256
ldi R16,0b00000001
out TIMSK,R16
ldi R16,0
sei
Zara1: cpi R16,15
brsh Zara2
rjmp Zara1
Zara2: cli
ldi R16,0
out TCCR0,R16
;Настройка порта D
ldi R16,0b11111111
out DDRD,R16
;Настройка порта B
ldi R16,0b00000111
out DDRB,R16
;Настройка порта C
ldi R16,0b00111000
out DDRC,R16
;Настройка таймера TIM2
ldi R16,0b00001010
out TCCR2,R16 ;СК/8
ldi R16,125
out OCR2,R16
ldi R16,0b10000000
out TIMSK,R16
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,0
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
ldi R24,0
ldi R25,0
ldi R26,0
ldi R27,0
sei
;*******************************************
Main:
sbis PINC,0 ;кнопка нажата?
rjmp A1
sbis PINC,2 ;фронтофой замкнут?
rjmp Main
sbi PORTC,4
rjmp Zam2
A1: sbis PINC,1 ;тыловой замкнут?
rjmp Main
sbi PORTC,3
rjmp Zam1
;*******************************************
;Измерение время притяжения якоря
;*******************************************
Zam1: sbis PINC,0 ;кнопка нажата?
rjmp Zam1
sbr R18,1 ;установить КБ включения таймера
sbi PORTC,5
B1: sbis PINC,2 ;фронтовой замкнут?
rjmp B2
rjmp Obrobka
B2: sbrs R18,1 ;КБ задержки установлен?
rjmp B1
sbis PINC,0 ;кнопка нажата?
rjmp B3
rjmp B1
B3: cbr R18,1 ;сбросить КБ включения таймера
cbi PORTC,5
cbi PORTC,3
rjmp Main
;*******************************************
;Измерение время отпускания якоря
;*******************************************
Zam2: sbic PINC,0 ;кнопка отжата?
rjmp Zam2
sbr R18,1 ;установить КБ включения таймера
sbi PORTC,5
D1: sbis PINC,1 ;тыловой замкнут?
rjmp D2
rjmp Obrobka
D2: sbrs R18,1 ;КБ задержки установлен?
rjmp D1
sbic PINC,0 ;кнопка отжата?
rjmp D3
rjmp D1
D3: cbr R18,1 ;сбросить КБ включения таймера
cbi PORTC,5
cbi PORTC,4
rjmp Main
;*******************************************
;Обработка результата
;*******************************************
Obrobka: sts Mona,R16
sts Mona+1,R17
cbr R18,1 ;сбросить КБ включения таймера
cbi PORTC,5
Vana: cbr R18,4 ;сбросить КБ1 знака
cbr R18,8 ;сбросить КБ2 знака
lds R20,Mona
lds R21,Mona+1
ldi R22,232
ldi R23,3
rcall Sava
cpi R25,10
brsh E1
rjmp E2
E1: sbr R18,4 ;установить КБ1 знака
rjmp E4
E2: sts Digit,R25
mov R22,R20
mov R23,R21
ldi R24,10
rcall Rafa
ldi R22,232
ldi R23,3
rcall Sava
sts Digit+1,R25
E3: mov R22,R20
mov R23,R21
ldi R24,10
rcall Rafa
ldi R22,232
ldi R23,3
rcall Sava
sts Digit+2,R25
rjmp E5
E4: ldi R19,0
S1: cpi R25,10
brsh S2
rjmp S3
S2: subi R25,10
inc R19
rjmp S1
S3: sts Digit,R19
sts Digit+1,R25
rjmp E3
E5:
;____________________________________________________
lds R20,Mona
lds R21,Mona+1
ldi R22,232
ldi R23,3
rcall Sava
cpi R25,10
brsh F1
rjmp F2
F1: sbr R18,8 ;установить КБ2 знака
rjmp F4
F2: sts Sara,R25
mov R22,R20
mov R23,R21
ldi R24,10
rcall Rafa
ldi R22,232
ldi R23,3
rcall Sava
sts Sara+1,R25
F3: mov R22,R20
mov R23,R21
ldi R24,10
rcall Rafa
ldi R22,232
ldi R23,3
rcall Sava
sts Sara+2,R25
rjmp F5
F4: ldi R19,0
C1: cpi R25,10
brsh C2
rjmp C3
C2: subi R25,10
inc R19
rjmp C1
C3: sts Sara,R19
sts Sara+1,R25
rjmp F3
F5:
;*********************************************
;Сравнение результатов в ячейках Digit и Sara
;*********************************************
lds R20,Digit
lds R21,Sara
cp R20,R21
breq V1
rjmp Vana
V1: lds R20,Digit+1
lds R21,Sara+1
cp R20,R21
breq V2
rjmp Vana
V2: lds R20,Digit+2
lds R21,Sara+2
cp R20,R21
breq V3
rjmp Vana
V3: sbrs R18,2 ;КБ1 знака установлен?
rjmp V4
sbrs R18,3 ;КБ2 знака установлен?
rjmp Vana
rjmp Toma
V4: sbrc R18,3 ;КБ2 знака сброшен?
rjmp Vana
;****************************************
;Вывод числа на семисегментный индикатор
;****************************************
Toma: lds R19,Digit
ldi R20,0b00000100
out PORTB,R20
rcall Decoder
sbrc R18,2 ;КБ1 знака сброшен?
rjmp G1
andi R19,0b01111111
G1: out PORTD,R19
rcall Delay1
lds R19,Digit+1
ldi R20,0b00000010
out PORTB,R20
rcall Decoder
sbrs R18,2 ;КБ1 знака установлен?
rjmp G2
andi R19,0b01111111
G2: out PORTD,R19
rcall Delay1
lds R19,Digit+2
ldi R20,0b00000001
out PORTB,R20
rcall Decoder
out PORTD,R19
rcall Delay1
rjmp Toma
;*********************************************
;Подпрограмма умножения
;*********************************************
Rafa: ldi R20,0 ;результат умножения (младшая часть)
ldi R21,0 ;результат умножения (старшая часть)
ldi R25,0 ;сброс счетчика умножения
M1: cp R25,R24
brlo M2
rjmp M3
M2: add R20,R22
adc R21,R23
inc R25
rjmp M1
M3: ret
;*********************************************
;Подпрограмма деления
;*********************************************
Sava: ldi R25,0 ;сброс счетчика деления
K1: cp R20,R22
cpc R21,R23
brsh K2
rjmp K3
K2: sub R20,R22
sbc R21,R23
inc R25
rjmp K1
K3: ret
;*********************************************
;Подпрограмма задержки
;*********************************************
Delay1: ldi R26,0
d11: cpi R26,8
breq d13
inc R26
ldi R27,0
d12: cpi R27,100
breq d11
inc R27
rjmp d12
d13: ret
;*********************************************
;Подпрограмма семисегментного декодера
;*********************************************
Decoder:
ldi ZL,Low(DcMatrix*2)
ldi ZH,High(DcMatrix*2)
ldi R20,0
add ZL,R19
adc ZH,R20
lpm
mov R19,R0
ret
DcMatrix:
; hgfedcba hgfedcba
.db 0b11000000,0b11111001 ;0,1
.db 0b10100100,0b10110000 ;2,3
.db 0b10011001,0b10010010 ;4,5
.db 0b10000010,0b11111000 ;6,7
.db 0b10000000,0b10010000 ;8,9
;*********************************************
;Прерывание таймера TIM2
;*********************************************
TIM2_COMP:
sbrs R18,0 ;таймер включен?
rjmp T3
ldi R26,1
ldi R27,0
add R16,R26
adc R17,R27
sbrs R18,1 ;КБ задержки установлен?
rjmp T1
rjmp T4
T1: ldi R26,244
ldi R27,1
cp R16,R26
cpc R17,R27
brsh T2
rjmp T4
T2: sbr R18,2 ;установить КБ задержки
rjmp T4
T3: ldi R16,0
ldi R17,0
cbr R18,2 ;сброс КБ задержки
T4:
reti
;*********************************************
;Прерывание таймера TIM0
;*********************************************
TIM0_OVF:
inc R16
reti
камни разные. индикаторы разные.думаешь если зальешь заработает?
jeka_tmа а есть ли другие варианты реализавать? Или поискать arduino на atmega8 (китайские аналоги).
а дисплей как?
vvadim, уже думаю над реализацией, т.к семисегментный индикатор ушёл
ну если даже мегу8 взять не заработает с другим дисплеем. надо код переписывать