title: how can I set a timer overflow for ATmega328p in assembly?
body: <p>I've been trying to create a program in assembly that rotate a single bit either to left or right, every time a Timer Overflow interrupt occurs. Here is my code, but for some reason it doesn't works. I'm new in this world of programming assembly and I wish that someone could help me here, because I'm stuck. Here is my code:</p>
  
  <pre><code>/*
   * lab3b.asm
   *
   *  Created: 10/18/2014 8:03:22 PM
   *   Author: Isaac Vilchez
   */ 
  
  .include "m328pdef.inc"
  .org 0x0000 jmp main
  .org 0x0020 jmp TIM0_OVF_ISR
  
  main:
      .org 0x0033
  
  //Config de Stack Pointer y Timer0
      ldi R16, high(RAMEND)
      out SPH, R16
      ldi R16, low(RAMEND)
      out SPL, R16
      sei
  
  //Inicializando los puertos D y B como salida
  ldi r16, 0x00
  out DDRC, r16
  ldi r16, 0xFF
  out DDRD, r16
  out DDRB, r16
  
  //Configurando timer0 al intervalo maximo de duracion al timer0
      ldi R19, 0x00
      out TCNT0, R19 //Para que el conteo empiece en 0
      ldi R20, 0x05
      out TCCR0B, R20
      ldi R23, 0x01
      sts TIMSK0, R23 //habitlita el timer0
  
  //Registros proposito general
  ldi r16, 0x01   ;registro puerto D
  ldi r22, 0x10   ;mascara para ejecutar rot_izqPB
  ldi r23, 0x80   ;mascara PD
  ldi r20, 0x01   ;registro puerto B
  ldi r21, 0x00   ;mascara de 0
  
  out PORTB, r21  ;Posicion inicial puerto B
  out PORTD, r21  ;Posicion inicial puerto D
  
  //Cargando a R16 con 0x01 para comenzar la rotacion hacia la izquierda
  TIM0_OVF_ISR:
      in r24, PINC    ;Se guarda el valor del puerto C en R24
      andi r24, 0x01  ;Se enmascara el puerto C
      cpi r24, 0x01   ;Se compara con 0x01 para ver su estado
      breq rot_derPB  ;Si esta encendido, rota a la derecha
      rjmp rot_izqPD  ;Si esta apagado rota a la izquierda
  
  
  //Rotacion hacia la izquierda
  rot_izqPD:
      ldi r16, 0x01
      rjmp rot_izqPD1
  
  rot_izqPD1:
      out PORTD, r16
      cpi r16, 0x00
      breq rot_izqPB
      ROL r16
      rjmp wait
  
  //Rotacion hacia la izquierda
  rot_izqPB:
      ldi r20, 0x01
      rjmp rot_izqPB1
  
  rot_izqPB1:
      out PORTB, r20
      LSL r20
      cp r20, r22
      breq rot_izqPB1
      rjmp wait
  
  //Rotacion hacia la derecha
  rot_derPB:
      ldi r16, 0x08
      rjmp rot_derPB1
  
  rot_derPB1:
      out PORTB, r16
      LSR r16
      cpi r16, 0x00
      breq rot_derPD
      rjmp wait
  
  //Rotacion hacia la derecha
  rot_derPD:
      ldi r16, 0x80
  
  rot_derPD1:
      out PORTB, r21
      out PORTD, r16
      LSR r16
      cp r16, r21
      ;breq wait
      rjmp wait
  
  wait:
      brvs TIM0_OVF_ISR
      rjmp wait
  </code></pre>
  
  <p>EDIT:
   Here is my new code. This one is working:</p>
  
  <pre><code>/*
   * lab3b.asm
   *
   *  Created: 10/18/2014 8:03:22 PM
   *   Author: Isaac Vilchez
   */ 
  
  .include "m328pdef.inc"
  .org 0x0000 jmp begin
  .org 0x0020 jmp TIM0_OVF_ISR
  
  begin:
      .org 0x0033
  
  //Config de Stack Pointer y Timer0
  ldi R16, high(RAMEND)
  out SPH, R16
  ldi R16, low(RAMEND)
  out SPL, R16
  
  //Inicializando los puertos D y B como salida
  ldi r16,    0x00
  out DDRC,   r16
  ldi r16,    0xFF
  out DDRD,   r16
  out DDRB,   r16
  
  //Configurando timer0 al intervalo maximo de duracion al timer0
  ldi R19,    0x00
  out TCNT0,  R19 //Para que el conteo empiece en 0
  ldi R20,    0x05
  out TCCR0B, R20
  ldi R23,    0x01
  sts TIMSK0, R23 //habitlita el timer0
  
  //Habilitando las interrupciones globales
  SEI
  
  //Configuracion de Registros
  main:
      ldi r16, 0x01
      ldi r17, 0x00
      ldi r19, 0x80
      mov r20, r16
      ldi r21, 0
      mov r23, r19
      ldi r25, 0x01
  
  //Loop de espera en lo que se realiza la interrupcion
  wait:
      rjmp wait
  
  //Enciende el led de PB4 y espera a la interrupcion
  onPB:
      ldi r22, 0x80
      out PORTB, r22
      rjmp wait
  
  //Enciende el led de PB4 y espera a la interrupcion
  ledpb4:
      ldi r22, 0x80
      out PORTB, r22
      reti
  
  reset:
      ldi r16,    0x01
      ldi r18,    0x08
      ldi r19,    0x80
      mov r20,    r16
      ldi r21,    0
      mov r23,    r19
      reti
  
  //Rotacion hacia la izquierda
  rot_izqPD:
      out PORTB,  r21
      out PORTD,  r16
      ldi r17, 0x00
      LSL r16
      cp  r16,    r17
      breq    rot_izqPB
      reti
  
  //Rotacion hacia la izquierda
  rot_izqPB:
      out PORTB,  r20
      LSL r20
      ldi r17, 0x10
      cp r20, r17
      breq    reset
      reti
  
  //Rotacion hacia la derecha
  rot_derPB:
      out PORTB,  r18
      ldi r17, 0x00
      cp r18, r17
      breq rot_derPD
      LSR r18
      reti
  
  //Rotacion hacia la derecha
  rot_derPD:
      out PORTB,  r21
      out PORTD,  r19
      cp  r19,    r21
      breq reset
      LSR r19
      reti
  
  TIM0_OVF_ISR:
      in  r24,    PINC    ;Se guarda el valor del puerto C en R24
      andi r24,   0x01    ;Se enmascara el puerto C
      cp  r24,    r25     ;Se compara con 0x01 para ver su estado
      breq    rot_derPB   ;Si esta encendido, rota a la derecha
      rcall   rot_izqPD   ;Si esta apagado rota a la izquierda
      reti
  </code></pre>