Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ATmega128: T3 - Utilização de temporizador / contador e respectiva interrupções
- ; 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.
- .include <m128def.inc>
- .cseg
- .org 0x1e
- JMP INTERRUPT
- .cseg
- .org 0
- JMP MAIN
- .cseg
- .org 0x46
- ; rotina interrupt
- INTERRUPT:
- IN R0, SREG ; guarda o SREG
- ; divide por 2 e depois por 2, 20 e 200 para dar 50, 10 e 0,5Hz
- DEC R19 ; divide por 2
- BRBC 1, Ciclo1 ; salta se o bi de zero (SREG) = ON
- LDI R19, 2
- CPI R22, 0 ; detecta se Stop activo
- BRNE Ciclo2 ; Se sim, coloca 1 no R22, para que possa incrementar o contador
- LDI R22, 1
- Ciclo2:
- DEC R22 ; decrementa
- BRBC 1, Ciclo1 ; salta se o bit de zero (SREG) = ON
- MOV R22, R20 ; inicializa o divisor com o valor definido pelas teclas
- ; valor no display
- INC R18
- CPI R18, 7
- BRNE Ciclo1
- LDI R18, 1 ; carrega valor 1 no contador
- Ciclo1:
- OUT SREG, R0 ; repoe o SREG
- RETI
- ; main
- MAIN:
- ; set up the stack pointer
- LDI R16, LOW(RAMEND) ; Lower byte
- OUT spl, r16 ; to stack pointer
- LDI r16, HIGH(RAMEND) ; Upper byte
- OUT sph, r16 ; to stack pointer
- ; configura entradas / saidas
- LDI R16, 0xC0 ; configura porta A Porta A, Bit0 a 5 definidos como entradas,
- OUT DDRA, R16 ; bits 6 e 7 definidos como saidas, para seleccao do digito 7 seg.
- OUT PORTA, R16 ; desactiva pull-ups nas entradas da porta A e coloca bits 6 e 7 a ON
- LDI R16, 0xFF
- OUT DDRC, R16 ; configura porta C como saidas
- OUT PORTC, R16 ; coloca todas as saidas a ON (leds a OFF)
- ; configura contador 2
- ; f = 16MHz
- ; prescaler = 1024
- ; N = 77
- LDI R16, 0b00001111 ; TC0 em modo 2, prescaler=1024
- ; prescaler (bit 0, 1 e 2 -ON)
- ; modo 2 (bit 3-ON, bit 6-OFF)
- ; OC0 disconected (Bit 4 e 5 a OFF)
- OUT TCCR0, R16 ; resulta uma frequencia de 200, 3205Hz (+/- 5ms)
- LDI R16, 77 ; N=77 (frequencia de 200, 3205Hz, +/- 5ms)
- OUT OCR0, R16
- IN R16, TIMSK ; enable da interrupcao de output compare
- ORI R16, 0b00000010
- OUT TIMSK, R16
- LDI R18, 0x01 ; inicializa o registo do contador com o valor 1
- ; R18 e o contador do dado
- LDI R19, 2 ; inicializa valor de divisor de frequencia (2) por software
- LDI R20, 0 ; inicializa valor de divisor de frequencia (0) por software
- LDI R21, 0
- LDI R22, 2 ; inicializa valor de divisor de frequencia (2) por software
- SEI ; activa interrupts do TC0
- CICLO:
- IN R17, PINA ; le estado dos interruptores
- SBRS R17, 0 ; se tecla 1 premida define ciclo de 500ms (50Hz)
- LDI R20, 2 ; define-se o valor do divisor em 2
- SBRS R17, 1 ; se tecla 2 premida define ciclo de 100ms (10Hz)
- LDI R20, 10 ; define-se o valor do divisor em 20
- SBRS R17, 2 ; se tecla 3 premida define ciclo de 5ms (0,5Hz)
- LDI R20, 200 ; define-se o valor do divisor em 200
- SBRS R17, 5 ; se tecla 6 premida, desliga saida
- LDI R20, 0 ; define-se o valor de R21=0 (Impede a diferenca na comparacao seguinte)
- CP R20, R21 ; detecta se e a 1a vez que muda
- BREQ AVANCA
- MOV R21, R20
- MOV R22, R20
- AVANCA:
- CPI R20, 0 ; verifica se R20 e Zero
- BREQ CICLO ; se for, repete ciclo (salta para)
- ; afixa valor do digito
- LDI ZH, HIGH(TABELA << 1) ; carrega em Z o endereco do inicio da tabela de dados
- LDI ZL, LOW(TABELA << 1)
- ADD ZL, R18 ; soma o valor do contador
- BRCC SOMA
- INC ZH
- SOMA:
- LPM R16, Z ; vai buscar o Byte com o endereco de R16
- OUT PORTC, R16 ; coloca codigo na saida p/ display
- JMP CICLO
- TABELA:
- .db 0x0C, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement