Estoy programando a los microcontroladores AVR en codigo ensamblador; este es el mismo tipo de programacion que use con los PIC; y he estado observando las diferencias de programacion entre los dos microcontroladores, nada mas que me quedan algunas dudas con los codigos en AVR. el siguiente codigo lo encontre en un libro, pero tengo algunas dudas.
pondre el siguiente codigo para ver si alguien sabe explicarlo mejor.
bueno en fin espero no confundirlos, pero asi hago mis programas para enternderlos mejor cuando los lea de nuevo. por eso mi dudas son las siguientes:
1.- en el siguiente codigo ver abajo... en uno pone a 1 el bit para habilitar interrupcion, pero en el que sigue lo pone a cero para borrar interrupcion anterior... pero es el mismo codigo con las mismas caracteristicas, no se si exista algun error... o alguien sea tan amable de explicarmelo detalladamente. lo he busacado y no encuentro respuesta.
2.- tambien programe otro, y use el puerto D como entrada y el puerto B como salida, pero en el pin (T0) no me responde, como podria programarlo para que me funcione correctamente.
si alguien es experto o sabe del tema por favor contestenme. gracias por su tiempo.
pondre el siguiente codigo para ver si alguien sabe explicarlo mejor.
Código:
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;codigo que habilita interrupcion por sobre flujo del timer-counter1
;cada que se produce una interupcion, incrementa en PORTB.
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
;definion de vectores y microcontrolador.
.include "8515def.inc" ;librerias y caracteristicas del microcontrolador a usar
;AT90S8515 microcntrolador usado
.org $0000 ;registro origen del programa en el microcontrolador
rjmp inicio ;salto a inicio para evitar la interrupcion programada
.org $006 ;vector de interupcion de sobreflujo
rjmp interrupcion ;salta al codigo de interrupcion programada
inicio: ;etiqueta de inicio
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
;configurando puerto b como salida, el otro puerto no se usa
ldi R16,$FF ;carga el registro r16 a unos
out DDRB,R16 ;pone r16 en ddrb, portb es salida
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
;configurando la sram como stack pila
ldi R16,HIGH(RAMEND) ;carga bytes altos de la sram en r16
out SPH,R16 ;coloca el r16 en sph, byte alto de la pila
ldi R16,LOW(RAMEND) ;carga bytes bajos de la sram en r26
out SPL,R16 ;coloca el r16 en spl, byte bajo de la pila
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
configurando las interrupciones y contador timer interno
cli ;deshabilita las interrupciones
ldi R17,$00 ;carga r17 con ceros
out TCNT1H,R17 ;carga el registro tcnt1h a ceros, bytes altos
out TCNT1L,R17 ;carga el registro tcnt1l a ceros, bytes bajos
in R17,TIMSK ;carga en r17 el registro timsk
ori R17,(1<<T0IE1) ;operacion or entre registro r17 con 1 del pin t0ie1
out TIMSK,R17 ;habilita la interrupcion de sobreflujo, 1 en t0ie1
in R17,TIFR ;carga en r17 el registro tifr
ori R17,(1<<TOV1) ;operacion or entre registro r17 con 1 del pin tov1
out TIFR,R17 ;limpia interrupcion anterior de sobreflujo
ldi R17,$01 ;carga el registro con valor de $01
out TCCR1B ;configurando el reloj por cada pulso incrementar tcnt1
sei ;habilitar interrupciones
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
;programa en general, por lo mientras nada
bucle:
nop ;nada
nop ;nada
nop ;nada
rjmp bucle ;salta a bucle
;°°°°°°°°°°°°°°°°°°°°
;codigo de interrupcion
interrupcion:
inc R18 ;incrementa r18
out PORTB,R18 ;muestra en puerto b las interrupciones
reti ;regresa de interrupcion.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
bueno en fin espero no confundirlos, pero asi hago mis programas para enternderlos mejor cuando los lea de nuevo. por eso mi dudas son las siguientes:
1.- en el siguiente codigo ver abajo... en uno pone a 1 el bit para habilitar interrupcion, pero en el que sigue lo pone a cero para borrar interrupcion anterior... pero es el mismo codigo con las mismas caracteristicas, no se si exista algun error... o alguien sea tan amable de explicarmelo detalladamente. lo he busacado y no encuentro respuesta.
Código:
in R17,TIMSK ;carga en r17 el registro timsk
ori R17,(1<<T0IE1) ;operacion or entre registro r17 con 1 del pin t0ie1
out TIMSK,R17 ;habilita la interrupcion de sobreflujo, 1 en t0ie1
in R17,TIFR ;carga en r17 el registro tifr
ori R17,(1<<TOV1) ;operacion or entre registro r17 con 1 del pin tov1
out TIFR,R17 ;limpia interrupcion anterior de sobreflujo 0 pin tov1
2.- tambien programe otro, y use el puerto D como entrada y el puerto B como salida, pero en el pin (T0) no me responde, como podria programarlo para que me funcione correctamente.
si alguien es experto o sabe del tema por favor contestenme. gracias por su tiempo.
Última edición por un moderador: