Al final con este codigo parece que va bien, deberia arrancar sin problemas, si la corriente de la linea no nos falla mucho, recemos para que los ingenieros y tecnicos de la compañia electrica no se hayan ido ayer de copas.
Este tampoco es el definitivo, se puede hacer mejor, digo mas lo haremos mejor, o al menos lo intentaremos.
LIST P = 12f675
INCLUDE "P12f675.INC"
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;**CONSTANTES**
VALOR1 EQU .164 ;VALORES PARA EL RETARDO
VALOR2 EQU .1
;**VARIABLES**
REG1 EQU H'20' ;VARIABLES LOCALES DE LA SUBRUTINA DE RETARDO
REG2 EQU H'21'
REG3 EQU H'27'
REG4 EQU H'28'
AUX EQU H'22'
SEMI_PERIODOS EQU H'23'
PASOACTUAL EQU H'24'
CONTADOR EQU H'25'
COPIA_CONTADOR EQU H'26'
#DEFINE BANCO0 BCF STATUS,RP0
#DEFINE BANCO1 BSF STATUS,RP0
#DEFINE CRUCE GPIO,2
#DEFINE TRIACR GPIO,1
#DEFINE TRIACS GPIO,0
#DEFINE TRIACT GPIO,4
;**********************************VECTOR RESET*************************************
ORG 0x00
goto INIC
INIC BANCO1
MOVLW B'00000100'
MOVWF TRISIO
CLRF ANSEL
call 3FFh ;Get the cal value
movwf OSCCAL ;Calibrate
BANCO0
MOVLW B'00000111'
MOVWF CMCON
CLRF GPIO
INICIO
MOVLW .100
MOVWF SEMI_PERIODOS
LEER_CRUCE1 BCF TRIACR
BCF TRIACS
BCF TRIACT
BTFSC CRUCE ;DETECTA FLANCO POSITIVO
GOTO LEER_CRUCE1
ESCERO BTFSS CRUCE
GOTO ESCERO
CALL DEMORA_2MS
CALL DEMORA_2MS
CALL DEMORA_2MS
CALL DEMORA_2MS
CICLO_1 ;para que venga aqui y lo repita 1seg
BSF TRIACR
CALL DEMORA.33
BCF TRIACR
CALL DEMORA_3MS
BSF TRIACT
CALL DEMORA.33
BCF TRIACT
CALL DEMORA_3MS
BSF TRIACS
CALL DEMORA.33
BCF TRIACS
CALL DEMORA_3MS
DECFSZ SEMI_PERIODOS
GOTO CICLO_1
MOVLW .100
MOVWF SEMI_PERIODOS
LEER_CRUCE2 BCF TRIACR
BCF TRIACS
BCF TRIACT
BTFSC CRUCE ;DETECTA FLANCO POSITIVO
GOTO LEER_CRUCE2
ESCERO2 BTFSS CRUCE
GOTO ESCERO2
CALL DEMORA_2MS
CALL DEMORA_2MS
CALL DEMORA_2MS
CICLO_2
BSF TRIACR
CALL DEMORA.33
BCF TRIACR
CALL DEMORA_3MS
BSF TRIACT
CALL DEMORA.33
BCF TRIACT
CALL DEMORA_3MS
BSF TRIACS
CALL DEMORA.33
BCF TRIACS
CALL DEMORA_3MS
DECFSZ SEMI_PERIODOS
GOTO CICLO_2
MOVLW .100
MOVWF SEMI_PERIODOS
LEER_CRUCE3 BCF TRIACR
BCF TRIACS
BCF TRIACT
BTFSC CRUCE ;DETECTA FLANCO POSITIVO
GOTO LEER_CRUCE3
ESCERO3 BTFSS CRUCE
GOTO ESCERO3
CALL DEMORA_2MS
CALL DEMORA_2MS
CICLO_3
BSF TRIACR
CALL DEMORA.33
BCF TRIACR
CALL DEMORA_3MS
BSF TRIACT
CALL DEMORA.33
BCF TRIACT
CALL DEMORA_3MS
BSF TRIACS
CALL DEMORA.33
BCF TRIACS
CALL DEMORA_3MS
DECFSZ SEMI_PERIODOS
GOTO CICLO_3
MOVLW .100
MOVWF SEMI_PERIODOS
LEER_CRUCE4 BCF TRIACR
BCF TRIACS
BCF TRIACT
BTFSC CRUCE ;DETECTA FLANCO POSITIVO
GOTO LEER_CRUCE4
ESCERO4 BTFSS CRUCE
GOTO ESCERO4
CALL DEMORA_2MS
CICLO_4
BSF TRIACR
CALL DEMORA.33
BCF TRIACR
CALL DEMORA_3MS
BSF TRIACT
CALL DEMORA.33
BCF TRIACT
CALL DEMORA_3MS
BSF TRIACS
CALL DEMORA.33
BCF TRIACS
CALL DEMORA_3MS
DECFSZ SEMI_PERIODOS
GOTO CICLO_4
ARRANCO_MAXIMA MOVLW H'13'
MOVWF GPIO
GOTO ARRANCO_MAXIMA
RETURN
DEMORA_2MS movlw .249 ; 1 set numero de repeticion
movwf REG1 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3
decfsz REG1, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
DEMORA_3MS
movlw .4 ; 1 set numero de repeticion (B)
movwf REG2 ; 1 |
Loop1 movlw .186 ; 1 set numero de repeticion (A)
movwf REG3 ; 1 |
Loop2 clrwdt ; 1 clear watchdog
decfsz REG3, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto Loop2 ; 2 no, loop
decfsz REG2, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto Loop1 ; 2 no, loop
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
DEMORA.33 movlw .81 ; 1 set numero de repeticion
movwf REG4 ; 1 |
Loop0 clrwdt ; 1 clear watchdog
decfsz REG4, 1 ; 1 + (1) es el tiempo 0 ?
goto Loop0 ; 2 no, loop
clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
Mira esta es la demora que pones de 3ms:
DEMORA_3MS movlw .4 ; 1 set numero de repeticion (B)
movwf REG2 ; 1 |
Loop1 movlw .186 ; 1 set numero de repeticion (A)
movwf REG3 ; 1 |
Loop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz REG3, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto Loop2 ; 2 no, loop
decfsz REG2, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto Loop1 ; 2 no, loop
return ; 2+2 Fin.
Probaba y no me salian los tiempos hasta que la mire y vi que me daba 3.7 ms, en cada semiciclo se hacen 3 y eses 0.7ms de mas se convierten en 2.1ms de 10 que tiene el semiciclo, hice otra en PDel y me salio esta:
DEMORA_3MS
movlw .4 ; 1 set numero de repeticion (B)
movwf REG2 ; 1 |
Loop1 movlw .186 ; 1 set numero de repeticion (A)
movwf REG3 ; 1 |
Loop2 clrwdt ; 1 clear watchdog
decfsz REG3, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto Loop2 ; 2 no, loop
decfsz REG2, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto Loop1 ; 2 no, loop
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
No te preocupes estoy acostumbrado a sufrir con el MPLAB
El caso es que aqui los tiempos son muy importantes, ya que controlamos un paso por 0 y despues por tiempos controlamos un seg. entero, si hay una pequeña desviacion en cada demora al final al ser 100 ciclos se convierte en una desviacion grande.
Veo que cuando acaba el arranque alimentas el motor con el arrancador, verdad? esto en los arrancadores comerciales no se suele hacer, sino que se le pone un contactor de baypass, y se ponen los triacs en no conduccion y se activa el contactor. Los triac consumen potencia porque tienen caida de tension entre anodos y el contactor no (es despreciable la que cae), si lo alimentas con el arrancador tienes que poner triacs que vayan muy sobrados, sobre todo si el motor va a trabajar mucho tiempo, y con contactores de baypass puedes arrancar varios motores con el mismo arrancador, se llama arranque en cascada porque van arrancando uno detras de otro.Bueno esto ya es decision tuya.