Autor Tema: Intermitentes moto.  (Leído 13108 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Intermitentes moto.
« en: 25 de Noviembre de 2010, 20:45:22 »
Ante todo presentarme, saludaros y agradeceros toda la ayuda que me podais brindar.

Estoy intentando sustituir el módulo de intermitencias de mi moto para poder eliminar las bombillas incandescentes e instalar leds. Si lo hago sin sustituirlo no parpadean al no detectar consumo y suponer que alguna se ha fundido.

Funcionamiento actual del módulo de intermitencias a reproducir:
-Dispongo de un pulsador en la mano izquierda y otro en la derecha que al pulsarlos envía 12v. al módulo de intermitencias.
- Al pulsar cualquiera de ellos parpadean los indicadores del lado correspondiente 9 veces y se para. (En realidad dura mas o menos según la velocidad, pero con que lo haga 9 o 10 veces me sirve).
- Si estando parpadeando vuelvo a pulsar el del mismo lado, deja de parpadear. Y si pulso el del lado contrario se pone a parpadear el de ese lado.
- Si pulso ambos botones durante 1 segundo (o al mismo tiempo) parpadean los 4 indicadores sin fin (estado emergencia o avería) hasta que pulso los dos de nuevo.

He conseguido con un 16F84A que al pulsar un botón u otro me realice el ciclo de 9 destellos y se apague, pero no consigo que al volver a pulsar mientras parpadea se detenga, ni tampoco que funcionen los 4 a la vez.

A ver si consigo pasaros lo que he hecho:
Código: ASM
  1. __CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC   
  2.                
  3.         LIST    P=16F84A
  4.         INCLUDE <P16F84A.INC>
  5.        
  6.         CBLOCK 0x0C
  7.         ENDC
  8.        
  9. #DEFINE LED_I   PORTB,3
  10. #DEFINE LED_D   PORTB,4        
  11. #DEFINE PUL_I PORTA,2
  12. #DEFINE PUL_D PORTA,1
  13.  
  14. ;ZONA CODIGOS************
  15.  
  16.         ORG     0
  17. Inicio 
  18.         bsf     STATUS,RP0      ;Acceso Banco 1.
  19.         bcf     LED_I           ;Línea Led RB3 configurada como salida.
  20.         bcf     LED_D           ;Línea Led RB4 configurada como salida.
  21.         bsf     PUL_I           ;Lìnea PUL RA2 configurada como entrada.
  22.         bsf     PUL_D           ;Lìnea PUL RA1 configurada como entrada.
  23.         bcf     STATUS,RP0      ;Acceso Banco 0.
  24.  
  25.        
  26.         movlw   0x09   
  27.         movwf   R_ContC         ;Cargamos el contador con el nº de blinks.    
  28.         bcf             LED_I           ;Apagamos los leds.
  29.         bcf             LED_D
  30.  
  31.        
  32. Check_Pul                                       ;Chequeo pulsadores.
  33.        
  34.         btfsc   PUL_I                   ;Pulsador PUL_I presionado salta. Pulsador=1?
  35.         call    Espera_I                ;No. Lee PUL_D.
  36.         btfsc   PUL_D
  37.         call    Espera_D                ;No. Vuelve a leerlos..
  38.         goto    Check_Pul
  39.        
  40. Espera_I       
  41.         call    Retardo_255ms   ;Retardo para que ralentice
  42.         call    Retardo_255ms   ;arranque parpadeo.
  43.         bcf             PUL_I                  
  44.         call    Principal_I             ;Va al ciclo de parpadeo.
  45.        
  46. Espera_D       
  47.         call    Retardo_255ms   ;Retardo para que ralentice
  48.         call    Retardo_255ms   ;arranque parpadeo.
  49.         bcf             PUL_D
  50.         call    Principal_D             ;Va al ciclo de parpadeo.      
  51.        
  52.                        
  53. Principal_I    
  54.        
  55.         bsf             LED_I                   ;Enciende el led
  56.         call    Retardo_50ms    ;durante este tiempo.
  57.         bcf             LED_I                   ;Lo apaga durante la suma de
  58.         call    Retardo_255ms   ;este retardo
  59.         call    Retardo_255ms   ;éste,
  60.         call    Retardo_255ms   ;éste,
  61.         call    Retardo_255ms   ;éste,
  62.         call    Retardo_200ms   ;y éste.      
  63.         decfsz  R_ContC,F               ;Cuenta el nº de blinks.
  64.         goto    Principal_I             ;Se repite 9 veces (instrucción 23).
  65.         goto    Inicio
  66.        
  67. Principal_D    
  68.        
  69.         bsf             LED_D                   ;Enciende el led
  70.         call    Retardo_50ms    ;durante este tiempo.
  71.         bcf             LED_D                   ;Lo apaga durante la suma de
  72.         call    Retardo_255ms   ;este retardo
  73.         call    Retardo_255ms   ;éste,
  74.         call    Retardo_255ms   ;éste,
  75.         call    Retardo_255ms   ;éste,
  76.         call    Retardo_200ms   ;y éste.      
  77.         decfsz  R_ContC,F               ;Cuenta el nº de blinks.
  78.         goto    Principal_D             ;Se repite 9 veces (instrucción 27).
  79.         goto    Inicio 
  80.        
  81.        
  82. ;Subrutinas Retardo_200ms, Retardo_100ms y Retardo_1ms*******  
  83.  
  84.         CBLOCK
  85.         R_ContA                 ;Contadores para los retardos
  86.         R_ContB
  87.         R_ContC
  88.         ENDC
  89.        
  90. Retardo_255ms
  91.         movlw   d'255'
  92.         goto    Retardos_ms    
  93. Retardo_200ms
  94.         movlw   d'200'
  95.         goto    Retardos_ms
  96. Retardo_100ms
  97.         movlw   d'100'
  98.         goto    Retardos_ms
  99. Retardo_20ms
  100.         movlw   d'20'
  101.         goto    Retardos_ms
  102. Retardo_50ms
  103.         movlw   d'50'
  104.         goto    Retardos_ms            
  105. Retardo_1ms
  106.         movlw   d'1'
  107. Retardos_ms
  108.         movwf   R_ContB
  109. R1ms_BucleExterno
  110.         movlw   d'249'
  111.         movwf   R_ContA
  112. R1ms_BucleInterno
  113.         nop
  114.         decfsz  R_ContA,F
  115.         goto    R1ms_BucleInterno
  116.         decfsz  R_ContB,F
  117.         goto    R1ms_BucleExterno
  118.         return
  119.                
  120.        
  121.         END

Vaya por delante que es la primera vez que intento programar un microcontrolador y llevo semanas leyendo y probando.
Y esto que debe ser muy simple, para mí es un mundo. O igual lo que pretendo es imposible.... :(

De todas formas todos los comentarios serán bienvenido, pero tengan en cuenta que estoy bastante verde  :oops:

Saludos


Edito: intenté (para que dejara de destellar si se pulsa un botón)colar un call después de la línea 62 y 76 (antes del decfsz) para que fuera a una subrutina y me pusiera el contador de parapadeos a 1 de forma que al retornar finalizara la cuenta de parpadeos y volviera a esperar alguna pulsación. Pero no funciona: cuando le doy al botón para que empiece a parpadear, destella una vez y se para.

Código: ASM
  1. btfss   PUL_I           ;Chequeo si se ha vuelto a pulsar.
  2.         call    ReseteoContC
  3.         decfsz  R_ContC,F               ;Cuenta el nº de blinks.
  4.         goto    Principal_I             ;Se repite 9 veces.
  5.         goto    Inicio
  6.        
  7. ReseteoContC
  8.         clrf    R_ContC         ;Borro contador de blinks.
  9.         movlw   0x01            ;Coloco un 1 en
  10.         movwf   R_ContC         ;el contador.
  11.         return
« Última modificación: 26 de Noviembre de 2010, 10:13:25 por ohsielos »

Desconectado juan47

  • PIC10
  • *
  • Mensajes: 27
Re: Intermitentes moto.
« Respuesta #1 en: 28 de Noviembre de 2010, 17:24:26 »
Hola ohsielos
 Soy novato en estos quehaceres pero veo lo siguiente y es pero que algun amable compañero pueda ayudarte mejor que yo
 Lo primero es comentarte que en las etiquetas Principal_I y Principal_D al final pones un goto inicio
Volviendo de esta manera a configurar de nuevo la pic
 Tambien decir, si no estoy equivocado, es el hecho que si tienes un intermitente trabajando si pulsas para que cambie o se pare
este pulsador no sera reconocido hasta que no vuelva el programa a la etiqueta Check_Pul
Por ello yo te recomiendo que efectues el reconocimiento de los pulsadores atraves de la interrupcion RB4-RB7
para asi en cualquier momento que quieras cambiar el estado de los leds sea mas rapido

  Un saludo

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Intermitentes moto.
« Respuesta #2 en: 29 de Noviembre de 2010, 14:48:05 »
Te digo como lo haria yo.
Primero un bucle de espera.


ESPERA

btfss   PUL_I   
goto    $+3
call      ANTIRREBOTES
goto     MAIN
btfss    PUL_D
goto     ESPERA
call      ANTIRREBOTES
goto    MAIN

Con esta rutina estara en espera hasta que se pulse uno de los lulsadores o los dos, si se pulsa alguno llama a antirrebotes, que es una temporizacion de 20ms para que pasen los rebotes de la pulsacion, y a continuacion va al bucle MAIN, ahi se mirara que pulsador se activo y lo que hay que hacer.

TABLA          ;esta tabla nos dira que hay que hacer
addwf   PCL,1
goto     ESPERA  ; aqui nunc vendra, pero por si acaso....
goto     DERECHA
goto     IZQUIERDA
goto     LOS_DOS


MAIN

btfss   PUL_D    ; miramos si en PUL_D hay un 1 o un 0
bcf     REG_1,0  ; y escribimos en un registro lo que haya
btfsc   PUL_D    ; en el bit 0
bsf      REG_1,0
btfss   PUL_I     ; hacemos lo mismo con el otro pulsador
bcf      REG_1,1  ;este lo escribimos en el bit 1
btfsc   PUL_I
bsf      REG_1,1  ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf  REG_1,0    ; lo movemos a W
call    TABLA
goto   ESPERA


Ahora esta el tema de que pare cuando esta activado, creo que la mejor opcion es ponerles unos "FLAGS" por software, unos bits de un registro al que le llamaremos FLAGS, el bit 0 sera para DERECHA  el bit 1 para IZQUIERDA, y el bit 2 para los_dos cuando el MAIN nos envie a estas rutinas cheqeuamos ese flag, si esta a 0 activara intermitente y lo pondremos a 1, asi la proxima vez estara a 1 entonces tocara apagar y ponerlo a 0 para la proxima

IZQUIERDA

btfss  FLAG,0
goto   ACTIVAR_I
bcf    FLAG,0
bcf    LED_I
return         ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1


ACTIVAR_I
bsf   FLAG_I
btfsc  PUL_I
goto   ESPERA  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto  ESPERA
bsf   LED_I    ; enciende intermitente izquierda
call  DEMORA   ;esta un tiempo encendido
bcf   LED_I    ; apaga
call  DEMORA
incf  CONTADOR,1  ; para numero de veces que encendera
movlw .10         ; le pongo 10 pero pueden ser las que tu quieras
subwf  CONTADOR,0
btfss  STATUS,Z  ; van 10 veces?
goto  ACTIVAR_I    ; no, vuelve a repetir secuencia
return           ; ya van 10 va a main

Para derecha es igual cambiando los nombres de led, flag...

para los dos seria parecido.

LOS_DOS
btfss  FLAG,2  ; flag para saber si apagamos o encendemos
goto   ACTIVAR_LOSDOS
CLRF   PORTB
bcf    FLAG,2  ;apagamos intermitentes y borramos flag, ya que estaba a 1


ACTIVAR_LOSDOS
bsf   FLAG,2   ; el flag estaba a 0 lo activamos
btfsc  PUL_I
goto   ESPERA  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto  ESPERA
movlw  0x18
movwf  PORTB  ; ponemos a 1 bits 3 y 4 del puerto B
call   DEMORA  ; tiempo encendidos
clrf   PORTB  ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
return




ANTIRREBOTES ; retardo 20ms para antirrebote
   movlw     .21       ; 1 set numero de repeticion  (B)
        movwf     PDel2     ; 1 |
PLoop3  movlw     .237      ; 1 set numero de repeticion  (A)
        movwf     PDel3     ; 1 |
PLoop4  clrwdt              ; 1 clear watchdog
        decfsz    PDel3, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel2,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL8  goto PDelL9         ; 2 ciclos delay
PDelL9  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.


DEMORA ; retardo de 500ms para intermitencia
   movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.






Bueno esta hecho sobre la marcha y sin depurar,ni lo pase por el MPLAB SI AL COMPILAR TIRA ERRORES NO TE ASUSTES JEJEJE echale un ojo y si quieres acabalo y miramos los posibles errores que pueda tener. El tiempo de encendido y apagado lo puse en 500ms, pero se puede poner como se quiera sin problema. Si tienes problemas postealos por aqui.
   


Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Re: Intermitentes moto.
« Respuesta #3 en: 30 de Noviembre de 2010, 11:26:23 »
Muchas gracias  Juan y Tapi por contestar. Estuve investigando en pbasic a ve si me aclaraba mejor y pude hacerlo funcionar bastante bien. La cancelación de la intermitencia y el arranque de los cuatro a la vez no está muy allá porque hay que darle al pulsador en el momento justo, o mantenerlo pulsado un tiempo determinado, pero me podría valer.

Voy a intentar el programa que me ha pasado Tapi (menuda currada compañero, muchas gracias) intentaré terminarlo a ver si me va mejor.

Juan, en lo de las interrupciones estoy verde como una coliflor.

En cuanto pruebe algo, les cuento.

De nuevo, les reitero mi agradecimiento.

Saludos

Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Re: Intermitentes moto.
« Respuesta #4 en: 30 de Noviembre de 2010, 16:00:49 »
Tapi8, he intentado completar el programa que me has pasado.
Lo primero que he hecho ha sido activar el wdt en la primera línea porque lo tenía desactivado.
Después te he cambiado la línea:
ACTIVAR_I
bsf   FLAG_I
por:
ACTIVAR_I
bsf   FLAG,0

(no me cuadraba que existiera un FLAG_I) .

Le añadí las líneas correspondientes para las etiquetas DERECHA y ACTIVAR_D

Al realizar el quickbuid con el mplab me tiraba errores al no encontrar definidos: REG_1, FLAG, CONTADOR, PDel0, PDel1, PDel2 y PDel3. Ni el END.
Los coloqué (como Dios me dió a entender  :oops:) entre un CBLOCK y ENDC. Y el END al final.

El quickbuild ya no da error  :), pero no funciona nada, todo apagado  :(.

Si eres tan amable de echarle un vistazo, te lo agradeceré, porque con las tablas, ese signo goto '$+3', el watchdog ladrando y esos bucles me has dejado descolocado.

Te adjunto el programa:

Código: ASM
  1. __CONFIG _CP_OFF& _WDT_ON&_PWRTE_ON&_XT_OSC    
  2.                
  3.         LIST    P=16F84A
  4.         INCLUDE <P16F84A.INC>
  5.        
  6.         CBLOCK 0x0C
  7.         CONTADOR
  8.         PDel0
  9.         PDel1
  10.         PDel2
  11.         PDel3
  12.         ENDC
  13.        
  14. REG_1   equ     0x01
  15. FLAG    equ     0x02   
  16.  
  17.        
  18. #DEFINE LED_I PORTB,3
  19. #DEFINE LED_D PORTB,4
  20. #DEFINE PUL_I PORTA,2
  21. #DEFINE PUL_D PORTA,1
  22.  
  23. ;ZONA CODIGOS************
  24.         ORG     0
  25.        
  26. ESPERA
  27.  
  28.         btfss   PUL_I  
  29.         goto    $+3
  30.         call    ANTIRREBOTES
  31.         goto    MAIN
  32.         btfss   PUL_D
  33.         goto    ESPERA
  34.         call    ANTIRREBOTES
  35.         goto    MAIN   
  36.  
  37. TABLA                                   ;esta tabla nos dirÁ que hay que hacer
  38.         addwf   PCL,1
  39.         goto    ESPERA          ; aqui nunca vendra, pero por si acaso....
  40.         goto    DERECHA
  41.         goto    IZQUIERDA
  42.         goto    LOS_DOS
  43.  
  44. MAIN
  45.  
  46.         btfss   PUL_D           ; miramos si en PUL_D hay un 1 o un 0
  47.         bcf     REG_1,0         ; y escribimos en un registro lo que haya
  48.         btfsc   PUL_D           ; en el bit 0
  49.         bsf             REG_1,0
  50.         btfss   PUL_I           ; hacemos lo mismo con el otro pulsador
  51.         bcf             REG_1,1         ; este lo escribimos en el bit 1
  52.         btfsc   PUL_I
  53.         bsf             REG_1,1         ; aquí ya tenemos los dos pulsadores leidos
  54.                                                 ; y anotados en un registro
  55.         movf    REG_1,0         ; lo movemos a W
  56.         call    TABLA
  57.         goto    ESPERA
  58.  
  59. IZQUIERDA
  60.  
  61.         btfss   FLAG,0
  62.         goto    ACTIVAR_I
  63.         bcf             FLAG,0
  64.         bcf             LED_I
  65.         return                  ; apaga flag e intermitente y vuelve a MAIN,
  66.                                                 ; FLAG estaba a 1
  67.  
  68.  
  69. ACTIVAR_I
  70.         bsf             FLAG,0
  71.         btfsc   PUL_I
  72.         goto    ESPERA          ; si mientras esta ejecutando una secuencia
  73.                                                 ; se pulsa un boton empieza de nuevo
  74.         btfsc   PUL_D
  75.         goto    ESPERA
  76.         bsf             LED_I           ; enciende intermitente izquierda
  77.         call    DEMORA          ; está un tiempo encendido
  78.         bcf             LED_I           ; apaga
  79.         call    DEMORA
  80.         incf    CONTADOR,1  ; para número de veces que encenderá
  81.         movlw   .10         ; le pongo 10 pero pueden ser las que tu quieras
  82.         subwf   CONTADOR,0
  83.         btfss   STATUS,Z        ; van 10 veces?
  84.         goto    ACTIVAR_I       ; no, vuelve a repetir secuencia
  85.         return                  ; ya van 10 va a main
  86.  
  87. DERECHA
  88.  
  89.         btfss   FLAG,1
  90.         goto    ACTIVAR_D
  91.         bcf             FLAG,1
  92.         bcf             LED_D
  93.         return                  ; apaga flag e intermitente y vuelve a MAIN,
  94.                                                 ; FLAG estaba a 1
  95.  
  96. ACTIVAR_D
  97.         bsf             FLAG,1
  98.         btfsc   PUL_D
  99.         goto    ESPERA          ; si mientras esta ejecutando una secuencia
  100.                                                 ; se pulsa un boton empiezade nuevo
  101.         btfsc   PUL_D
  102.         goto    ESPERA
  103.         bsf             LED_D           ; enciende intermitente izquierda
  104.         call    DEMORA          ; está un tiempo encendido
  105.         bcf             LED_D           ; apaga
  106.         call    DEMORA
  107.         incf    CONTADOR,1  ; para número de veces que encenderá
  108.         movlw   .10         ; le pongo 10 pero pueden ser las que tu quieras
  109.         subwf   CONTADOR,0
  110.         btfss   STATUS,Z        ; van 10 veces?
  111.         goto    ACTIVAR_D       ; no, vuelve a repetir secuencia
  112.         return                  ; ya van 10 va a main
  113.  
  114.  
  115. LOS_DOS
  116.         btfss   FLAG,2          ; flag para saber si apagamos o encendemos
  117.         goto    ACTIVAR_LOSDOS
  118.         CLRF    PORTB
  119.         bcf     FLAG,2          ; apagamos intermitentes y borramos flag,
  120.                                                 ; ya que estaba a 1
  121.  
  122.  
  123. ACTIVAR_LOSDOS
  124.         bsf     FLAG,2          ; el flag estaba a 0 lo activamos
  125.         btfsc   PUL_I
  126.         goto    ESPERA          ; si mientras esta ejecutando una secuencia
  127.                                                 ; se pulsa un boton empieza de nuevo
  128.         btfsc   PUL_D
  129.         goto    ESPERA
  130.         movlw   0x18
  131.         movwf   PORTB           ; ponemos a 1 bits 3 y 4 del puerto B
  132.         call    DEMORA          ; tiempo encendidos
  133.         clrf    PORTB           ; lo hago así porque supongo que
  134.                                                 ; no tienes mas cosas coectadas en PORTB
  135.         return
  136.  
  137. ANTIRREBOTES                    ; retardo 20ms para antirrebote
  138.  
  139.         movlw   .21             ; 1 set numero de repeticion  (B)
  140.     movwf       PDel2           ; 1 |
  141. PLoop3  
  142.         movlw   .237            ; 1 set numero de repeticion  (A)
  143.     movwf     PDel3     ; 1 |
  144. PLoop4  
  145.         clrwdt              ; 1 clear watchdog
  146.     decfsz      PDel3,1         ; 1 + (1) es el tiempo 0  ? (A)
  147.     goto        PLoop2          ; 2 no, loop
  148.     decfsz      PDel2,1         ; 1 + (1) es el tiempo 0  ? (B)
  149.     goto        PLoop1          ; 2 no, loop
  150. PDelL8  
  151.         goto    PDelL9          ; 2 ciclos delay
  152. PDelL9  
  153.         clrwdt              ; 1 ciclo delay
  154.     return              ; 2+2 Fin.
  155.  
  156.  
  157. DEMORA                                  ; retardo de 500ms para intermitencia
  158.         movlw   .239            ; 1 set numero de repeticion  (B)
  159.     movwf       PDel0           ; 1 |
  160. PLoop1  
  161.         movlw   .232            ; 1 set numero de repeticion  (A)
  162.     movwf       PDel1           ; 1 |
  163. PLoop2  
  164.         clrwdt              ; 1 clear watchdog
  165. PDelL1  
  166.         goto    PDelL2          ; 2 ciclos delay
  167. PDelL2  
  168.         goto    PDelL3          ; 2 ciclos delay
  169. PDelL3  
  170.         clrwdt              ; 1 ciclo delay
  171.     decfsz      PDel1,1         ; 1 + (1) es el tiempo 0  ? (A)
  172.     goto        PLoop2          ; 2 no, loop
  173.     decfsz      PDel0,1         ; 1 + (1) es el tiempo 0  ? (B)
  174.     goto        PLoop1          ; 2 no, loop
  175. PDelL4  
  176.         goto    PDelL5          ; 2 ciclos delay
  177. PDelL5  
  178.         goto    PDelL6          ; 2 ciclos delay
  179. PDelL6  
  180.         goto    PDelL7          ; 2 ciclos delay
  181. PDelL7  
  182.         clrwdt              ; 1 ciclo delay
  183.     return              ; 2+2 Fin.
  184.        
  185.         end



Pues nada. Un saludo y muchísimas gracias.

Edito.- lo he editado para colocar los contadores entre 'cblock y endc' y las dos líneas siguientes equ para flag y reg_1. Pero tampoco tira.
« Última modificación: 30 de Noviembre de 2010, 19:10:12 por ohsielos »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Intermitentes moto.
« Respuesta #5 en: 01 de Diciembre de 2010, 15:19:16 »
Quitale el WDT,WDT_OFF  no esta contemplado en el programa, sale en las rutinas de tiempo porque las hago con un programa que las genera automaticamente EL PDel, , lo tienes en este subforo al principio.
Debes poner FLAG y REG_1 entre CBLOCK Y ENDC ya que son registros de RAM.
El fallo principal es que no has configurado los puertos.pon esto al principio del programa antes de ESPERA.

org   0X00               ; VECTOR DE RESET
   GOTO   INICIO               ; va a inicio
   ORG   0x04               ; VECTOR DE INTERRUPCIONES



   ORG   0X05
INICIO
   BSF   STATUS,5            ; activa la pagina 1
   MOVLW   0XFF               ; carga FF en W
   MOVWF   TRISA               ; puerto A todos entradas
   MOVLW   0X00               ; carga 00000000 en W
   MOVWF   TRISB               ; mueve W a puerto B (todos salidaS)
   BCF   STATUS,5            ; volvemos a la pagina 0
        clrf    PORTB                              ; ponemos a o para empezar con intermitentes apagados

Aqui estaba mal, ponlo asi, esto fue fallo mio:

LOS_DOS
btfss  FLAG,2  ; flag para saber si apagamos o encendemos
goto   ACTIVAR_LOSDOS
CLRF   PORTB
bcf    FLAG,2  ;apagamos intermitentes y borramos flag, ya que estaba a 1
return

ACTIVAR_LOSDOS
bsf   FLAG,2   ; el flag estaba a 0 lo activamos
btfsc  PUL_I
goto   ESPERA  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto  ESPERA
movlw  0x18
movwf  PORTB  ; ponemos a 1 bits 3 y 4 del puerto B
call   DEMORA  ; tiempo encendidos
clrf   PORTB  ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
call   DEMORA
goto   ACTIVAR_LOSDOS

Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Re: Intermitentes moto.
« Respuesta #6 en: 04 de Diciembre de 2010, 11:44:10 »
Hola de nuevo.
Tapi8, tengo algún tipo de problema con el progrma porque no funciona. Llevo dos días intentando averiguar el motivo.
Una vez programdo el pic, lo monto en la plaquita de pruebas que hice y no se encienden los leds. Para probar que funciona lo reprogramo con el que hice en basic y sí funciona: parapadea, le cuesta salir, etc...pero va.
Lo mas curioso es que la simulación funciona bien en el mplab. Incluso lo cargo en el pic simulator ide, bajándole previamente el tiempo de retardos para que se vea el parpadeo en la ventanita de '8 x led Board' y se encienden y apagan correctamente al pulsar el RA0 o 1.
No me cuadra que las simulaciones vayan bien y al programarlo e instalar no funcione.
Lo programo con el WinPic800, y debe ir bien porque ya te digo que el que diseñé en basic, grabo el hex resultante sin problemas y va.
Incluso lo he simplificado al máximo para probar (con la tabla, que me gustó eso), de manera que al pulsar se encienda el led correspondiente y se quede ahí en un bucle y tampoco. Te lo dejo para que lo veas, es muy simple:

Código: ASM
  1. __CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC   
  2.                
  3.         LIST    P=16F84A
  4.         INCLUDE <P16F84A.INC>
  5.        
  6.         CBLOCK 0x0C
  7.         ENDC
  8.        
  9.  
  10.  
  11.        
  12. #DEFINE LED_I   PORTB,3
  13. #DEFINE LED_D   PORTB,4        
  14. #DEFINE PUL_I   PORTA,2
  15. #DEFINE PUL_D   PORTA,1
  16.  
  17. ;ZONA CODIGOS************
  18.         ORG     0
  19. Inicio 
  20.         bsf     STATUS,RP0      ;Acceso Banco 1.
  21.         clrf    TRISB
  22.  
  23.         movlw   b'00110'
  24.         movwf   TRISA
  25.         bcf     STATUS,RP0      ;Acceso Banco 0.
  26.         clrf    PORTB
  27.         clrf    PORTA
  28.        
  29.  
  30.        
  31. ESPERA
  32.         btfss   PUL_I
  33.         goto    $+2
  34.         goto    MAIN
  35.         btfss   PUL_D
  36.         goto    ESPERA
  37.         goto    MAIN
  38.        
  39. TABLA
  40.         addwf   PCL,1
  41.         goto    ESPERA
  42.         goto    DERECHA
  43.         goto    IZQUIERDA
  44.         goto    LOS_DOS
  45.        
  46. MAIN
  47.         btfss   PUL_D
  48.         bcf     REG_1,0
  49.         btfsc   PUL_D
  50.         bsf     REG_1,0
  51.         btfss   PUL_I
  52.         bcf     REG_1,1
  53.         btfsc   PUL_I
  54.         bsf     REG_1,1
  55.         movf    REG_1,0
  56.         call    TABLA
  57.         goto    ESPERA
  58.        
  59. IZQUIERDA
  60.  
  61.         BSF     LED_I
  62.        
  63.         goto    IZQUIERDA
  64.        
  65.        
  66.  
  67.        
  68. DERECHA
  69.  
  70.         BSF     LED_D
  71.        
  72.         goto    DERECHA
  73.  
  74.  
  75. LOS_DOS
  76.        
  77.         BSF     LED_I
  78.         BSF     LED_D
  79.         GOTO    LOS_DOS
  80.        
  81.        
  82.         CBLOCK
  83.         REG_1
  84.         ENDC
  85.  
  86.        
  87.         END

En fín, sigo haciendo pruebas a ver. Si se te ocurre algo me lo comentas.

Gracias.
« Última modificación: 04 de Diciembre de 2010, 11:48:05 por ohsielos »

Desconectado juan47

  • PIC10
  • *
  • Mensajes: 27
Re: Intermitentes moto.
« Respuesta #7 en: 04 de Diciembre de 2010, 15:44:15 »
Hola
Me he mirado por encima el ultimo ccodigo de programa y he encontrado que en la comparacion
btfss no le dices el bit al que tiene que apuntar
Instrucciones orientadas a Bit
BCF f,b      Coloca a 0 el bit b del registro f


BSF f,b       Coloca a 1 el bit b del registro f

BTFSC f,b   Salta si el bit b del reg. f es 0


BTFSS f,b    Salta si el bit b del reg. f es 1
   



Un saludo

Desconectado juan47

  • PIC10
  • *
  • Mensajes: 27
Re: Intermitentes moto.
« Respuesta #8 en: 04 de Diciembre de 2010, 16:08:29 »
Hola
Pido disculpas al no haberme tomado con calma la lectura del codigo
Si que se apunta al bit pues se tiene definido al principio del codigo

Un saludo

Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Re: Intermitentes moto.
« Respuesta #9 en: 04 de Diciembre de 2010, 16:18:21 »
Hola Juan, tengo definidos los pulsadores y los leds al principio:
#DEFINE LED_I    PORTB,3
#DEFINE LED_D   PORTB,4
#DEFINE PUL_I    PORTA,2
#DEFINE PUL_D   PORTA,1

ahí ya le digo el registro y el bit en cuestión. Las que no llevan alguno de estos cuatro, ya lo especifico como por ejemplo
bsf   STATUS,RP0.

A mí lo que me trae de cabeza es que simule bien y al programar no funcione nada.

Gracias Juan por tu interés.

Edito: acabo de leer tu segundo mensaje después de publicar éste. No tienes por qué pedirlas. Gracias de nuevo.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Intermitentes moto.
« Respuesta #10 en: 05 de Diciembre de 2010, 07:47:54 »
El programa te deberia funcionar, pero eso si, solo se enciende una vez el que pulses o los dos, pero nada mas, despues tienes que resetear para poder encender el otro, tampoco parpadea solo se quedaria encendido y nada mas, a lo mejor el que funcione asi te esta despistando.
Por otro lado ayer tuve tiempo de ponerme con el MPLAB y ver fallos del programa de estos dias, creo que consegui hacer uno que funciona bien, te explico como va:
Si se pulsa cualquiera de los don enciende el de ese lado, enciende cuando se suelta, si se pulsa el que esta encendido, cuando se suelta apaga, si se pulsa el contrario, al soltar enciende el contrario, si se pulsan los dos encienden los dos, al soltar.
Le puse un antirrebotes de 300ms en lugar del de 20ms, porque me imagino que los humanos no somos capaces de pulsar exactamente al mismo tiempo, entonces este tiempo de espera compensaria ese error, ya que sino encenderia el que se pulsara primero. Esto cuando hagas pruebas veras si ese tiempo se puede rebajar o hay que aumentarlo, es el antirrebotes.
Por otro lado esta la cadencia del parpadeo, era de 500ms pero creo que va muy rapido, incluso creo que no se ajustaria a la legalidad ( esto te lo dirian en una ITV o en trafico) entonces la he puesto mas grande de 1500ms, pero no puede estar 1.5s en un bucle de temporizacion ya que si se pulsara para desactivar muchas veces no se enteraria, ya que mientras esta en el bucle no atiende a los pulsadores, se podria hacer por interrupciones o usar el TIMER, PERO COMO EN EL PRIMER POST DICES QUE ESTAS VERDE, he tratado de hacer el programa sin usar nada de esto, ademas no lo considero imprescindible, lo que he hecho es una temporizacion pequeña de 50ms , a la que se llama 30 veces, cada vez que se llama se chequean los pulsadores, de esta manera se hace un chequeo cada 50ms, es casi imposible pulsar un boton y soltarlo en ese tiempo (ni Valentino Rossi ni Jorge Lorenzo son capaces, porque cuando vean esos intermitentes te la pediran).
Código: [Seleccionar]
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>

__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT

CBLOCK 0x0C

CONTADOR
CONTADOR_1
PDel0
PDel1
PDel2
PDel3
PDel4
REG_1
FLAG
 ENDC


#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1


ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCIONES



ORG 0X05
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas aunque este puerto no se va a usar
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; todos los LEDs apagados

clrf CONTADOR
clrf FLAG





ESPERA

btfss   PUL_I   
goto    $+3 ; va tres posiciones para delante
call      ANTIRREBOTES
goto     MAIN
btfss    PUL_D
goto     ESPERA
call      ANTIRREBOTES
goto    MAIN

TABLA          ;esta tabla nos dira que hay que hacer
addwf   PCL,1
goto     ESPERA  ; aqui nunc vendra, pero por si acaso....
goto     DERECHA
goto     IZQUIERDA
goto     LOS_DOS


MAIN

btfss   PUL_D    ; miramos si en PUL_D hay un 1 o un 0
bcf     REG_1,0  ; y escribimos en un registro lo que haya
btfsc   PUL_D    ; en el bit 0
bsf      REG_1,0
btfss   PUL_I     ; hacemos lo mismo con el otro pulsador
bcf      REG_1,1  ;este lo escribimos en el bit 1
btfsc   PUL_I
bsf      REG_1,1  ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf  REG_1,0    ; lo movemos a W
call    TABLA
goto   ESPERA


IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
btfss  FLAG,0
goto   ACTIVAR_I


DESACTIVAR_I

bcf    FLAG,0
bcf    LED_I
clrf CONTADOR
btfsc PUL_I    ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return         ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1


ACTIVAR_I
bsf   FLAG,0
btfsc  PUL_I
goto   DESACTIVAR_D  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto  DERECHA

ENCIENDE_I
bsf   LED_I    ; enciende intermitente izquierda
call  DEMORA   ;esta un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador

APAGA_I

bcf   LED_I    ; apaga
call  DEMORA
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador

incf  CONTADOR,1  ; para numero de veces que encendera
movlw .10         ; le pongo 10 pero pueden ser las que tu quieras
subwf  CONTADOR,0
btfss  STATUS,Z  ; van 10 veces?
goto  ACTIVAR_I    ; no, vuelve a repetir secuencia
clrf  CONTADOR
goto DESACTIVAR_I

DERECHA

btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
btfss FLAG,1
goto ACTIVAR_D

DESACTIVAR_D

bcf FLAG,1
bcf LED_D
clrf CONTADOR
btfsc PUL_D    ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return         ; apaga flag e intermitente y vuelve a MAIN; FLAG estaba a 1
 
ACTIVAR_D
bsf FLAG,1
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
bsf LED_D     ; enciende intermitente izquierda

ENCIENDE_D

call DEMORA   ; está un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador

APAGA_D

bcf LED_D     ; apaga
call DEMORA
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador

incf CONTADOR,1  ; para número de veces que encenderá
movlw .10         ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z   ; van 10 veces?
goto ACTIVAR_D ; no, vuelve a repetir secuencia
clrf  CONTADOR
goto DESACTIVAR_D


LOS_DOS

btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
btfss  FLAG,2  ; flag para saber si apagamos o encendemos
goto   ACTIVAR_LOSDOS

DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
bcf    FLAG,2  ;apagamos intermitentes y borramos flag, ya que estaba a 1
clrf PORTB   ; apagamos intermitentes
return

ACTIVAR_LOSDOS
bsf   FLAG,2   ; el flag estaba a 0 lo activamos
btfsc  PUL_I
goto   DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto DESACTIVAR_LOSDOS
movlw  0x18
movwf  PORTB  ; ponemos a 1 bits 3 y 4 del puerto B

ENCIENDE_LOSDOS

call   DEMORA  ; tiempo encendidos
btfsc  PUL_I
goto   DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador

APAGA_LOSDOS

clrf   PORTB  ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
call   DEMORA
btfsc  PUL_I
goto   DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto   ACTIVAR_LOSDOS



ANTIRREBOTES                ; 300ms, aparte de servir de antirrebotes, tambien compensara
    ; si no se pulsan exactamente al mismo tiempo los dos botones
    movlw     .154      ; 1 set numero de repeticion  (B)
        movwf     PDel2     ; 1 |
PLoop3  movlw     .243      ; 1 set numero de repeticion  (A)
        movwf     PDel3     ; 1 |
PLoop4  clrwdt              ; 1 clear watchdog
PDelL8  goto PDelL9         ; 2 ciclos delay
PDelL9  goto PDelL10         ; 2 ciclos delay
PDelL10 
        decfsz    PDel3, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop4    ; 2 no, loop
        decfsz    PDel2,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop3    ; 2 no, loop
PDelL11  goto PDelL12         ; 2 ciclos delay
PDelL12  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-----------------------------------------------



DEMORA     ; retardo de 50ms que se repetira las veces que sea necesario
    ; para completar el tiempo adecuado para las intermitencias
movlw     .55       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        return              ; 2+2 Fin.
END

Bueno ya me diras los defectos que pueda tener

Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Re: Intermitentes moto.
« Respuesta #11 en: 05 de Diciembre de 2010, 11:45:49 »
Hola, Tapi8.
Muchas gracias por el nuevo programa.
Respecto al antiguo, como ya te comenté, no enciende nada de nada; ni pulsando ni sin pulsar. Me da que debe haber algo con la tabla que no le sienta bien al micro. Porque ya te digo que simulaba perfectamente.
Eso sí, tuve que cambiar la situación de la llamada a 'antirrebotes' porque donde tu la colocaste al volver se iba a leer 'main' para colocar en 'reg_1' los valores que tenía que leer la tabla y ya no estaba pulsado por venir de antirrebotes y siempre había un 0,0 con lo cual la table me enviaba a 'espera'. Puse el antirrebotes al comienzo de las llamadas a 'derecha' e 'izquierda' y simulaba perfecto.

Digo yo: no será que el PIC16F84A tiene algo en contra de las tablas?? Por cierto para asegurarme me cogí un programita con una tabla sencilla en la cual después del addwf venían instrucciones 'retlw', y sí funcionaba esa tabla, con lo cual creo que no van por ahí los tiros.  :huh:

En cuanto pueda pruebo éste que has puesto a ver qué pasa. Si tardo en contestar es porque le doy mil vueltas para intentar hacerlo funcionar sin molestar a nadie.

Gracias de nuevo. Te debo una ronda.

Saludos

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Intermitentes moto.
« Respuesta #12 en: 06 de Diciembre de 2010, 08:01:36 »
El antirrebotes es de 300ms, debe ir donde esta puesto, porque cuando detecta pulsacion en ESPERA lo hace para asegurarse de que en MAIN ya han pasado los rebotes y la lectura que haga va a ser la correcta, la puse bastante grande por lo que te explique de que al pulsar los dos si no se hace exactamente al mismo tiempo, cosa que creo que es normal, asumira que se pulso uno solo, el primero, si en las pruebas ves que esto no pasa se puede reducir, incluso a 20ms este es el tiempo que necesita el antirrebotes. Se hacen con este programa no se si ya lo has bajado.

http://www.todopic.com.ar/foros/index.php?topic=5968.0


En cuanto a las tablas no creo que sean problema pero te hice un programa sin ellas las he cambiado por otra rutina.


Código: [Seleccionar]
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>

__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT

CBLOCK 0x0C

CONTADOR
CONTADOR_1
PDel0
PDel1
PDel2
PDel3
PDel4
REG_1
FLAG
 ENDC


#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1


ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCIONES



ORG 0X05
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas aunque este puerto no se va a usar
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; todos los LEDs apagados

clrf CONTADOR
clrf FLAG





ESPERA

btfss   PUL_I   
goto    $+3 ; va tres posiciones para delante
call      ANTIRREBOTES
goto     MAIN
btfss    PUL_D
goto     ESPERA
call      ANTIRREBOTES
goto    MAIN




MAIN
clrf REG_1 ;

btfss   PUL_D    ; miramos si en PUL_D hay un 1 o un 0
bcf     REG_1,0  ; y escribimos en un registro lo que haya
btfsc   PUL_D    ; en el bit 0
bsf      REG_1,0
btfss   PUL_I     ; hacemos lo mismo con el otro pulsador
bcf      REG_1,1  ;este lo escribimos en el bit 1
btfsc   PUL_I
bsf      REG_1,1  ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf  REG_1,0    ; lo movemos a W
movlw .3
subwf REG_1,0 ; miramos si REG_1 vale 3, serian los dos botones pulsados
btfsc STATUS,Z
goto LOS_DOS ; vale 3 encendemos los dos intermitentes
movlw .2
subwf REG_1,0 ; miramos si REG_1 vale 2, seria boton derecha
btfsc STATUS,Z
goto IZQUIERDA ; vale 2 encendemos intermitente derecha
movlw .1
subwf REG_1,0 ; miramos si REG_1 vale 1, seria boton izquierda
btfsc STATUS,Z
goto DERECHA ; vale 1 encendemos intermitente izquierda
goto ESPERA ; no es ninguno fueron rebotes, va a esperar pulsacion



IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
goto   ENCIENDE_I


DESACTIVAR_I

bcf    LED_I
clrf CONTADOR
btfsc PUL_I    ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
goto ESPERA         ; apaga flag e intermitente y vueleve a ESPERA, FLAG estaba a 1




ENCIENDE_I
bsf   LED_I    ; enciende intermitente izquierda
call  DEMORA   ;esta un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador

APAGA_I

bcf   LED_I    ; apaga
call  DEMORA
btfsc PUL_D
goto DESACTIVAR_D   ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador

incf  CONTADOR,1  ; para numero de veces que encendera
movlw .10          ; le pongo 10 pero pueden ser las que tu quieras
subwf  CONTADOR,0
btfss  STATUS,Z  ; van 10 veces?
goto  ENCIENDE_I    ; no, vuelve a repetir secuencia
clrf  CONTADOR
goto DESACTIVAR_I



DERECHA

btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
goto ENCIENDE_D

DESACTIVAR_D


bcf LED_D
clrf CONTADOR
btfsc PUL_D    ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
goto ESPERA          ; apaga flag e intermitente y vueleve a ESPERA, FLAG estaba a 1

 


ENCIENDE_D
bsf LED_D
call DEMORA    ; está un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D    ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador

APAGA_D

bcf LED_D      ; apaga
call DEMORA
btfsc PUL_D
goto DESACTIVAR_D    ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador

incf CONTADOR,1  ; para número de veces que encenderá
movlw .10          ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z    ; van 10 veces?
goto ENCIENDE_D ; no, vuelve a repetir secuencia
clrf  CONTADOR
goto DESACTIVAR_D


LOS_DOS

btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
goto   ACTIVAR_LOSDOS

DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
bcf    FLAG,2  ;apagamos intermitentes y borramos flag, ya que estaba a 1
clrf PORTB    ; apagamos intermitentes
goto ESPERA          ; apaga flag e intermitente y vueleve a ESPERA, FLAG estaba a 1


ACTIVAR_LOSDOS

btfsc  PUL_I
goto   DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto DESACTIVAR_LOSDOS
movlw  0x18
movwf  PORTB  ; ponemos a 1 bits 3 y 4 del puerto B

ENCIENDE_LOSDOS

call   DEMORA  ; tiempo encendidos
btfsc  PUL_I
goto   DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador

APAGA_LOSDOS

clrf   PORTB  ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
call   DEMORA
btfsc  PUL_I
goto   DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc  PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto   ACTIVAR_LOSDOS



ANTIRREBOTES                ; 300ms, aparte de servir de antirrebotes, tambien compensara
    ; si no se pulsan exactamente al mismo tiempo los dos botones
    movlw     .154      ; 1 set numero de repeticion  (B)
        movwf     PDel2     ; 1 |
PLoop3  movlw     .243      ; 1 set numero de repeticion  (A)
        movwf     PDel3     ; 1 |
PLoop4  clrwdt              ; 1 clear watchdog
PDelL8  goto PDelL9         ; 2 ciclos delay
PDelL9  goto PDelL10         ; 2 ciclos delay
PDelL10 
        decfsz    PDel3, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop4    ; 2 no, loop
        decfsz    PDel2,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop3    ; 2 no, loop
PDelL11  goto PDelL12         ; 2 ciclos delay
PDelL12  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-----------------------------------------------



DEMORA     ; retardo de 50ms que se repetira las veces que sea necesario
    ; para completar el tiempo adecuado para las intermitencias
movlw     .55       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        return              ; 2+2 Fin.
END

Desconectado ohsielos

  • PIC10
  • *
  • Mensajes: 21
Re: Intermitentes moto.
« Respuesta #13 en: 06 de Diciembre de 2010, 09:57:05 »
TAPI8 eres un genio  :-/ :-/ :-/.
Efectivamente, las tablas no son el problema porque he conseguido hacer funcionar tu programa anterior.
Tal como lo dejaste funcionaba bien, pero el tiempo encendido era muy largo. Los leds lucen instantáneamente (gran ventaja sobre las lámparas incandescentes) y me gustaba el efecto flash de un tiempo corto (50ms).
Al intentar bajarlo disminuyendo el valor .50 a .5 o .1 de la línea:
movlw   .50      ; número de veces que se repite el retardo de 50ms
ocurría que al montarlo en mi plaquita de pruebas y pulsar uno de los dos pulsadores el primer destello duraba 6 segundos, y los restantes 9 iban bien (50ms). Estuve toda la tarde dándole vueltas modificando los tiempos de antirrebotes y cambiándolo de sitio pero nada, hasta que me me dije: si solo quiero que vaya una vez a 'demora' (50ms) borro todo el tema de que vaya a contar y pase directamente a apagar.
Y así es como va perfecto, también le he bajado un poco el tiempo apagado de .50 a .40 y el tiempo de antirrebotes, iba un poco 'espeso', con la calculadora Picdel que me dijiste calculé para 150ms y cambié los números simplemente. Ahora va perfecto.
Se ha quedado así:

Código: ASM
  1. __CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC   
  2.                
  3.         LIST    P=16F84A
  4.         INCLUDE <P16F84A.INC>
  5.        
  6.         CBLOCK 0x0C
  7.         CONTADOR
  8.         CONTADOR_1
  9.         PDel0
  10.         PDel1
  11.         PDel2
  12.         PDel3
  13.         PDel4
  14.         REG_1
  15.         FLAG
  16.          ENDC
  17.  
  18.  
  19. #DEFINE LED_I PORTB,3
  20. #DEFINE LED_D PORTB,4
  21. #DEFINE PUL_I PORTA,2
  22. #DEFINE PUL_D PORTA,1
  23.        
  24.         ORG     0X00            ; VECTOR DE RESET
  25.         goto    INICIO          ; va a inicio
  26.         ORG     0x04            ; VECTOR DE INTERRUPCIONES
  27.  
  28.  
  29.  
  30.         ORG     0X05
  31. INICIO
  32.         bsf     STATUS,5        ; activa la página 1
  33.         movlw   0XFF            ; carga FF en W
  34.         movwf   TRISA           ; puerto A todos entradas aunque este puerto no se va a usar
  35.         movlw   0X00            ; carga 00000000 en W
  36.         movwf   TRISB           ; mueve W a puerto B (todos salidas)
  37.         bcf     STATUS,5        ; volvemos a la página 0
  38.         clrf    PORTB           ; ponemos a cero el puerto B para empezar con
  39.                                 ; todos los LEDs apagados
  40.         clrf    CONTADOR
  41.         clrf    FLAG
  42.  
  43. ESPERA                          ; Leemos los pulsadores.
  44.         btfss   PUL_I           ; si está pulsado Izq. va a ANTIRREBOTES, si no
  45.         goto    $+3             ; va tres posiciones para adelante
  46.         call    ANTIRREBOTES    ; al volver de Antirrebotes se va a MAIN
  47.         goto    MAIN
  48.         btfss   PUL_D           ; si está pulsado va a ANTIRREBOTES, si no
  49.         goto    ESPERA          ; vuelve a leer los pulsadores.
  50.         call    ANTIRREBOTES    ; al volver de Antirrebotes se va a MAIN
  51.         goto    MAIN
  52.  
  53. TABLA                           ;esta tabla nos dirá que hay que hacer
  54.         addwf   PCL,1
  55.         goto    ESPERA          ; aquí nunca vendrá, pero por si acaso....
  56.         goto    DERECHA
  57.         goto    IZQUIERDA
  58.         goto    LOS_DOS
  59.  
  60.  
  61. MAIN
  62.         btfss   PUL_D           ; miramos si en PUL_D hay un 1 o un 0
  63.         bcf     REG_1,0         ; y escribimos en un registro lo que haya
  64.         btfsc   PUL_D           ; en el bit 0
  65.         bsf     REG_1,0
  66.         btfss   PUL_I           ; hacemos lo mismo con el otro pulsador
  67.         bcf     REG_1,1         ; éste lo escribimos en el bit 1
  68.         btfsc   PUL_I
  69.         bsf     REG_1,1         ; aquí ya tenemos los dos pulsadores leidos y anotados en un registro
  70.         movf    REG_1,0         ; lo movemos a W
  71.         call    TABLA
  72.         goto    ESPERA
  73.  
  74.  
  75. IZQUIERDA
  76.         btfsc   PUL_I           ; Aquí espera hasta que se suelte pulsador
  77.         goto    $-1             ; va una posición para atrás
  78.         clrf    CONTADOR
  79.         btfss   FLAG,0          ; miramos si hay un 1 en el Flag,0
  80.         goto    ACTIVAR_I       ; si no lo hay nos vamos a activar parpadeo Izq.
  81.        
  82.  
  83. DESACTIVAR_I   
  84.         bcf     FLAG,0
  85.         bcf     LED_I
  86.         clrf    CONTADOR
  87.         btfsc   PUL_I           ; espera hasta que se suelte pulsador
  88.         goto    $-1             ; porque si retornara sin esperar volvería a secuencia
  89.         return                  ; apaga flag e intermitente y vuelve a MAIN, FLAG estaba a 1
  90.  
  91.  
  92. ACTIVAR_I
  93.         bsf     FLAG,0          ; ponemos un 1 en el Flag,0
  94.         btfsc   PUL_I           ; salta si no está pulsado el Izq.
  95.         goto    DESACTIVAR_I    ; si mientras está ejecutando una secuencia
  96.                                 ; se pulsa un botón empieza de nuevo
  97.         btfsc   PUL_D           ; salta si no está pulsado el Dcho.
  98.         goto    DERECHA         ; si lo estuviese nos vamos a encender Dcho.
  99.  
  100. ENCIENDE_I
  101.         bsf     LED_I           ; enciende intermitente Izq.
  102.         call    DEMORA          ; está un tiempo encendido
  103.         btfsc   PUL_D           ; salta si no está pulsado el Dcho.
  104.         goto    DESACTIVAR_I    ; si mientras esta ejecutando una secuencia
  105.                                 ; se pulsa un botón empieza de nuevo
  106.         btfsc   PUL_I           ; salta si no está pulsado el Izq.
  107.         goto    IZQUIERDA       ; si lo estuviese nos vamos a encender Izq.
  108. ;       incf    CONTADOR_1,1   
  109. ;       movlw   .5              ; número de veces que se repite el retardo de 50ms
  110. ;       subwf   CONTADOR_1,0    ; modificando este número se aumentará o reducirá en 50ms el tiempo
  111. ;       btfss   STATUS,Z        ; salta si el bit Z de Status es 1.
  112. ;       goto    ENCIENDE_I
  113.         clrf    CONTADOR_1      ; ponemos a 0 contador y nos vamos a apagar el led.
  114.  
  115. APAGA_I
  116.         bcf     LED_I           ; apaga el led Izq.
  117.         call    DEMORA          ; lo mantiene apagado 50ms.
  118.         btfsc   PUL_D           ; salta si no está pulsado el Dcho.
  119.         goto    DESACTIVAR_I    ; si mientras esta ejecutando una secuencia se pulsa un botón empieza de nuevo
  120.         btfsc   PUL_I           ; salta si no está pulsado el Izq.
  121.         goto    IZQUIERDA       ; si lo está nos vamos a
  122.         incf    CONTADOR_1,1
  123.         movlw   .40             ; número de veces que se repite el retardo de 50ms
  124.         subwf   CONTADOR_1,0    ; modificando este número se aumentará o reducirá en 50ms el tiempo
  125.         btfss   STATUS,Z
  126.         goto    APAGA_I
  127.         clrf    CONTADOR_1      ; ponemos a 0 contador
  128.        
  129.         incf    CONTADOR,1      ; para número de veces que encenderá
  130.         movlw   .10             ; le pongo 10 pero pueden ser las que tu quieras
  131.         subwf   CONTADOR,0
  132.         btfss   STATUS,Z        ; van 10 veces?
  133.         goto    ACTIVAR_I       ; no, vuelve a repetir secuencia
  134.         clrf    CONTADOR       
  135.         goto    DESACTIVAR_I
  136.  
  137. DERECHA
  138.         btfsc   PUL_D           ; Aquí espera hasta que se suelte pulsador
  139.         goto    $-1             ; va una posición para atrás
  140.         clrf    CONTADOR
  141.         btfss   FLAG,1
  142.         goto    ACTIVAR_D
  143.        
  144. DESACTIVAR_D   
  145.         bcf     FLAG,1          ; pone un 0 en el bit 1 de Flag.
  146.         bcf     LED_D           ; apaga led Dcho.
  147.         clrf    CONTADOR        ; pone a 0 el Contador.
  148.         btfsc   PUL_D           ; espera hasta que se suelte pulsador
  149.         goto    $-1             ; porque si retornara sin esperar volvería a secuencia
  150.         return                  ; apaga flag e intermitente y vuelve a MAIN; FLAG estaba a 1
  151.  
  152. ACTIVAR_D
  153.         bsf     FLAG,1
  154.         btfsc   PUL_D           ; salta si no está pulsado el Dcho.
  155.         goto    DESACTIVAR_D    ; si mientras esta ejecutando una secuencia
  156.                                 ; se pulsa un botón empieza de nuevo
  157.         btfsc   PUL_I           ; salta si no está pulsado el Izq.
  158.         goto    IZQUIERDA
  159.        
  160. ENCIENDE_D
  161.         bsf     LED_D           ; enciende intermitente Dcho.  
  162.         call    DEMORA          ; está un tiempo encendido
  163.         btfsc   PUL_D
  164.         goto    DESACTIVAR_D    ; si mientras esta ejecutando una secuencia se pulsa un botón empieza de nuevo
  165.         btfsc   PUL_I
  166.         goto    IZQUIERDA
  167. ;       incf    CONTADOR_1,1
  168. ;       movlw   .50             ; número de veces que se repite el retardo de 50ms
  169. ;       subwf   CONTADOR_1,0    ; modificando este número se aumentará o reducirá en 50ms el tiempo
  170. ;       btfss   STATUS,Z
  171. ;       goto    ENCIENDE_D
  172.         clrf    CONTADOR_1      ; ponemos a 0 contador
  173.  
  174. APAGA_D
  175.         bcf     LED_D           ; apaga
  176.         call    DEMORA
  177.         btfsc   PUL_D
  178.         goto    DESACTIVAR_D    ; si mientras esta ejecutando una secuencia se pulsa un botón empieza de nuevo
  179.         btfsc   PUL_I
  180.         goto    IZQUIERDA
  181.         incf    CONTADOR_1,1
  182.         movlw   .40             ; número de veces que se repite el retardo de 50ms
  183.         subwf   CONTADOR_1,0    ; modificando este número se aumentará o reducirá en 50ms el tiempo
  184.         btfss   STATUS,Z
  185.         goto    APAGA_D
  186.         clrf    CONTADOR_1      ; ponemos a 0 contador
  187.        
  188.         incf    CONTADOR,1      ; para número de veces que encenderá
  189.         movlw   .10             ; le pongo 10 pero pueden ser las que tu quieras
  190.         subwf   CONTADOR,0
  191.         btfss   STATUS,Z        ; van 10 veces?
  192.         goto    ACTIVAR_D       ; no, vuelve a repetir secuencia
  193.         clrf    CONTADOR
  194.         goto    DESACTIVAR_D
  195.  
  196.  
  197. LOS_DOS
  198.         btfsc   PUL_I
  199.         goto    $-1
  200.         btfsc   PUL_D           ; miramos si están sin pulsar ambos botones
  201.         goto    $-3
  202.         btfss   FLAG,2          ; flag para saber si apagamos o encendemos
  203.         goto    ACTIVAR_LOSDOS
  204.  
  205. DESACTIVAR_LOSDOS
  206.         btfsc   PUL_I
  207.         goto    $-1
  208.         btfsc   PUL_D           ; miramos si están sin pulsar ambos botones
  209.         goto    $-3    
  210.         bcf     FLAG,2          ;apagamos intermitentes y borramos flag, ya que estaba a 1
  211.         clrf    PORTB           ; apagamos intermitentes
  212.         return
  213.  
  214. ACTIVAR_LOSDOS
  215.         bsf     FLAG,2          ; el flag estaba a 0 lo activamos
  216.         btfsc   PUL_I
  217.         goto    DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un botón empieza de nuevo
  218.         btfsc   PUL_D
  219.         goto    DESACTIVAR_LOSDOS
  220.         movlw   0x18
  221.         movwf   PORTB           ; ponemos a 1 bits 3 y 4 del puerto B
  222.        
  223. ENCIENDE_LOSDOS
  224.         call    DEMORA          ; tiempo encendidos
  225.         btfsc   PUL_I
  226.         goto    DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un botón empieza de nuevo
  227.         btfsc   PUL_D
  228.         goto    DESACTIVAR_LOSDOS
  229. ;       incf    CONTADOR_1,1
  230. ;       movlw   .50             ; número de veces que se repite el retardo de 50ms
  231. ;       subwf   CONTADOR_1,0    ; modificando este número se aumentará o reducirá en 50ms el tiempo
  232. ;       btfss   STATUS,Z
  233. ;       goto    ENCIENDE_LOSDOS
  234.         clrf    CONTADOR_1      ; ponemos a 0 contador
  235.  
  236. APAGA_LOSDOS           
  237.         clrf    PORTB           ; lo hago así porque supongo que no tienes mas cosas coectadas en PORTB
  238.         call    DEMORA
  239.         btfsc   PUL_I
  240.         goto    DESACTIVAR_LOSDOS  ; si mientras esta ejecutando una secuencia se pulsa un botón empieza de nuevo
  241.         btfsc   PUL_D
  242.         goto    DESACTIVAR_LOSDOS
  243.         incf    CONTADOR_1,1
  244.         movlw   .40             ; número de veces que se repite el retardo de 50ms
  245.         subwf   CONTADOR_1,0    ; modificando este número se aumentará o reducirá en 50ms el tiempo
  246.         btfss   STATUS,Z
  247.         goto    APAGA_LOSDOS
  248.         clrf    CONTADOR_1      ; ponemos a 0 contador
  249.         goto    ACTIVAR_LOSDOS
  250.  
  251.  
  252.  
  253. ANTIRREBOTES                
  254.                                 ; 300ms, aparte de servir de antirrebotes, también compensará                         ; si no se pulsan exactamente al mismo tiempo los dos botones
  255.         movlw   .117            ; 1 set número de repetición  (B)
  256.        movwf    PDel2           ; 1 |
  257. PLoop3  movlw   .213            ; 1 set número de repetición  (A)
  258.         movwf   PDel3           ; 1 |
  259. PLoop4  
  260. ;       clrwdt                  ; 1 clear watchdog
  261. PDelL8  goto    PDelL9          ; 2 ciclos delay
  262. PDelL9  goto    PDelL10         ; 2 ciclos delay
  263. PDelL10  
  264.         decfsz  PDel3,1         ; 1 + (1) es el tiempo 0  ? (A)
  265.         goto    PLoop4          ; 2 no, loop
  266.         decfsz  PDel2,1         ; 1 + (1) es el tiempo 0  ? (B)
  267.         goto    PLoop3          ; 2 no, loop
  268. PDelL11  goto   PDelL12                 ; 2 ciclos delay
  269. PDelL12  
  270. ;       clrwdt                  ; 1 ciclo delay
  271.         return                  ; 2+2 Fin.
  272. ;-----------------------------------------------
  273.  
  274.  
  275.  
  276. DEMORA                          ; retardo de 50ms que se repetirá las veces que sea necesario
  277.                                 ; para completar el tiempo adecuado para las intermitencias
  278.         movlw   .55             ; 1 set número de repetición  (B)
  279.         movwf   PDel0           ; 1 |
  280. PLoop1  movlw   .181            ; 1 set número de repetición  (A)
  281.         movwf   PDel1           ; 1 |
  282. PLoop2  
  283. ;       clrwdt                  ; 1 clear watchdog
  284. ;        clrwdt                 ; 1 ciclo delay
  285.         decfsz  PDel1, 1        ; 1 + (1) es el tiempo 0  ? (A)
  286.         goto    PLoop2          ; 2 no, loop
  287.         decfsz  PDel0,  1       ; 1 + (1) es el tiempo 0  ? (B)
  288.         goto    PLoop1          ; 2 no, loop
  289.         return                  ; 2+2 Fin.
  290.        
  291.        
  292.         END

Pero no creas que ya has terminado, jejejeje (que abusón soy   :oops:). Voy a intentar pasarlo a un pic de ocho patillas tipo 12F629 o 675, que llevan oscilador interno y ahorro bastante espacio. ¿Cual me aconsejas?  encuentro en ebay mas económico el 675 que el 629 a pesar de llevar convertidor a/d. O si crees que es mejor algún otro modelo soy todo oidos. Eso sí, he de poder grabarlo con el TE-20, no quiero liarme mas. Ya bastantes dolores de cabeza me ha dado éste.

También estoy investigando como hacer que la salida del pic me maneje los leds de la moto, porque mi intención es aprovechar el casquillo de la lámpara para poner el led entre masa y el punto central por donde se supone han de llegarle los +12v. Ya he comprobado que directamente con transistores no puedo, porque el pic maneja tensiones de 0 y 5v. con lo cual el transistor como máximo me deja 5v en el emisor y necesito los +12 (lleva un led ambar de 3w con un driver que le suministra los 700mA que necesita). Voy a probar con un optoacoplador mas un transitor de potencia. Ya te contaré.

De nuevo mi gratitud por tu interés en mi problema.
Ya la ronda es con gambas.
Un saludo

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Intermitentes moto.
« Respuesta #14 en: 06 de Diciembre de 2010, 15:26:16 »
Me alegro mucho  :-/ :-/ :-/
Solo lo tienes encendido 50ms y apagago 2seg? sabia que los LEDs consumian poco pero tanto. Es el efecto optico, el ojo humano ve mas el tiempo de encendido que el de apagado.
Mira este hilo, el primer esquema, si en el sitio de la bobina del rele le pones los intermitentes, los dos en paralelo, casi lo tienes, no necesitas poner el diodo, no necesitas que sea un transistor de potencia, no necesitas optoacoplador, todas estas cosas son para cargas inductivas (motores) y para potencias grandes, tu solo vas a controlar unos LEDs de 3W. un transistor que soporte 20V de Vce y:

I=W/V=3/12=0.25A

Como son dos LED O.5A para que no este a tope 1A de Ic (intensidad de colector)

http://www.todopic.com.ar/foros/index.php?topic=13389.0

Aqui te dejo una pagina de un motero que de esto de electronica sabe la hostia, y tiene una buena explicacion de como se conectan los transistores:

http://picmania.garcia-cuervo.net/electronica_basica.php#TRANS1

En cuanto al PIC de 8 patas te lo iba a decir yo, es la mejor opcion, incluso tienes la serie 10f que es de 6 pines y tambien te valdria, te vale cualquiera de ellos, el programa, cualquiera de los que hice no llega a 200 BYTES, y el mas pequeño de estos tiene 256.
El programa hay que modificarlo un poco para la serie 12f y 10f, no mucho, pero algo si, pero bueno si tienes algun problema te ayudare en lo que pueda.

Saludos y me alegro mucho.


 

anything