Advertisement
paulogp

ATmega128: T3 - Utilização de temp / cont e respectiva inter

Jul 13th, 2011
535
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ATmega128: T3 - Utilização de temporizador / contador e respectiva interrupções
  2. ; Utilizando um dos displays de 7 segmentos, prentende-se simular o funcionamento de um dado. Sempre que é accionado um dos switches S1, S2 ou S3, os valor do dado (1 a 6) devem mudar sequencialmente. A activação do switch OFF deve fazer parar o dado ficando visível o último valor simulado.
  3.  
  4. .include <m128def.inc>
  5.  
  6. .cseg
  7. .org 0x1e
  8.     JMP INTERRUPT
  9.  
  10.  
  11. .cseg
  12. .org 0
  13.     JMP MAIN
  14.  
  15. .cseg
  16. .org 0x46
  17.  
  18.  
  19. ; rotina interrupt
  20.  
  21. INTERRUPT:
  22. IN      R0, SREG        ; guarda o SREG
  23. ; divide por 2 e depois por 2, 20 e 200 para dar 50, 10 e 0,5Hz
  24.  
  25.  
  26. DEC     R19             ; divide por 2
  27. BRBC    1, Ciclo1       ; salta se o bi de zero (SREG) = ON
  28. LDI     R19, 2
  29.  
  30. CPI     R22, 0          ; detecta se Stop activo
  31. BRNE    Ciclo2          ; Se sim, coloca 1 no R22, para que possa incrementar o contador
  32. LDI     R22, 1
  33.  
  34.  
  35. Ciclo2:
  36. DEC     R22             ; decrementa
  37. BRBC    1, Ciclo1       ; salta se o bit de zero (SREG) = ON
  38. MOV     R22, R20        ; inicializa o divisor com o valor definido pelas teclas
  39.  
  40.  
  41. ; valor no display
  42. INC     R18
  43. CPI     R18, 7
  44. BRNE    Ciclo1
  45. LDI     R18, 1          ; carrega valor 1 no contador
  46.  
  47. Ciclo1:
  48. OUT     SREG, R0        ; repoe o SREG
  49. RETI
  50.  
  51.  
  52.  
  53.  
  54.  
  55. ; main
  56. MAIN:
  57. ; set up the stack pointer
  58. LDI     R16, LOW(RAMEND) ; Lower byte
  59. OUT     spl, r16        ; to stack pointer
  60. LDI     r16, HIGH(RAMEND) ; Upper byte
  61. OUT     sph, r16        ; to stack pointer
  62.  
  63. ; configura entradas / saidas
  64. LDI     R16, 0xC0       ; configura porta A Porta A, Bit0 a 5 definidos como entradas,
  65. OUT     DDRA, R16       ; bits 6 e 7 definidos como saidas, para seleccao do digito 7 seg.
  66. OUT     PORTA, R16      ; desactiva pull-ups nas entradas da porta A e coloca bits 6 e 7 a ON
  67. LDI     R16, 0xFF
  68. OUT     DDRC, R16       ; configura porta C como saidas
  69. OUT     PORTC, R16      ; coloca todas as saidas a ON (leds a OFF)
  70.  
  71. ; configura contador 2
  72. ; f = 16MHz
  73. ; prescaler = 1024
  74. ; N = 77
  75.  
  76. LDI     R16, 0b00001111 ; TC0 em modo 2, prescaler=1024
  77. ; prescaler (bit 0, 1 e 2 -ON)
  78. ; modo 2 (bit 3-ON, bit 6-OFF)
  79. ; OC0 disconected (Bit 4 e 5 a OFF)
  80. OUT     TCCR0, R16      ; resulta uma frequencia de 200, 3205Hz (+/- 5ms)
  81.  
  82. LDI     R16, 77         ; N=77 (frequencia de 200, 3205Hz, +/- 5ms)
  83. OUT     OCR0, R16
  84.  
  85. IN      R16, TIMSK      ; enable da interrupcao de output compare
  86. ORI     R16, 0b00000010
  87. OUT     TIMSK, R16
  88.  
  89.  
  90. LDI     R18, 0x01       ; inicializa o registo do contador com o valor 1
  91. ; R18 e o contador do dado
  92.  
  93. LDI     R19, 2          ; inicializa valor de divisor de frequencia (2) por software
  94. LDI     R20, 0          ; inicializa valor de divisor de frequencia (0) por software
  95. LDI     R21, 0
  96. LDI     R22, 2          ; inicializa valor de divisor de frequencia (2) por software
  97.  
  98. SEI                     ; activa interrupts do TC0
  99.  
  100.  
  101.  
  102.  
  103. CICLO:
  104. IN      R17, PINA       ; le estado dos interruptores
  105. SBRS    R17, 0          ; se tecla 1 premida define ciclo de 500ms (50Hz)
  106. LDI     R20, 2          ; define-se o valor do divisor em 2
  107. SBRS    R17, 1          ; se tecla 2 premida define ciclo de 100ms (10Hz)
  108. LDI     R20, 10         ; define-se o valor do divisor em 20
  109. SBRS    R17, 2          ; se tecla 3 premida define ciclo de 5ms (0,5Hz)
  110. LDI     R20, 200        ; define-se o valor do divisor em 200
  111. SBRS    R17, 5          ; se tecla 6 premida, desliga saida
  112. LDI     R20, 0          ; define-se o valor de R21=0 (Impede a diferenca na comparacao seguinte)
  113.  
  114. CP      R20, R21        ; detecta se e a 1a vez que muda
  115. BREQ    AVANCA
  116. MOV     R21, R20
  117. MOV     R22, R20
  118.  
  119. AVANCA:
  120. CPI     R20, 0          ; verifica se R20 e Zero
  121. BREQ    CICLO           ; se for, repete ciclo (salta para)
  122.  
  123.  
  124. ; afixa valor do digito
  125. LDI     ZH, HIGH(TABELA << 1)   ; carrega em Z o endereco do inicio da tabela de dados
  126. LDI     ZL, LOW(TABELA << 1)
  127.  
  128. ADD     ZL, R18         ; soma o valor do contador
  129. BRCC    SOMA
  130. INC     ZH
  131.  
  132. SOMA:
  133. LPM     R16, Z          ; vai buscar o Byte com o endereco de R16
  134. OUT     PORTC, R16      ; coloca codigo na saida p/ display
  135.  
  136.  
  137. JMP     CICLO  
  138.  
  139.  
  140.  
  141.  
  142. TABELA:
  143. .db 0x0C, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement