все, осознал проблему, отползаю.
roboforum.ruТехнический форум по робототехнике. |
|
|
Radist писал(а):А знание асемблера полезно.
Angel71 писал(а):***
сколько вам понадобиться времени, чтоб на асме переделать вот в такой код?
***
ну вас с вашими заклинаниями!Strijar писал(а):Для этого существует gcc -O2 -S
.include "m8def.inc" ; подключаем заголовочный файл
.def Temp=R16 ; разное
.def SubSecondCount=R17
.def Temp1=R18
.def Temp2=R19
.def Temp3=R20
.def Temp4=R21
.def LED=R22
.def Time1=R23
.def Time2=R24
.def Time3=R25
.cseg
.org 0
;************_ НАСТРОЙКА ПРЕРЫВАНИЙ _************
rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp TIMER2_COMP
rjmp TIMER2_OVF
rjmp TIMER1_CAPT
rjmp TIMER1_COMPA
rjmp TIMER1_COMPB
rjmp TIMER1_OVF
rjmp TIMER0_OVF
rjmp SPI_STC
rjmp USART_RXC
rjmp USART_UDRE
rjmp USART_TXC
rjmp ADC_MY
rjmp EE_RDY
rjmp ANA_COMP
rjmp TWI
rjmp SPM_RDY
;Reset:
INT_0:
INT_1:
TIMER2_COMP:
TIMER2_OVF:
TIMER1_CAPT:
TIMER1_COMPA:
TIMER1_COMPB:
TIMER1_OVF:
;TIMER0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADC_MY:
EE_RDY:
ANA_COMP:
TWI:
SPM_RDY:
reti
Reset: ldi Temp,0b11111111 ; настройка портов
out DDRB,Temp
ldi Temp,4
out TCCR0,Temp
ldi Temp,0b00000001 ; разрешение прерываний переполнения таймера 0
out TIMSK,Temp
ldi Temp, low(RAMEND) ; инициализация стека
out SPL, Temp ; инициализация стека
ldi Temp, high(RAMEND) ; инициализация стека
out SPH, Temp ; инициализация стека
sei ; разрешить прерывания
ldi Temp,0b00000001 ; подаём напряение на определённые порты/ножеки, чтобы потом оно было нормальным, не тусклым
out PortB,Temp
cbi PORTB, PB0 ; погасить светодиод
clr Temp1
clr Temp2
clr Temp3
ldi LED,0
Begin: cli ; запретить прерывания
ldi Temp1, $02
ldi Temp,0
CPSE Temp, LED
rcall If_led_On
rcall If_led_Off
sei ; разрешить прерывания
rjmp Begin
;************_ ПОДПРОГРАММЫ _************
If_led_Off: cp Time1, Temp1
cpc Time2, Temp2
cpc Time3, Temp3
BREQ On ; если равны
BRCC On ; если Time больше установленного времени
rjmp Begin ; иначе / если время ещё не прошло
On: sbi PORTB, PB0 ; зажечь светодиод
ldi LED,1
sei ; разрешить прерывания
rjmp Begin
ret
If_led_On: cp Time1, Temp1
cpc Time2, Temp2
cpc Time3, Temp3
BREQ Off ; если равны
BRCC Off ; если Time больше установленного времени
rjmp Begin ; иначе / если время ещё не прошло
Off: cbi PORTB, PB0 ; погасить светодиод
ldi LED,0
sei ; разрешить прерывания
rjmp Begin
ret
;************_ ОБРАБОТЧИК ПРЕРЫВАНИЯ Timer0 overflow _************
TIMER0_OVF: ldi Temp,6
out TCNT0,Temp
ldi Temp,1
add SubSecondCount,Temp ; прибавить 1 к SubSecondCount
CPI SubSecondCount, 125
BRSH Plus_Second ; если получили >=125
TIMER0_OVF_Exit: reti ; иначе выход из обработчика
Plus_Second: ldi SubSecondCount,0
clr Temp1
clr Temp2
clr Temp3
mov Temp1, Time1
mov Temp2, Time2
mov Temp3, Time3
ldi Temp4, 1
add Temp1, Temp4
clr Temp4
adc Temp2, Temp4
adc Temp3, Temp4
mov Time1, Temp1
mov Time2, Temp2
mov Time3, Temp3
rjmp TIMER0_OVF_Exit ; к выходу из обработчика
Вернуться в Новичкам или основы основ роботостроения.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9