код из assembler в arduino

bahmar
Offline
Зарегистрирован: 29.05.2015

Всем доброго времени суток.

Появилась необходимость перевести программный код с 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
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

камни разные. индикаторы разные.думаешь если зальешь заработает?

bahmar
Offline
Зарегистрирован: 29.05.2015

jeka_tmа а есть  ли другие варианты реализавать? Или поискать arduino на atmega8 (китайские аналоги).

vvadim
Offline
Зарегистрирован: 23.05.2012

а дисплей как?

bahmar
Offline
Зарегистрирован: 29.05.2015

vvadim, уже думаю над реализацией, т.к семисегментный индикатор ушёл

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну если даже мегу8 взять не заработает с другим дисплеем. надо код переписывать