Autor Tema: No corre el programa completo  (Leído 1303 veces)

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

Desconectado Jimmygus

  • PIC10
  • *
  • Mensajes: 1
No corre el programa completo
« en: 22 de Junio de 2015, 08:10:42 »
Buen dia foro, yo soy nuevo en este foro y hace poco estoy incursionando con los pic. Yo soy programador de plc pero esto hay cosas que no entiendo. Yo soy bombero voluntario y estoy haciendo un secuenciador para las luces de arriba del camion con un pic 16f627 y tengo programado 5 secuencias de las luces pero cuando lo prendo a veces hace las cinco sino hace 2 o 3 o las corta por la mitas y pasa a la siguiente. Como dato adicional las secuencias empiezan cuando energizo el pic. No tiene programada ninguna entrada. Si alguien me puede ayudar se lo agradezco. Muchas gracias
les dejo el programa para ver que opinan

list p=16F627A
    include "P16f627A.inc"

__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF & _BODEN_ON & _MCLRE_OFF


mem1      equ   0x20   ;
mem2      equ   0x21   ;
mem3      equ   0x22   ;

org   0x00   ; Origen del codigo

   nop   ; No operacion
   nop   ; No operacion
   goto   ala

org   0x04   ;Atiendo interrupcion
   goto   envio

ala
org    0x05
;--------------------------CONFIGURACION PUERTOS------------------------------------------------------------

   clrf   PORTA      ; Initialize PORTA by
            ; setting      BORRAR ESTO
            ; output data latches   BORRAR ESTO
   movlw   0x07      ; Apaga el comparador
   MOVWF   CMCON       ; y configura los pines
            ; como I/O digitales

                  
                  
                  
      bsf   STATUS,RP0   ; Ir banco 1
   bcf   STATUS,RP1
    clrf   TRISA         ; Todo Puerto a como salida
   movlw   b'00000000'      ;
   
       movlw   b'00000000'
   movwf   TRISB         ; PORTB salida
   
   
   bcf   STATUS,RP0         ; Ir banco 0
    bcf   STATUS,RP1

   clrf   PORTA
   clrf   PORTB
   clrf   mem1
   clrf   mem2
   clrf   mem3
;--------------------------------------------------------------------------------------------------------;

BUCLE


;-----------------------------------Secuencia 1------------------------------------------
   
        movlw   d'3'
   movwf   mem3

   secuencia1
   movlw   b'10000000'
   movwf   PORTB
   call   retardo
   

   movlw   b'01000000'
   movwf   PORTB
   call   retardo

   movlw   b'00100000'
   movwf   PORTB
   call   retardo

   movlw   b'00010000'
   movwf   PORTB
   call   retardo

   movlw   b'00001000'
   movwf   PORTB
   call   retardo

   movlw   b'00000100'
   movwf   PORTB
   call   retardo

   movlw   b'00000010'
   movwf   PORTB
   call   retardo

   movlw   b'00000001'
   movwf   PORTB
   call   retardo

   movlw   b'00000010'
   movwf   PORTB
   call   retardo   

   movlw   b'00000100'
   movwf   PORTB
   call   retardo

   movlw   b'00001000'
   movwf   PORTB
   call   retardo

   movlw   b'00010000'
   movwf   PORTB
   call   retardo

   movlw   b'00100000'
   movwf   PORTB
   call   retardo

   movlw   b'01000000'
   movwf   PORTB
   call   retardo

   movlw   b'10000000'
   movwf   PORTB
   call   retardo

   
   decfsz   mem3,1
   goto   secuencia1




;----------------------------------secuencia 2----------------------------------------
   
   movlw   d'3'
   movwf   mem3

   secuencia2
   movlw   b'00001111'
   movwf   PORTB
   call   retardo2

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2

   movlw   b'00001111'
   movwf   PORTB
   call   retardo2

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2

   movlw   b'00001111'
   movwf   PORTB
   call   retardo2

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2

   movlw   b'11110000'
   movwf   PORTB
   call   retardo2

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2

   movlw   b'11110000'
   movwf   PORTB
   call   retardo2

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2
   
   movlw   b'11110000'
   movwf   PORTB
   call   retardo2

   
   
   decfsz   mem3,1
   goto   secuencia2
;-----------------------------------Secuencia 3------------------------------------------
   
        movlw   d'7'
   movwf   mem3

   secuencia3
   movlw   b'00011000'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00111100'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'01111110'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'11111111'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2
   call   retardo2
   
   decfsz   mem3,1
   goto   secuencia3

;-----------------------------------Secuencia 4-----------------------------------------
   
        movlw   d'3'
   movwf   mem3

   secuencia4
   movlw   b'10000000'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'01000000'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00100000'
   movwf   PORTB
   call   retardo2
   call   retardo2


   movlw   b'00010000'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00001000'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00000100'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00000010'
   movwf   PORTB
   call   retardo2
   call   retardo2

   movlw   b'00000001'
   movwf   PORTB
   call   retardo2
   call   retardo2


   
   decfsz   mem3,1
   goto   secuencia4

;-----------------------------------Secuencia 5------------------------------------------
   
        movlw   d'8'
   movwf   mem3

   secuencia5
   call   retardo2
   movlw   b'11111111'
   movwf   PORTB
   call   retardo2
   call   retardo2
   

   movlw   b'00000000'
   movwf   PORTB
   call   retardo2
   call   retardo2

      
   decfsz   mem3,1
   goto   secuencia5







   goto   BUCLE

   
   
   
;-------------------------------RETARDOS---------------------------------------------   
retardo
movlw   d'60'
movwf   mem2

arranque
bcf   STATUS,Z

movlw   b'11111111'
movwf   mem1
coso
decfsz   mem1,1
goto   coso
bcf   STATUS,Z

movlw   b'11111111'
movwf   mem1
coso1
decfsz   mem1,1
goto   coso1

decfsz   mem2,1
goto   arranque

return

retardo2
movlw   d'80'
movwf   mem2

arranque2
bcf   STATUS,Z

movlw   b'11111111'
movwf   mem1
coso20
decfsz   mem1,1
goto   coso20
bcf   STATUS,Z

movlw   b'11111111'
movwf   mem1
coso21
decfsz   mem1,1
goto   coso21

decfsz   mem2,1
goto   arranque2

return
;--------------------------------------------------------------------------------------------------------;


envio
   
   retfie   
   

END
« Última modificación: 22 de Junio de 2015, 08:26:08 por Jimmygus »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No corre el programa completo
« Respuesta #1 en: 22 de Junio de 2015, 12:02:07 »
Hola Jimmygus no soy tan bueno como la mayoria de la gente que hay en el foro pero para empezar la secuencia 1 y secuencia 4 las realizaria con rotaciones a derecha e izquierda y te ahorrarias codigo, algo asi:
Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;    Notes:  Rota hacia la derecha los bits de un registro seleccionado       *
  4. ;            por el programador. El destino de la operación se puede elegir.  *
  5. ;            Cada rotación equivale a dividir por 2 si el bit C del           *
  6. ;            registro STATUS es 0.                                            *
  7. ;                                                                             *
  8. ;                                                                             *
  9. ;******************************************************************************
  10. ;                                                                             *
  11. ;    Revision History:                                                        *
  12. ;                                                                             *
  13. ;******************************************************************************
  14.  
  15. ;------------------------------------------------------------------------------
  16. ; PROCESSOR DECLARATION
  17. ;------------------------------------------------------------------------------
  18.  
  19.      LIST      p=16F88              ; list directive to define processor
  20.      #INCLUDE <p16f88.inc>          ; processor specific variable definitions
  21.  
  22. ;------------------------------------------------------------------------------
  23. ;
  24. ; CONFIGURATION WORD SETUP
  25. ;
  26. ; The 'CONFIG' directive is used to embed the configuration word within the
  27. ; .asm file. The lables following the directive are located in the respective
  28. ; .inc file.  See the data sheet for additional information on configuration
  29. ; word settings.
  30. ;
  31. ;------------------------------------------------------------------------------
  32.  
  33.      __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
  34.      __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
  35.  
  36.      ERRORLEVEL -207
  37.      ERRORLEVEL -302
  38. ;------------------------------------------------------------------------------
  39. ;
  40. ; VARIABLE DEFINITIONS
  41. ;
  42. ; Available Data Memory divided into Bank 0 through Bank 3.  Each Bank contains
  43. ; Special Function Registers and General Purpose Registers at the locations
  44. ; below:
  45. ;
  46. ;           SFR           GPR               SHARED GPR's
  47. ; Bank 0    0x00-0x1F     0x20-0x6F         0x70-0x7F
  48. ; Bank 1    0x80-0x9F     0xA0-0xEF         0xF0-0xFF
  49. ; Bank 2    0x100-0x10F   0x110-0x16F       0x170-0x17F
  50. ; Bank 3    0x180-0x18F   0x190-0x1EF       0x1F0-0x1FF
  51. ;
  52. ;------------------------------------------------------------------------------
  53.  
  54.     VARIABLES UDATA_SHR
  55.     Temp1 res 1     ; Reservamos '1' byte para la variable Temp
  56.  
  57.     Num1    equ     b'00001000'
  58.  
  59. ;------------------------------------------------------------------------------
  60. ; RESET VECTOR
  61. ;------------------------------------------------------------------------------
  62.  
  63. RESET     ORG     0x0000            ; processor reset vector
  64.           PAGESEL START
  65.           GOTO    START             ; go to beginning of program
  66.  
  67. ;------------------------------------------------------------------------------
  68. ; MAIN PROGRAM
  69. ;------------------------------------------------------------------------------
  70.  
  71. START
  72. ;Configuramos el oscilador interno para 4MHz
  73.         banksel     OSCCON
  74.         bsf         OSCCON,IRCF2
  75.         bsf         OSCCON,IRCF1
  76.         bcf         OSCCON,IRCF0
  77.  
  78. ;Realizamos la operacion de rotacion a la derecha
  79. Rota:   clrw                    ; Inicializamos el registro W
  80.         movlw       Num1        ; Cargamos en W el valor 8 en binario
  81.         movwf       Temp1       ; Guardamos en Temp1 el valor de la constante Num1
  82.         bcf         STATUS,C    ; Ponemos a 0 el bit C
  83.         rrf         Temp1,w     ; Rotamos a la derecha el valor de Temp y guardamos en W
  84.         clrf        Temp1       ; Inicializamos la variable Temp1
  85.         goto        Rota
  86.  
  87.         END
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: No corre el programa completo
« Respuesta #2 en: 22 de Junio de 2015, 15:28:08 »
Yo probe las rutinas de retardo y me encontre que a 4Mhz los retardos son de :

retardo = 92ms = 0.092s
retardo2 = 123ms = 0.12s

es correcto ?

Tal ves es tan rapido que no ves que ocurren, yo pobria con 0.5s por ejemplo, en todas las secuencias como minimo, y luego si le bajas el retardo

Me fui al retardo por que no veo que este mal realizado el programa, si se puede mejorar como lo hizo Miguel_S
Por otro lado unas cosas a corregirte:

Código: ASM
  1. org   0x00   ; Origen del codigo
  2.  
  3.    nop   ; No operacion
  4.    nop   ; No operacion
  5.    goto   ala
  6.  
  7. org   0x04   ;Atiendo interrupcion
  8.    goto   envio
  9.  
  10. ala
  11. org    0x05

por:

Código: ASM
  1. org   0x00   ; Origen del codigo
  2.   goto   ala
  3. org   0x04   ;Atiendo interrupcion
  4.    goto   envio
  5.  
  6. ala

ala se va a acomodar donde debe. es decir despues del goto, no hace falta que le pongas org 0x05.

Y si no vas a usar las interrupciones, el "retfie" te activa las interrupciones globales (pone a 1 el bit GIE), asi que mejor un "return" es decir:

Código: ASM
  1. envio
  2.    return
 

O directamente reemplaza el "goto envio" por un "return" luego del org 0x04

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No corre el programa completo
« Respuesta #3 en: 23 de Junio de 2015, 04:42:13 »
Hola Jimmygus siguiendo con lo de la rotación yo escribiria algo como esto:
Código: ASM
  1. MOVLW 0xff              ; PORTB 11111111.
  2.         MOVWF PORTB             ;
  3.         BCF STATUS,C    ;Preparado para rotar
  4.  
  5.  ; PORTB Rota hacia la izquierda, usamos la instrupcion ROTAR
  6.  
  7. gira_izq:       BTFSC PORTB,7   ;si el bit7 = 0 salta y rota a derecha
  8.         GOTO sigue_i    ;no, sigue izquierda.
  9.         GOTO gira_d     ;
  10. sigue_izq:
  11.         RLF PORTB,F     ;rota archivo F a izq. (F = '1110')
  12.         CALL delay      ;
  13.         BTFSC PORTB,0   ;salta y rota si bit0 = 0
  14.         GOTO gira_i    
  15.         BSF PORTB,7
  16.  ; PORTB Rota hacia la derecha
  17. gira_dcha:      BTFSC PORTB,0   ;salta y rota si bit0 = 0
  18.         GOTO sigue_d
  19.         GOTO gira_i
  20. sigue_dcha:
  21.         RRF PORTB,F
  22.         CALL delay
  23.         GOTO gira_d
y con la secuencia 2 un intercambio de nibple usando la instruccion swapf, si es posible, porque no se si solo trabaja de alto a bajo o por el contrario puede funcionar de low a high.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: No corre el programa completo
« Respuesta #4 en: 23 de Junio de 2015, 06:06:10 »
Solo por diversion:

Código: ASM
  1. ;-----------------------------------Secuencia 1------------------------------------------
  2.    
  3.         movlw   d'3'
  4.         movwf   mem3
  5.  
  6.         CLRF    PORTB
  7.         BSF     STATUS,C
  8. secuencia1
  9.         RRF     PORTB,F
  10.         CALL    retardo
  11.         BTFSS   PORTB,0
  12.         GOTO    secuencia1
  13. secuencia1_aux
  14.         RLF     PORTB,F
  15.         CALL    retardo
  16.         BTFSS   PORTB,7
  17.         GOTO    secuencia1_aux
  18.  
  19.         decfsz   mem3,1
  20.         goto   secuencia1
  21.  
  22. ;----------------------------------secuencia 2----------------------------------------
  23.    
  24.         movlw   d'3'
  25.         movwf   mem3
  26.  
  27. secuencia2
  28.         MOVLW   b'00001111'     ; 0x0F
  29.         MOVWF   PORTB
  30.         CALL    retardo2
  31.         CLRF    PORTB           ; 0x00
  32.         CALL    retardo2
  33.         ADDWF   PORTB,F         ; 0x0F
  34.         CALL    retardo2
  35.         CLRF    PORTB           ; 0x00
  36.         CALL    retardo2
  37.         ADDWF   PORTB,F         : 0x0F
  38.         CALL    retardo2
  39.         MOVLW   b'11110000'     ; 0xF0
  40.         MOVWF   PORTB
  41.         CALL    retardo2
  42.         CLRF    PORTB           ; 0x00
  43.         CALL    retardo2
  44.         ADDWF   PORTB,F         ; 0xF0
  45.         CALL    retardo2
  46.         CLRF    PORTB           ; 0x00
  47.         CALL    retardo2
  48.         ADDWF   PORTB,F         ; 0xF0
  49.         CALL    retardo2
  50.  
  51.  
  52.         decfsz   mem3,1
  53.         goto   secuencia2
  54.  
  55. ;-----------------------------------Secuencia 3------------------------------------------
  56.    
  57.         movlw   d'7'
  58.         movwf   mem3
  59.  
  60. secuencia3
  61.         movlw   b'00011000'
  62.         movwf   PORTB
  63.         call   retardo2
  64.         call   retardo2
  65.  
  66.         movlw   b'00111100'
  67.         movwf   PORTB
  68.         call   retardo2
  69.         call   retardo2
  70.  
  71.         movlw   b'01111110'
  72.         movwf   PORTB
  73.         call   retardo2
  74.         call   retardo2
  75.  
  76.         movlw   b'11111111'
  77.         movwf   PORTB
  78.         call   retardo2
  79.         call   retardo2
  80.  
  81.         CLRF   PORTB
  82.         CALL   retardo2
  83.         CALL   retardo2
  84.    
  85.         decfsz   mem3,1
  86.         goto   secuencia3
  87.  
  88. ;-----------------------------------Secuencia 4-----------------------------------------
  89.    
  90.         movlw   d'3'
  91.         movwf   mem3
  92.  
  93.         CLRF    PORTB
  94.         BSF     STATUS,C       
  95. secuencia4
  96.         RRF     PORTB,F
  97.         CALL    retardo2
  98.         CALL    retardo2
  99.         BTFSS   PORTB,0
  100.         GOTO    secuencia4
  101.    
  102.         decfsz   mem3,1
  103.         goto   secuencia4
  104.  
  105. ;-----------------------------------Secuencia 5------------------------------------------
  106.    
  107.         movlw   d'16'   // 2x por que uso el complemento.
  108.         movwf   mem3
  109.  
  110.         CLRF    PORTB
  111. secuencia5
  112.         COMF    PORTB,F
  113.         CALL   retardo2
  114.         CALL   retardo2
  115.  
  116.         decfsz   mem3,1
  117.         goto   secuencia5

La unica que encontre dificil o tal ves que implique mas instrucciones es la 3, achichar si se puede pero no se ganaria mucho y perderia mucho tiempo en CALLs