LIST P=16F877
__config h'3F39' ;configuración de los fuses del uC
;---------------------------------------------------------------------
;ETIQUETAS
;---------------------------------------------------------------------
PDel0 EQU 0x20 ;registro del retardo
PDel1 EQU 0x21 ;registro del retardo
PDel2 EQU 0x22 ;registro del retardo
Dato EQU 0x23 ;dato del PWM alto
Dato2 EQU 0x24 ;dato del PWM bajo
ESTADO EQU 0x03 ;registro específico
TRISA EQU 0x05 ;registro específico
TRISB EQU 0x06 ;registro específico
TRISC EQU 0x07
;--------------------------------------------------------------------
;PROGRAMA
;--------------------------------------------------------------------
ORG 0 ;PARA COMENZAR EN LA POSICIÓN CERO DE LA MEMORIA
bsf ESTADO,5 ;PASA AL BANCO 1
movlw 0x00 ;LLEVA 'FF' AL ACUMULADOR
movwf TRISB ;PROGRAMA LA PUERTA B EN salida
movwf TRISA ;programa la puerta C en salida
movlw 0xC7 ;LLEVA EL DATO 'C7' AL ACUMULADOR
movwf TRISC ;PROGRAMA LA PUERTA C en entrada
bcf ESTADO,5
clrf TRISB ;BORRA LA PUERTA B
clrf CCP
Leer movf TRISC,0 ;lee el PuertoC
movwf Dato ;guarda el resultado en dato
btfsc Dato,6
bsf Dato,3
btfsc Dato,7
bsf Dato,4
bcf Dato,6
bcf Dato,7
movf Dato,0 ;guarda el contenido de dato en el acumulador
addlw 0x03 ;suma 3, ya que el ángulo 0 tiene un tiempo en alto de 0,3ms
movwf Dato
sublw .200 ;resta a 200 el resultado de la suma anterior
movwf Dato2 ;para calcular el tiempo en bajo
decf Dato2,1 ;porque el primer ciclo de 100us se hace a parte para compensar
PWM bsf TRISB, 3
movf Dato,0
call Ret100
bcf TRISB,3
movf Dato2,0
call Ret100
movlw 0x1B ;retardo para conseguir el periodo de 20ms
movwf PDel0 ;en el bucle infinito "Leer"
ret decfsz PDel0,1
goto ret
movwf PDel0
movwf PDel0
goto Leer
;-------------------------------------------------------------
; Ret 100us
;-------------------------------------------------------------
Ret100 movwf PDel1
movlw 0x1E ; set numero de repeticion
movwf PDel0
PLoop0 decfsz PDel0, 1 ; es el tiempo 0?
goto PLoop0 ; no, loop
decfsz PDel1, 1
goto loop
return
loop movlw 0x20 ; set numero de repetición
movwf PDel0
decfsz PDel0, 1 ; es el tiempo 0?
goto PLoop0 ; no, loop
End
movf TRISC,0 ;lee el PuertoC
movwf Dato ;guarda el resultado en dato
btfsc Dato,6
bsf Dato,3
btfsc Dato,7
bsf Dato,4
bcf Dato,6
bcf Dato,7
movf Dato,0 ;guarda el contenido de dato en el acumulador
loop movlw 0x20 ; set numero de repetición
movwf PDel0
decfsz PDel0, 1 ; es el tiempo 0?
goto PLoop0 ; no, loop
LIST P=16F877
__config h'3F39'
;---------------------------------------------------------------------
;ETIQUETAS
;---------------------------------------------------------------------
PDel0 EQU 0x20 ;registro del retardo
PDel1 EQU 0x21 ;registro del retardo
Repet EQU 0x22 ;nº de repeticiones de cada señal
Dato EQU 0x23 ;dato del PWM alto
Dato2 EQU 0x24 ;dato del PWM bajo
ESTADO EQU 0x03 ;REGISTRO ESPECÍFICO
TRISA EQU 0x05 ;REGISTRO ESPECÍFICO
TRISB EQU 0x06 ;REGISTRO ESPECÍFICO
TRISC EQU 0x07
TRISD EQU 0x08
;--------------------------------------------------------------------
;PROGRAMA
;--------------------------------------------------------------------
ORG 0 ;PARA COMENZAR EN LA POSICIÓN CERO DE LA MEMORIA
bsf ESTADO,5 ;PASA AL BANCO 1
movlw 0x00 ;LLEVA 'FF' AL ACUMULADOR
movwf TRISB ;PROGRAMA LA PUERTA B EN salida
movwf TRISA ;programa la puerta C en salida
movwf TRISC ;PROGRAMA LA PUERTA C en entrada
movwf TRISD
bcf ESTADO,5
clrf TRISB ;BORRA LA PUERTA B
clrf TRISD
Ciclo movlw 0x30 ;tiempo 1 seg
movwf Repet
Repe movlw 0xFF
movwf TRISB
movwf TRISD
movlw .10
call Ret100
movlw b'01010101'
movwf TRISB
movwf TRISD
movlw .8
call Ret100
clrf TRISB
clrf TRISD
movlw .181
call Ret100
movlw 0x1F ;retardo para conseguir el periodo de 20ms
movwf PDel0 ;en el bucle infinito "Leer"
ret decfsz PDel0,1
goto ret
movwf PDel0
decfsz Repet
goto Repe
movlw 0xFF ;retardo de 1us para compensar
movlw 0x30 ;tiempo 1 seg
movwf Repet
Repe2 movlw 0xFF
movwf TRISB
movwf TRISD
movlw .10
call Ret100
movlw b'10101010'
movwf TRISB
movwf TRISD
movlw .8
call Ret100
clrf TRISB
clrf TRISD
movlw .181
call Ret100
movlw 0x1F ;retardo para conseguir el periodo de 20ms
movwf PDel0 ;en el bucle infinito "Leer"
ret2 decfsz PDel0,1
goto ret2
movwf PDel0
decfsz Repet
goto Repe2
goto Ciclo
;-------------------------------------------------------------
; Ret 100us
;-------------------------------------------------------------
Ret100 movwf PDel1
movlw 0x1E ; set numero de repeticion
movwf PDel0
PLoop0 decfsz PDel0, 1 ; es el tiempo 0?
goto PLoop0 ; no, loop
decfsz PDel1, 1
goto loop
return
loop movlw 0x20 ; set numero de repeticion
movwf PDel0
decfsz PDel0, 1 ; es el tiempo 0?
goto PLoop0 ; no, loop
End
esamuelm, que lindo 'bicho' !!! te felicitogracias amigo maunix :P bueno el problema del peso ya lo solucione, la única solución q encontré es ya no aumentarle y participar en exhibición :? xq luego de aumentarle peso estoy hablando de unos 2.4Kg le genera problemas en el giro mejor lo dejo ahí y hago otro 8)
esamuelm, que lindo 'bicho' !!! te felicito