Un compi del foro me pidio uno especial de 15 mm, que ademas no lleva niveles de bateria ni nada, el basico para una linterna que se le quedo colgada, ademas me pidio que llevara strobo, bueno pues voy a publicar el firmware de este driver, por si alguien se anima a reprogramar tambien el suyo para que veais que no es tan complicado esta todo comentadito:
'****************************************************************
'* Name : bailer.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 14/09/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define OSCCAL_1K ; CALIBRO EL OSCILADOR INTERNO
DEFINE ADC_BITS 8 ; DEFINO EL ADC A 8 BITS
ANSEL=%0010100 ;CONFIGURO ENTRADAS ANALOGICAS
ADCON0 = %1001000 ; CONFIGURO EL ADC
OPTION_REG=%00000000
WPU=%000000 ;HABILITO LAS PULL-UPS
CMcon=7; DESHABILITO COMPARADORES (AHORRA BATERIA)
VRCON=0 ; DESHABILITO REFERENCIAS DE TENSIÓN
gpio=0; APAGO TODO EL PUERTO
trisio = %0000110 ; CONFIGURO PUERTO GPIO.3 SALIDA
LED VAR gpio.5 ; DEFINO SALIDA DEL LED
DIM VAR BYTE ; ESTABLEZCO VARIABLE DIM (MODO ALMACENADO)
DIM1 VAR BYTE; ESTABLEZCO VARIABLE DIM1 (MODO ACTUAL)
tiempo var word ; ESTABLEZCO VARIABLE TIEMPO (TEMPORIZACIÓN MEMORIA)
estado var bit ; VARIBALE AUXILIAR
tiempo=0; resteteo el tiempo
estado = 0 ; RESETEO VARIABLE AUXILIAR
read 5,dim ; LEO DE EEPROM EL ESTADO ANTERIO
DIM1=DIM; ESTABLEZCO MODO ACTUAL
if dim = 5 then ; CONDICIONAL PARA DEFINIR EL ESTADO SIGUIENTE PARA EL CASO DE DESCONEXIÓN DE ALIMENTAICIÓN
dim=1
else
dim=dim+1
endif
write 5,dim ;ESCRIBO EN LA EEPROM EL ESTADO SIGUIENTE
inicio:
IF DIM1 = 1 Then LUZ100 ; RUTINA DE COMPROBACIÓN DEL MODO DEL DRIVER
IF DIM1 = 2 then luz50
if dim1 = 3 then luz10
if dim1 = 4 then luz1
if dim1 = 5 then strobo
IF DIM1 > 5 THEN LUZ12; SI DIERA ERROR LA ESCRITURA EN EEPROM
GOTO INICIO
luz100: ; RUTINA DIMMER 100 %
LED = 0 ; ENCIENDO LED
gosub check ; LLAMO A LA RUTINA DE COMPROBACIÓN DE TIEMPOS DE MEMORIA
pauseus 10000; ESPERO 100 uS PARA QUE LOS TIEMPOS SEAN EQUIVALENTES.
goto luz100
luz50: ; RUTINA DIMMER 55 %
LED = 0 ; ENCIENDO LED
pauseus 5500 ; ESPERO 55 uS
LED = 1 ; APAGO LED
pauseus 4500 ; ESPERO 45 uS
gosub check ;+ LLAMO A LA RUTINA DE COMPROBACIÓN DE TIEMPOS DE MEMORIA-
goto luz50:
luz10: ; RUTINA DIMMER 20 %
LED = 0
pauseus 2000
LED = 1
pauseus 8000
gosub check
goto luz10
luz1: ; RUTINA DIMMER 1 %
LED = 0
pauseUS 500
LED = 1
pauseUS 9500
gosub check
goto luz1
strobo: ;RUTINA STROBO NO LLAMO A CHECK PARA QUE NO MEMORICE.
Led = 0
pause 100
led =1
pause 100
led= 0
pause 100
led=1
pause 100
led=0
pause 100
led=1
PWM
pause 500
goto strobo
LUZ12: ;RUTINA DE ERROR DE ESCRITURA EN EEPROM.
LED =1
PAUSE 500
LED =0
PAUSE 500
LED =1
DIM=1
GOTO INICIO
check: ;RUTINA COMPROBACIÓN DE TIEMPOS DE MEMORIA
if estado=0 then ;COMPRUEBO LA VARIABLE AUXILIAR ESTADO PARA INCREMENTAR EL TIEMPO.
tiempo=tiempo+1 ; INCREMENTO CONTADOR DE TIEMPO
else
return
endif
if tiempo=10 then ; COMPRUEBO SI SE HA AGOTADO EL TIEMPO
estado=1 ; MODIFICO ESTADO PARA NO VOLVER A LLAMAR A ESTA RUTINA
IF DIM=1 THEN ;MEMORIA CAMBIO AL ESTADO ANTERIOR
DIM = 5
ELSE
dim=dim-1 ;
ENDIF
asm ;RUTINA DE ESCRITURA EN EEPROM EN ENSAMBLADOR QUE ES MAS RAPIDA
BSF GPIO,4 ;CONTROL ENCIENDO EL LED ROJO
bsf STATUS,RP0 ; CAMBIO DE AL BANCO DE REGISTRO 1
movlw 5 ;DIRECCIÓN DE MEMORIA QUE QUIERO ESCRIBIR
movwf EEADR
movf _DIM,W ;DATO QUE QUIERO ESCRIBIR
movwf EEDATA
bsf EECON1,WREN ;HABILITO ESCRITURA
movlw 85 ;INICIO RUTINA DE AUTORIZACIÓN DE ESCRITURA EN EEPROM
movwf EECON2
MOVLW 170
movwf EECON2
bsf EECON1,WR ; ORDENO LA ESCRITURA
loop:
btfsc EECON1,WR ;RUTINA DE FINALIZACIÓN DE ESCRITURA EN EEPROM
GOTO loop
bcf EECON1,WREN ; DESHABILITO ESCRITURA
bcf STATUS,RP0 ; CABIO AL BANCO DE RESGISTRO 0
endasm
endif
return
GOTO inicio: