Circuitos Digitales - contador usando ensamblador atmega

 
Vista:

contador usando ensamblador atmega

Publicado por juan david florez rivas (1 intervención) el 18/04/2007 07:09:42
hola
les pediria el gran favor que me ayudaran en hacer un programa que genere una cuenta decimal del 00 al 99 y del 99 al 00 usando un retardo de 1 segundo..
gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Contador en ensamblador para ATmega

Publicado por Alejandro (117 intervenciones) el 28/08/2023 15:53:33
Aquí tienes un ejemplo de programa en ensamblador para el microcontrolador ATmega que genera una cuenta decimal del 00 al 99 y luego del 99 al 00 con un retardo de 1 segundo entre cada cambio. Este código está escrito en el lenguaje ensamblador AVR, específico para microcontroladores de la familia AVR, como el ATmega.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
.include "m328pdef.inc"
 
.equ DELAY_CYCLES = 1000000 ; Cantidad de ciclos para el retardo de 1 segundo
 
.org 0x0000
    rjmp Reset
 
.org 0x001C
    rjmp Timer1_CompA_ISR
 
Reset:
    ; Configuración de puertos
    ldi r16, (1<<PB0)  ; Configurar PB0 (pin 8) como salida
    out DDRB, r16
 
    ; Configuración de Timer1
    ldi r16, (1<<CTC1) ; Modo de comparación CTC (Clear Timer on Compare Match)
    out TCCR1B, r16
 
    ldi r16, (1<<CS12) ; Configurar prescaler a 256
    out TCCR1B, r16
 
    ldi r16, HIGH(DELAY_CYCLES)
    out OCR1AH, r16
    ldi r16, LOW(DELAY_CYCLES)
    out OCR1AL, r16
 
    ; Habilitar interrupciones globales
    sei
 
MainLoop:
    rjmp MainLoop
 
Timer1_CompA_ISR:
    ; Contador de 00 a 99 y viceversa
    ldi r16, 99  ; Inicializar r16 en 99
    ldi r17, 0   ; Inicializar r17 en 0
 
CountLoop:
    out PORTB, r16  ; Mostrar contador en el puerto B
    call Delay      ; Llamar a la función de retardo
    dec r16          ; Decrementar r16
    brne CountLoop   ; Repetir si r16 no es cero
 
    mov r16, r17    ; Intercambiar r16 y r17
    mov r17, r16
 
    reti            ; Retorno de la interrupción
 
Delay:
    ; Retardo aproximado de 1 segundo usando bucle
    ldi r18, 10
OuterLoop:
    ldi r19, 20
InnerLoop:
    dec r19
    brne InnerLoop
    dec r18
    brne OuterLoop
    ret
 
.end

Este código configura el Timer1 en el ATmega328P para generar una interrupción cada vez que el contador del Timer1 coincide con el valor establecido en los registros OCR1AH y OCR1AL. La función `Delay` crea un retardo aproximado de 1 segundo utilizando bucles anidados.

Ten en cuenta que este código es solo un ejemplo y puede requerir ajustes según tu configuración y preferencias. Además, el retardo puede variar según la frecuencia del reloj y la configuración del Timer1. Asegúrate de adaptar el código a tu entorno específico y realizar pruebas para verificar su funcionamiento correcto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar