Advertisement
paulogp

ATmega128: FLIP-FLOP de LEDs a várias frequências

Jul 13th, 2011
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; FLIP-FLOP de LEDs a várias frequências dependendo do switch premido
  2.  
  3. .include <m128def.inc>
  4.  
  5. .cseg
  6.  
  7. .org 0x00               ; vector: reset
  8.     jmp main
  9. .org 0x1E               ; vector: interrupcao timer/counter
  10.     jmp subrotina
  11. .org 0x46
  12.  
  13. init:
  14.     ldi r16, 77             ; carrega 77 em r16
  15.     out OCR0, r16           ; passa 77 para OCR0
  16.     in r16, TIMSK           ; TC0, OCIE0 compara OCR0 e valor contador
  17.     ori r16, 2              ; "ou"
  18.     out TIMSK, r16          ; enable timer output compare interrupt
  19.  
  20.     ldi r16, 0x08           ; 0b00001000, TC0: modo 2CTC, timer off
  21.     out TCCR0, r16          ; enable timer output compare interrupt
  22.  
  23.     ldi r17, 0x01           ; 0b00000001
  24.     out DDRC, r17           ; PORTC como saida dados (LED)
  25.  
  26.     ser r17             ; = ldi r17, 0b11111111, 0xFF
  27.     out PORTC, r17          ; leds apagados
  28.  
  29.     clr r16             ; = ldi r16,0b00000000, 0x00
  30.     out DDRA, r16           ; PORTA como entrada
  31.  
  32.     sei                 ; activa interrupcoes globais
  33.     ret                 ; return
  34.  
  35.  
  36. subrotina:
  37.     push r17
  38.     in r20, SREG
  39.     dec r18
  40.     brne end_
  41.     in r17, PORTC
  42.     com r17                 ; complementa r17 0PINA 0 25-1-0-1
  43.     out PORTC, r17
  44.     mov r18, r19
  45.  
  46.  
  47. end_:
  48.     out SREG,r20
  49.     pop r17
  50.     reti ; return
  51.  
  52.  
  53. main:
  54.     ldi r16,0xff            ; stack pointer
  55.     out SPL,r16
  56.     ldi r16,0x10
  57.     out SPH,r16
  58.     call init
  59.  
  60. ; f1 = 100
  61. sw1:
  62.     in r16, PINA
  63.     andi r16, 0x01          ; 0b00000001, verifica SW1
  64.     brne sw2                ; se sw1 nao activo verifica sw2
  65.     ldi r18, 100
  66.     mov r19, r18
  67.     ldi r16, 0x0F           ; 0b00001111, TC0: modo 2CTC, prescaler 1024
  68.     out TCCR0, r16
  69.     jmp sw1             ; volta a ler sw1
  70.  
  71. ; f2 = 50
  72. sw2:
  73.     in r16, PINA
  74.     andi r16, 0x02          ; 0b00000010, verifica SW2
  75.     brne sw3                ; se sw2 nao activo verifica sw3
  76.     ldi r18, 50
  77.     mov r19, r18
  78.     ldi r16, 0x0F           ; 0b00001111, TCO: modo 2CTC,, prescaler 1024
  79.     out TCCR0, r16
  80.     jmp sw1
  81.  
  82. ; f3 = 25
  83. sw3:
  84.     in r16, PINA
  85.     andi r16, 0x04          ; 0b00000100, verifica SW3
  86.     brne sw6                ; se sw2 nao activo verifica sw3
  87.     ldi r18, 25
  88.     mov r19, r18
  89.     ldi r16, 0x0F           ; 0b00001111, TCO: modo 2CTC,, prescaler 1024
  90.     out TCCR0, r16
  91.     jmp sw1
  92.  
  93. ; off
  94. sw6:
  95.     in r16, PINA            ; verifica sw6
  96.     andi r16, 0x20          ; 0b00100000, se sw6 nao activo verifica sw1
  97.     brne sw1
  98.     ldi r16, 0x08           ; 0b00001000, TCO: modo 2CTC,, prescaler 1024
  99.     out TCCR0, r16
  100.     ser r17             ; apagar Led's
  101.     out PORTC, r17
  102.     jmp sw1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement