Electgpl

8051 - penduloLongPer

Jul 5th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;-------------------------------------------------------------------------------------
  2. ;Programa que muestra periodo entre dos interrupciones externas por flanco, también
  3. ;realiza un calculo para sacar una longitud tomando el valor del período elevándolo
  4. ;al cuadrado y dividiéndolo por 4.
  5. ;Estos valores son mostrados por separado en dos puertos del MCU.
  6. ;
  7. ;                Registro IE      
  8. ; EA | -- | -- | ES | ET1 | EX1 | ET0 | EX0 |  
  9. ;  0    0    0    0     0     0     0     1  
  10. ;  
  11. ;                Registro IP      
  12. ; -- | -- | PT2 | PS | PT1 | PX1 | PT0 | PX0 |  
  13. ;  0    0     0    0     0     0     0     0    
  14. ;
  15. ;                Registro TCON      
  16. ; TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |  
  17. ;  0     0     0     0     0     0     0     1  
  18. ;
  19. ;NOTA: TiempoOscilador: fXLS/Div = 12MHz/12=1us
  20. ;Valor del delay Tiempo[us]/TiempoOscilador[us]=10ms/1us=10000
  21. ;Calculando TLO y THO: 65536-10000=55536 -> D8F0
  22. ;
  23. ;                Registro TMOD      
  24. ; -------TIMER1--------|--------TIMER0--------|
  25. ; GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |  
  26. ;   0     0    0    0      0     0    0    1    
  27. ;
  28. ; Modo  M1  M0
  29. ;   0   0   0   13 bit Timer
  30. ;   1   0   1   16 bit Timer
  31. ;   2   1   0   8 bit Auto-Reload
  32. ;   3   1   1   Split Timer
  33. ;                
  34. ;Archivo: penduloLongPer.s03
  35. ;Fecha de realización: 05/07/2017
  36. ;Autor: Sebastian Caccavallo - electgpl.blogspot.com.ar
  37. ;Modificación:
  38. ;-------------------------------------------------------------------------------------
  39.             ORG     0000H           ;Dirección del origen del programa
  40.             JMP     SETUP           ;Salta al Inicio del programa
  41. ;
  42.             ORG     0003H           ;Dirección de interrupción externa INT0
  43.             JMP     EXT_INT0        ;Salta a subrutina de interrupción
  44. ;  
  45. FLAG        EQU     50H             ;Reserva de dirección para el FLAG.
  46. ;
  47. SETUP:      MOV     TMOD,#01H       ;Configuramos TMOD con 1 (TMR0 - Modo 0) 16bits
  48.             MOV     TCON,#01H       ;Configura IT0 externa por flanco
  49.             MOV     IE,#01H         ;Configura EX0 Interrupción Externa 0
  50.             MOV     IP,#00H         ;Des-habilita prioridad de interrupt
  51.             SETB    EA              ;Habilita interrupción global
  52. ;
  53. LOOP:       CLR     FLAG            ;Ponemos a 0 el FLAG
  54. ESPERA1:    JNB     FLAG,ESPERA1    ;Espera a que el FLAG sea 1
  55.             CALL    TICKTMR         ;Recogemos el valor del contador
  56.             MOV     R0,TH0          ;Guardamos solo la parte Alta
  57.             CLR     FLAG            ;Ponemos a 0 el FLAG
  58. ESPERA2:    JNB     FLAG,ESPERA2    ;Espera a que el FLAG sea 1
  59.             CALL    TICKTMR         ;Recogemos el valor del contador
  60.             MOV     R0,TH0          ;Guardamos solo la parte Alta
  61.             CALL    CALC            ;Procesa el calculo
  62.             MOV     P0,R1           ;Muestra el valor de Longitud en el puerto P0
  63.             MOV     P1,R0           ;Muestra el valor de Período en el puerto P1
  64.             JMP     LOOP            ;Vuelve a iniciar el Loop de forma indeterminada
  65. ;
  66. TICKTMR:    MOV     TL0,#0F0H       ;Configuramos TL0 con F0h
  67.             MOV     TH0,#0D8H       ;Configuramos TH0 con D8h  
  68.             SETB    TR0             ;Start Timer
  69. ESPERA:     JNB     TF0,ESPERA      ;Espera al flag TF0=1 (espera que se desborde)
  70.             CLR     TR0             ;Stop Timer
  71.             CLR     TF0             ;Borra flag TF0                  
  72.             RET                     ;Retorno de Subrutina
  73. ;
  74. CALC:       MOV     A,R0            ;Guardamos valor Leído en el acumulador              
  75.             MOV     B,A             ;Se asigna el valor A en B para hacer el cuadrado.
  76.             MUL     AB              ;Se realiza el cuadrado y se guarda en A.
  77.             MOV     B,#04D          ;Cargamos B con 4 como divisor
  78.             DIV     AB              ;Se realiza la división (A*B)/4
  79.             MOV     R1,A            ;Se guarda el resultado en R1 (Valor del Longitud)
  80.             RET                     ;Retorno de Subrutina
  81. ;
  82. EXT_INT0:   SETB    FLAG            ;Ponemos a 1 el Flag de entrada de INT
  83.             RETI                    ;Retorno de Interrupción
  84. ;
  85.             END                     ;Fin del programa
Add Comment
Please, Sign In to add comment