Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2015, 22:37   #1
AndrewYaremche
 
Регистрация: 25.04.2015
Сообщений: 3
По умолчанию Переписать прогу с ассемблера на Си(чистый,без плюсов)

Помогите переписать простую прогу с ассемблера на Си. С ассемблером мягко говоря не на "ты" , а тут лаба...Огромное спасибо тому кто поможет переписать

Код:
.nolist
.include "2313def.inc"
.list


.def result_h = r16		
.def result_l = r17		
.def temp1    = r18		
.def temp2    = r19		


.def Delay1   = r21
.def Delay2   = r22
.def Delay3   = r23




.equ #CS   = PB2
.equ SCLK  = PB1
.equ DOUT  = PB3
.equ #SHDN = PB0

.equ PORT_ADC = PORTB
.equ DDR_ADC  = DDRB
.equ PIN_ADC  = PINB


.equ Led      = PD3

.equ PORT_Led = PORTD
.equ DDR_Led  = DDRD
.equ PIN_Led  = PIND




.equ VTR_P = 2442			

.equ VTR_N = 1653			

.equ T_300ms =  5000 - 1	; N = (FT * TADC / DIV) - 1


.equ T_5s = (4000000*1.5 - 15)/5
.equ T_3s = (4000000*20 - 15)/5

.MACRO BIT_READ
	sbi PORTB, SCLK		
	nop				
	cbi PORTB, SCLK		

	nop				
DOUT
	in temp1, PIN_ADC		
	sbrc temp1, DOUT		
	ori @0, @1			
.ENDMACRO


.MACRO Wait_4us
	rjmp PC+1
	rjmp PC+1
	rjmp PC+1
	rjmp PC+1
	rjmp PC+1
	rjmp PC+1
	rjmp PC+1
	rjmp PC+1
.ENDMACRO
;//////////////////////////////////////////////////////////////////////////
.listmac
.cseg
.org 0
	rjmp RESET		

.org 0x04
	rjmp TIM_COMP1	

.org  0x0B
RESET:			

	ldi temp1, low(RAMEND)
	out SPL,   temp1

	ldi temp1,     (1<<#CS)
	out PORT_ADC,  temp1


	ldi temp1,     (1<<#CS) | (1<<SCLK) | (1<<#SHDN)
	out DDR_ADC,   temp1

	ldi temp1,     (1<<Led)
	out PORT_Led,  temp1
	out DDR_Led,   temp1


	ldi temp1, 13.3		

Next_1:
; Задати затримку 5 сек
	ldi Delay1, low(T_5s)
	ldi Delay2, high(T_5s)
	ldi Delay3, byte3(T_5s)

; Виклик підпрограми часової затримки (1.5 сек)
	rcall Delay

	dec temp1			; Зменшити лічильник на 1
	brne Next_1			


	ldi temp1,   (1<<SE)
	out MCUCR,   temp1

T_300ms
	ldi temp1,   high(T_300ms)
	out OCR1AH,  temp1		

	ldi temp1,   low(T_300ms)
	out OCR1AL,  temp1		


	ldi temp1,   (1<<OCIE1A)
	out TIMSK,   temp1


	ldi temp1,   (1<<CTC1) | (1<<CS11) | (1<<CS10)
	out TCCR1B,  temp1


	sei

Wait_Loop:
	sleep				 
	rjmp Wait_Loop		

;*********************************************************************
TIM_COMP1:			
	rcall ADC_CONV


	ldi temp1, low(VTR_P)
	ldi temp2, high(VTR_P)


	sub temp1, result_l
	sbc temp2, result_h

; Якщо результат < 0, то сигнал АЦП перевищив верхній поріг і треба включити тривогу
	brlo Alarm			; Якщо VTR_P < RESULT перейти на мітку Alarm

; Якщо сигнал АЦП < VTR+ треба перевірити чи він не виходить за межі нижнього порогу
; Обчислити |VTR- - RESULT|
; Занести в temp2-temp1 значення нижнього порогу
	ldi temp1, low(VTR_N)
	ldi temp2, high(VTR_N)

; Відняти від нижнього порогу поточне значення АЦП (VTR- - RESULT)
	sub temp1, result_l
	sbc temp2, result_h

; Якщо результат >= 0, то сигнал АЦП менший нижнього порогу і треба включити тривогу

	brsh Alarm			; Якщо VTR_N > RESULT перейти на мітку Alarm

; Якщо сигнал не вийшов за межі порогів - виключити світлодіод і перейти в кінець п/п
LL1:
	sbi PORT_LED,  LED		; Виключити світлодіод
	rjmp End				; Перейти на мітку End

; Якщо виявлено порушника
Alarm:
	clr temp1				; temp1 = 0
	out TCCR1B,    temp1		; Зупинити таймер Т1


	ldi Delay1, low(T_5s)
	ldi Delay2, high(T_5s)
	ldi Delay3, byte3(T_5s)

	cbi PORT_LED,  LED		

	rcall Delay				

	sbi PORT_LED,  LED		


	ldi temp1,  (1<<CTC1) | (1<<CS11) | (1<<CS10)
	out TCCR1B, temp1

End:
	reti					
;*********************************************************************
ADC_CONV:					

	sbi PORT_ADC, #SHDN


	Wait_4us
	Wait_4us
	Wait_4us


	clr result_h
	clr result_l


	cbi PORT_ADC, #CS
	nop					


EOC: 	sbis PIN_ADC, DOUT		
	rjmp EOC				;



	BIT_READ result_h, 0b00001000		; Розряд D11
	BIT_READ result_h, 0b00000100		; Розряд D10
	BIT_READ result_h, 0b00000010		; Розряд D9
	BIT_READ result_h, 0b00000001		; Розряд D8
; Молодші 8 біт результату - в регістр result_l
	BIT_READ result_l, 0b10000000		; Розряд D7
	BIT_READ result_l, 0b01000000		; Розряд D6
	BIT_READ result_l, 0b00100000		; Розряд D5
	BIT_READ result_l, 0b00010000		; Розряд D4
	BIT_READ result_l, 0b00001000		; Розряд D3
	BIT_READ result_l, 0b00000100		; Розряд D2
	BIT_READ result_l, 0b00000010		; Розряд D1
	BIT_READ result_l, 0b00000001		; Розряд D0


	sbi PORTB, #CS


	cbi PORT_ADC, #SHDN

	ret			
;*********************************************************************
Delay:			
	subi Delay1, 1	
	sbci Delay2, 0
	sbci Delay3, 0
	brcc Delay		

	nop			

	ret			
;*********************************************************************
AndrewYaremche вне форума Ответить с цитированием
Старый 17.11.2015, 09:02   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Помогите переписать простую прогу с ассемблера на Си.
Лучше бы объяснили на словах, что эта прога должна делать? Так проще было бы.
Если я правильно понял, это какой-то таймер управляющий светодиодом?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 17.11.2015 в 09:04.
Smitt&Wesson вне форума Ответить с цитированием
Старый 17.11.2015, 15:41   #3
AndrewYaremche
 
Регистрация: 25.04.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Лучше бы объяснили на словах, что эта прога должна делать? Так проще было бы.
Если я правильно понял, это какой-то таймер управляющий светодиодом?
Он самый - инфракрасный датчик движения (сигнализация)
AndrewYaremche вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно переписать программу на чистый C East Undia Trading Помощь студентам 4 24.03.2014 01:36
Переписать элементы массива в другой массив (вставка ассемблера) на СИ Pras Помощь студентам 0 18.06.2013 20:50
Переписать программу с ассемблера на С++ Rik_ekb Помощь студентам 1 04.05.2013 10:23
Как перевести прогу с ассемблера? Artur140 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 24.10.2011 13:59