.INCLUDE "m328Pdef.inc"
.DSEG
.ORG 0x100
.DEF init = R18
.DEF led = R20
.DEF pwm = R19; me proporciona el tiempo que el pwm está con nivel bajo.
.ORG 0x130
vector_RAM: .BYTE 4
.CSEG
.EQU PWM_CERO = 110
.EQU PWM_IZQ = 106
.EQU PWM_DER = 114
.EQU DDR_LED = DDRB
.EQU PORT_LED = PORTB
.EQU PINES_LED = PINB
.EQU PIN_LED_ROJO = 0
.EQU DDR_PRUEBA = DDRD
.EQU PORT_PRUEBA = PORTD
.EQU PINES_PRUEBA = PIND
.EQU PIN_PRUEBA = 7
.EQU DDR_PWM0 = DDRD
.EQU PORT_PWM0 = PORTD
.EQU PINES_PWM0 = PIND
.EQU PIN_PWM0A = 6
.ORG 0x00
JMP MAIN
.ORG 0x0020
JMP INTERRUP_DESBORD_TIMER0
.ORG 0x0024
JMP INTERRUP_RECEP_UART_COMPLETA
.ORG 0x50
MAIN:
INICIA_PROGRAMA:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16, LOW(RAMEND)
OUT SPL,R16
;----CONFIGURACIÓN DE PUERTOS----
SBI DDR_LED,PIN_LED_ROJO; Pone como salida el pin del led rojo.
SBI DDR_PRUEBA,PIN_PRUEBA; Pone como salida el pin de prueba.
;....TIMER0....
LDI R16,99
OUT TCNT0,R16; acorto la cuenta para que el periodo del PWM sea de 20ms.
SBI DDR_PWM0, PIN_PWM0A; Activo como salida el pin del pwm.
CBI PORT_PWM0, PIN_PWM0A; Pongo en bajo el pin del PWM.
LDI pwm,PWM_DER
OUT OCR0A, pwm; comparador.
LDI R16,0b11000011
OUT TCCR0A, R16; modo rápido PWM, señal por pin OC0A de forma no invertida.
LDI R16,0b00000101;
OUT TCCR0B, R16; preescaler 1024: 0,128ms por pulso de clock.
LDI R16,0b00000001;
STS TIMSK0, R16; habilito interrupción por desbordamiento (cuando la cuenta llega a 255).
SEI
;----INICIO PROGRAMA----
INICIO_PROGRAMA:
SBI PORT_LED,PIN_LED_ROJO; enciendo el LED
SBI PORT_PRUEBA,PIN_PRUEBA; pongo en alto el pin de prueba.
;SBI PORT_PWM0,PIN_PWM0A; enciendo el LED
;JMP FIN
LDI pwm,PWM_DER
OUT OCR0A, pwm; comparador.
CALL DELAY_1s
CALL DELAY_1s
LDI pwm,PWM_IZQ
OUT OCR0A, pwm; comparador.
CALL DELAY_1s
CALL DELAY_1s
LDI pwm,PWM_CERO
OUT OCR0A, pwm; comparador.
CALL DELAY_1s
CALL DELAY_1s
FIN: JMP INICIO_PROGRAMA
;----FUNCIONES----
;----RETARDOS----
;Uso clock de 8MHz. Un pulso de clock equivale a 125nseg.
SDELAY: ;call=4pulso
NOP ;=1pulso
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET; =4pulsos TOTAL SDELAY: 16Pulsos=2us
DELAY_100us:
PUSH R17
LDI R17, 41
DR0:
CALL SDELAY
DEC R17
BRNE DR0
POP R17
RET
DELAY_10ms: ;
PUSH R17
LDI R17, 100
DR1:
CALL DELAY_100us
DEC R17
BRNE DR1
POP R17
RET
DELAY_1s: ; 1s en realidad
PUSH R17
LDI R17, 100
DR2:
CALL DELAY_10ms
DEC R17
BRNE DR2
POP R17
RET
;----INTERRUPCIONES----
INTERRUP_DESBORD_TIMER0:
LDI R16,99
OUT TCNT0,R16; acorto la cuenta para que el periodo del PWM sea de 20ms.
CBI PORT_PWM0, PIN_PWM0A; Pongo en bajo el pin del PWM.
RETI