Autor Tema: ASM desde 0  (Leído 89193 veces)

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

Desconectado LITRIMA

  • PIC10
  • *
  • Mensajes: 4
Re: ASM desde 0
« Respuesta #45 en: 13 de Junio de 2013, 18:18:26 »
Hola LITRIMA, este es el codigo adaptado para el 16F887 no he podido probarlo porque me falta la rutina de temporizacion de 1 segundo y la de retardos, de todas formas para simularlo en proteus, 1 segundo es mucho, deberias hacer una temporizacion menor.
Acostumbrate por norma postearlo en el foro asi todos compartimos.
Código: ASM
  1. ; Programa de control del posicionamiento de un servomotor Futaba S3003. Controla el ángulo
  2. ; mediante una señal cuadrada PWM de 20 ms de periodo que se aplica a su línea de control.
  3. ; El ángulo es gobernado por el tiempo en alto de la señal cuadrada desde 0º (para 0,3 ms
  4. ; de tiempo en alto), hasta 180º (para un tiempo en alto de 2,1 ms).
  5. ;
  6. ; En este programa el servomotor se posiciona en 0º, 90º, 180º, vuelve a 90º y repite el ciclo.
  7. ; Permanece en cada posición durante 1 s. El funcionamiento se explica en la siguiente tabla
  8. ; donde se ha tomado como tiempo patrón 100 µs (0,1 ms) conseguidos mediante interrupciones
  9. ; por desbordamiento del Timer 0.
  10. ;
  11. ;                      Tiempo Alto      Tiempo Bajo               Angulo
  12. ;       FactorAlto         0,1·FactorAlto   0,1·(200-FactorAlto)      (Grados)
  13. ;       ------------      --------------   ----------------------      ---------
  14. ;         3                0,3 ms           19,7 ms                      0º
  15. ;         12                1,2 ms          18,8 ms                   90º
  16. ;          21                2,1 ms          17,9 ms                  180º
  17. ;         12                1,2 ms          18,8 ms                   90º
  18. ;
  19. ; ZONA DE DATOS **********************************************************************
  20.  
  21.    LIST      P=16F887
  22.    INCLUDE      <P16F887.INC>
  23.          __CONFIG _CONFIG1, _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_ON & _FCMEN_ON & _LVP_ON
  24.     __CONFIG _CONFIG2, _WRT_OFF & _BOR40V
  25.    
  26.         ERRORLEVEL -302
  27.        
  28.    CBLOCK  0x0C
  29.    Contador
  30.    FactorAlto                   ; Factor por el que se va a multiplicar el tiempo
  31.    ENDC                         ; patrón de 100 µs para obtener el tiempo en alto.
  32.  
  33. TMR0_CARGA   EQU   d'256'-d'90'         ; Valor obtenido experimentalmente con la ventana
  34.                                                         ; Stopwatch para un tiempo de 100 µs.
  35.  
  36. ; ZONA DE CÓDIGOS ********************************************************************
  37.  
  38.    ORG    0
  39.       goto   Inicio
  40.    ORG   .4
  41.    goto   Timer0_Interrupcion
  42.    
  43. Inicio
  44.         banksel         PORTB
  45.         clrf            PORTB                           ; Inicializamos PORTB
  46.         banksel         ANSEL
  47.         clrf            ANSEL                           ; Entradas/Salidas digitales
  48.         bcf             STATUS,RP1                      ; Banco 1
  49.         banksel         TRISB
  50.         clrf            TRISB                           ; Puerto B todo salidas                        
  51.         movlw           b'00001000'         ; TMR0 sin prescaler.
  52.         movwf           OPTION_REG
  53.         bcf             STATUS,RP0
  54.         movlw           b'10100000'
  55.         movwf           INTCON                  ; Autoriza interrupción T0I y la general (GIE).
  56.         clrf            Contador
  57.        
  58. Principal
  59.    movf   Contador,W
  60.    andlw   b'00000011'
  61.    call   SeleccionaFactorAlto
  62.    movwf   FactorAlto
  63.    call   Retardo_1s
  64.    incf   Contador,F
  65.    goto   Principal
  66.  
  67. SeleccionaFactorAlto
  68.    addwf   PCL,F
  69.    DT   d'3', d'12', d'21', d'12'   ; Tabla para el servo Futaba S3003.
  70.  
  71. ; Subrutina "Timer0_Interrupcion" -------------------------------------------------------
  72. ;
  73. ; Mantiene la salida en alto un tiempo igual a 100µs x (FactorAlto) y en bajo un tiempo igual
  74. ; a 100µs x (200-FactorAlto). El periodo de la señal cuadrada lo mantiene en 20 ms.
  75. ;
  76.    CBLOCK  
  77.    Guarda_W
  78.    Guarda_STATUS
  79.    Timer0_ContadorA            ; Contador auxiliar.
  80.    ENDC
  81.  
  82. Timer0_Interrupcion
  83.    movwf   Guarda_W            ; Guarda los valores de tenían W y STATUS en el
  84.    swapf   STATUS,W            ; programa principal.
  85.    movwf   Guarda_STATUS
  86.    bcf      STATUS,RP0            ; Garantiza que trabaja en el Banco 0.
  87.    movlw    TMR0_CARGA
  88.    movwf    TMR0
  89.    decfsz    Timer0_ContadorA,F      ; Decrementa el contador.
  90.    goto    Fin_Timer0_Interrupcion
  91.    btfsc    PORTB,0               ; Testea el anterior estado de la salida.
  92.    goto    EstabaAlto
  93. EstabaBajo
  94.    bsf      PORTB,0               ; Estaba bajo y lo pasa a alto.
  95.    movf   FactorAlto,W         ; Repone el contador nuevamente con el tiempo en
  96.    movwf    Timer0_ContadorA      ; alto.
  97.    goto    Fin_Timer0_Interrupcion
  98. EstabaAlto
  99.    bcf    PORTB,0               ; Estaba alto y lo pasa a bajo.
  100.    movf   FactorAlto,W         ; Repone el contador nuevamente con el tiempo
  101.    sublw   .200               ; en bajo.
  102.    movwf    Timer0_ContadorA      ; El periodo será de 100µs·200=20000µs=20ms.
  103. Fin_Timer0_Interrupcion
  104.    swapf   Guarda_STATUS,W         ; Restaura registros W y STATUS.
  105.    movwf   STATUS
  106.    swapf   Guarda_W,F
  107.    swapf   Guarda_W,W
  108.    bcf      INTCON,RBIF
  109.    bcf      INTCON,T0IF
  110.    retfie
  111.    
  112.    INCLUDE <RETARDOS.INC>
  113.    END
Saludos!

PD: Llevo tiempo sin jugar con asembler, seria bueno que alguien con mas experiencia diera su opinion.


Hola Miquel_S, perdona pero no he podido probar el código hasta hoy.
La compilación perfecta, sin errores, lo pruebo en proteus y no funciona.
El archivo original con el pic16f84a funciona bien y se simula perfectamente en Proteus, te adjunto códigos originales para probar.
Estoy empezando con la programación y lo que pretendo es aprender a migrar ejemplos del Pic16f84a al Pic16f887 para simularlos.
Gracias.

Saludos-----
« Última modificación: 13 de Junio de 2013, 18:24:53 por LITRIMA »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ASM desde 0
« Respuesta #46 en: 13 de Junio de 2013, 23:34:42 »
En el 16F887 la memoria para registros de propósito general (los que el usuario programador utiliza para guardar valores de su programa) arranca en la posición 0x20, no en la 0x0C.

Cambia:
   CBLOCK  0x0C

por
    CBLOCK  0x20

Igualmente, el 16F887 tiene mucho más periféricos y puede faltar alguna que otra inicialización o apagado de periféricos adicional.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado jorgenuviola

  • PIC16
  • ***
  • Mensajes: 148
    • rat argentina!!
Re: ASM desde 0
« Respuesta #47 en: 11 de Septiembre de 2014, 16:21:19 »
muy claro y muy bueno para principiantes como yo que no entendemos nada y estamos por empezar con esto, ubica muy bien al principiante, porque ayuda a imaginarse el programa, todo bien con la logica pero por mas que este clara la explicacion si no hay ayuda con plasmar materialmente con ejemplos como funciona se hace mas dificil.

muy buenos tutoriales, ideal para todos