Vous êtes sur la page 1sur 21

Cryn:

Hola Belgitaes, gracias por las respuestas y estaba viendo un poco rara la
correccin que me dabas, espero no quede dems decirte que si, hice la prueba
con las lneas que me dijiste que aumente y de todas formas segua funcionando
mal, pero en fin, ya va todo bien, te adjunto las secciones exportadas que saque
de los 6 primeros ejemplos que hice, para que si gustes puedas simularlo en el
proteus.
Enseguida ir colocando los siguientes ejemplos, como los anteriores.
saludos
Cryn:
EJEMPLO 4
Veremos un poco de las interrupciones, como bien sabemos una interrupcin es
un evento especial, ya que "interrumpe" al microcontrolador de su ejecucin en
curso, podramos mencionar como ejemplo el hecho de que el microcontrolador
este ocupado ejecutando una secuencia de cdigo para sumar multiplicar y hacer
algunos procesos ms de unos datos, una interrupcin se genera y el
microcontrolador es obligado a detener su ejecucin de ese proceso que estaba
haciendo y desviar su atencin por un momento para ejecutar un cdigo (rutina)
que se debe hacer por la presencia de la interrupcin, posteriormente cuando se
termine de ejecutar la rutina que se hace por la interrupcin, el procesador del
microcontrolador vuelve a ejecutar el proceso que antes estaba haciendo desde el
lugar desde donde fue interrumpido.
Las interrupciones tienen muchas ventajas, ya que se puede de cierta manera
obtener una especie de "paralelismo" porque el micro puede ejecutar el cdigo
principal, y en momentos especiales por las interrupciones, dedicarlo a ellos, que
nos puede hacer a la vista nuestra un efecto de ese tipo. Pero a la vez se debe
tener cuidado en su manejo, pues son un arma de doble filo si no son bien
administradas, en caso de tener que usar muchas interrupciones, o al tener mucho
cdigo que ejecutar en la rutina de interrupcin.
El microcontrolador tiene varias fuentes de interrupcion, como ser, por

conversin ad terminada, por escritura en la eeprom completada, por desborde de


temporizadores, por recepcin de datos en la uart, por transmisin completada de
datos en la uart, interrupciones externas por pines del micro al detectar un flanco
ya sea de bajada o subida, entre otras.
Podemos resaltar que en los micros AVR cada interrupcin posee su propio
vector de interrupcin lo que hace ms cmoda su ejecucin y programacin de
la rutina correspondiente.

Describiremos ahora las configuraciones para utilizar la interrupcin externa


INT0, cabe mencionar que el micro que usamos posee dos fuentes de
interrupcin externa, estas son INT0 ya mencionada adems de INT1, alojadas en
los pines D2 y D3 del micro respectivamente.
Usaremos la Interrupcin INT0 en el pin D2, los registros involucrados para su
configuracin son:
MCUCR MCU Control RegisterGICR General Interrupt Control
RegisterGIFR General Interrupt Flag Register
MCUCR MCU Control Register

Bit 3, 2 ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0: Se usan para
la INT1
Bit 1, 0 ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0: Se usan para
la INT0, y responde a la siguiente tabla:

Que nos dice como se generar la interrupcin, con un estado bajo en el pin, por
cualquier cambio de estado, por flanco de bajada, o por flanco de subida.
GICR General Interrupt Control Register

Bit 6 INT0: External Interrupt Request 0 Enable: Mediante este bit puesto en 1
se activa la mscara de Interrupcin Externa 0, esto quiere decir que activando el
bit de interrupciones globales se podr esperar por la interrupcin configurada.
GIFR General Interrupt Flag Register

Bit 6 INTF0: External Interrupt Flag 0: Es la bandera de interrupcin que se


pone automticamente en 1 cuando se ha producido la Interrupcin Externa 0 y
adems las interrupciones globales est habilitada, entonces el procesador saltar
al vector de interrupcin correspondiente. Se pondr a 0 por hardware cuando la
rutina de interrupcin se ejecute.

Ahora en el ejemplo veremos entonces la manera de manejar la interrupcin


externa del micro, INT0. Y a la vez aprovechar para visualizar mediante 2
displays de leds de 7 segmentos un conteo ascendente de 0 a 99, conteo que ser
incrementado por la INT0.
Est para mi es una muy buena practica porque se aprende a manejar los displays
por tabla de datos, o daos constantes en la memoria de programa, a la vez que
accedo a la memoria RAM para almacenar los datos del conteo, se que
tranquilamente se puede hacer en un registro acumulador del micro, pero opt por
aprender a ver un manejo de la memoria RAM.
Sin ms ac el cdigo:
Cdigo
GeSHi (asm):
;-------------------------------------------------------------------------------; Programa: Contador 0-99 por interrupcin
; Version: 0.0
;
; Dispositivo: ATmega8 Compilador: AVRASM2

; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3


;
; Notas: Este programa realiza un conteo ascendente de 0 a 99 mediante
;
2 Displays de 7 segmentos, y un pulsador que incrementa la cuenta
;
; Registros: r16 para configuraciones, y despues con r15 manipula los datos de
; unidades y decenas. r30 y r31 (Z) para direccionamiento indirecto
; de las constantes en memoria de programa que se almacenan de los
; datos del display de 7 segmentos. r28 y r29 (Y), para copia de la
; direccin original de las constantes. r17 y r18 son usadas para
; los retardos de 25ms y 1ms
;
; Conexiones: C0 -> Anodo Display 1
; C1 -> Anodo Display 2
;
D0 -> Segmento a del Display
;
D1 -> Segmento b del Display
;
D2 -> Pulsador
;
D3 -> Segmento c del Display
;
D4 -> Segmento d del Display
;
D5 -> Segmento e del Display
;
D6 -> Segmento f del Display
;
D7 -> Segmento g del Display
;-------------------------------------------------------------------------------;DIRECTIVAS EN ENSAMBLADOR
.include "m8def.inc"
;ATmega8
.equ unidades=$60
.equ decenas=$61
.def flag=r19
;reset-vector address $0000
.org $0000
rjmp main
;ve al main
rjmp int_ext ;va a la interrupcin externa
seg7:.db 0x80,0xf1,0x48,0x60,0x31,0x22,0x02,0xb0,0x00,0x20

int_ext:
ser flag ;ponemos flag a 255
reti ;retorno de rutina de interrupcin, habilitando I del SREG
;PROGRAMA PRINCIPAL
main:
ldi r16,$04
;Configuracion de...
out sph,r16
ldi r16,$5F
out spl,r16
;...la pila: Stack: $045F=RAMEND
ser r16
;r16 <- $FF
out ddrc,r16
;portC salida
ldi r16,$fb
;r16 <- $fb
out ddrd,r16
;portD salidas, excepto D2
ldi r16,3 ;r16 <- 3
out mcucr,r16 ;configuramos a modo sleep idle, y flanco de subida para INT0
ldi r16,$40 ;r16 <- $40
out gicr,r16 ;activamos la mscara de la INT0
clr r16 ;r16 <- 0
out gifr,r16 ;limpiarmos flags de interrupcion INTF0 e INTF1
sts unidades,r16 ;unidades <- 0
sts decenas,r16 ;decenas <- 0
clr flag ;bandera para identificar interrupcin pueta a 0
sei ;se habilitan las interrupciones globales
ldi r30,low(seg7) ;se carga en Z
ldi r31,high(seg7) ;la direccin en flash de los datos del display
ldi r16,2 ;r16 <- 2
add r30,r16 ;adecuamos el puntero Z para qeu apunte a bytes
loop:
cpi flag,255 ;preguntamos si flag es 255
breq incremento ;si es 255, la interrupcin ocurri, saltamos a incrementar
unidades
multi:
rcall multiplexar ;vamos a visualizar los datos en los displays
rjmp loop
;bucle infinito

incremento:
;rcall delay25m ;retardo antirrebote
rcall multiplexar ;mostramos datos, hasta que se suelte el pulsador
sbic pind,2 ;pin D2 esta todava siendo pulsado?
rjmp incremento ;si, est pulsado, volvemos a generar retardo, sino se salta
instruccin
lds r16,unidades ;r16 <- unidades
lds r17,decenas ;r17 <- decenas
inc r16 ;incrementamos el valor de r16 que contiene el valor de unidades
cpi r16,10 ;r16<10?
brmi salir ;si es menor, salimos, sino...
clr r16 ;r16 <- 0, unidades a cero
inc r17 ;incrementamos r17 que contiene el valor de decenas
cpi r17,10 ;r17<10?
brmi salir ;si es menor, salimos, sino...
clr r17 ;r17 <- 0,decenas a cero
salir:
sts unidades,r16 ;unidades <- r16
sts decenas,r17 ;decenas <- r17
clr flag ;ponemos flag a 0
rjmp multi ;volvemos a multiplexar, con los nuevos datos
multiplexar:
sbi portc,0 ;apagamos ambos
sbi portc,1 ;displays
lds r16,unidades ;r16 <- unidades
lds r15,decenas ;r17 <- decenas
mov r28,r30 ;copiamos la direccin donde estan
mov r29,r31 ;los datos del display
add r30,r16 ;se suma el valor de unidades, para desplazarse en la tabla
lpm r16,Z ;r16 <- (Z)
mov r30,r28 ;r30 <- r28
add r30,r15 ;se suma el valor de decenas, para desplazarse en la tabla
lpm r15,Z ;r17 <- (Z)
mov r30,r28 ;r30 <- r28
out portd,r16 ;se muestra en el display de unidades, el valor correspondiente

cbi portc,1 ;enciende el display correspondiente


rcall delay1m ;tiempo de retardo para que sea visible al ojo
sbi portc,1 ;se apaga el display encendido anteriormente
nop nop nop nop nop nop nop nop ;apagando transistor, requiere un tiempo para
apagarse
out portd,r15 ;se muestra en el display de decenas, el valor correspondiente
cbi portc,0 ;enciende el display correspondiente
rcall delay1m ;tiempo de retardo para que sea visible al ojo
sbi portc,0 ;se apaga el display encendido anteriormente
ret
; =============================
; delay loop generator
; 100000 cycles:
; ----------------------------; delaying 99990 cycles:
delay25m:
ldi R17, $A5
WGLOOP0: ldi R18, $C9
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================
; =============================
; delay loop generator

; 4000 cycles:
; ----------------------------; delaying 3999 cycles:
delay1m:
ldi R17, $1F
WGLOOP00: ldi R18, $2A
WGLOOP11: dec R18
brne WGLOOP11
dec R17
brne WGLOOP00
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================

esquema:

circuito montado:

y el video funcionando:

Cryn:
Ejemplo 5
Es el turno de estudiar algo del Conversor Analgico a Digital, este tiene una
resolucin de conversin de 10bits de hasta 15kSPS, 6 canales Analgicos,
Ajuste a derecha i izquierda del resultado de la conversin, Voltajes de referencia,
2 modos de conversin: simple y contnuo, Interrupcin en el momento de la
conversin completada, cancelacin de ruido activando modo Sleep, y algunos
m que se pueden ver en la hoja de datos.
El mtodo de conversin que usa el micro es de aproximaciones sucesivas.
Los registros involucrados con el Conversor A/D son:
ADMUX ADC Multiplexer Selection Register ADMUXADCSRA ADC
Control and Status Register AADCL and ADCH The ADC Data Register
ADMUX ADC Multiplexer Selection Register ADMUX

Este registro es muy importante ya que en el se realizan la mayora de las


configuraciones para el ADC:

Bit 7:6 REFS1:0: Reference Selection Bits:Se utilizan para seleccionar el tipo
de voltaje de referncia que se usar, si interno, externo o deshabilitado, segn la
tabla:

Bit 5 ADLAR: ADC Left Adjust Result: Configurado con 1, ajustar el


resultado de la conversin en los registros ADCH y ADCL a la Izquierda, caso
contrario con un 0 lo har a la derecha, esto lo veremos ms adelante con unas
imgenes.
Bits 3:0 MUX3:0: Analog Channel Selection Bits: Estos bits seleccionarn el
canal analgico que se usar en la presente conversin, de acuerdo a la siguiente
tabla:

ADCSRA ADC Control and Status Register A

En este registro se hacen las dems configuraciones y tambin se tiene los bits de
control de inicio/fin de conversin.
Bit 7 ADEN: ADC Enable: Es la habilitacin del ADC para su uso (1), caso
contrario el ADC estar apagado (0)
Bit 6 ADSC: ADC Start Conversion: Colocando un 1 en este bit se inicia la
conversin analgica, ya sea en modo normal o en modo contnuo, salvo que en
el contnuo no har falta volverlo a colocar a 1 cuando se necesite otra
conversin, lo que si se debe hacer en modo normal, ya que el conversor en este
modo coloca a cero por hardware a este bit cuando la conversin AD se ha
terminado.
Bit 5 ADFR: ADC Free Running Select: Con 1 se habilita el modo contnuo
(free running), y el ADC muestrear y actualizar los registros de datos de la
conversin contnuamente, colocando un 0 el modo contnuo se detiene.

Bit 4 ADIF: ADC Interrupt Flag: Este bit se coloca a 1 cuando la conversin
AD es completada y los registros de datos de la conversin son actualizados. Se
ejecutar la rutina de interrupcin si esta implementada y se tiene configurada las
mscaras correspondientes para esta interrupcin y el bit de Interrupciones
globales, y se pondr a 0 por hardware al terminar la rutina de interrupcin.
Bit 3 ADIE: ADC Interrupt Enable: Es la mscara de habilitacin para la
interrupcin por Conversin AD completada, se la habilita colocando un 1.
Bits 2:0 ADPS2:0: ADC Prescaler Select Bits: Estos bits determinan el divisor
entre la frecuencia del Osilador principal y la entrada de reloj del ADC, es segn
la tabla:

ADCL and ADCH The ADC Data Register


Por ltimo los registros de datos donde se almacena el resultado de 10bits de la
conversin AD, que son de dos formas segn la justificacin configurada en
ADLAR
ADLAR=0

ADLAR=1

Cuando la conversin AD ha sido completada, el resultado puede ser encontrado


en stos 2 registros, en el formato que ADLAR indique, primero se debe leer
ADCL y posteriormente ADCH. Si no ms de 8 bits de resolucin son necesarios
se puede usar ADLAR=1 y leer directamente ADCH.
Por ltimo queda indicar que el resultado de la conversin ser
aproximadamente:

En este ejemplo veremos cmo funciona el ADC de 10bits de resolucin del


micro, usaremos un potencimetro conectado en el canal 0 el cual nos dar los
diferentes valores de tensin analgica entre 0 y 5V. Visualizaremos el dato
convertido en 10 LEDs conectados en el puertoD y los restantes 2 en los bits
menos significativos del puerto B.
El cdigo:
Cdigo
GeSHi (asm):
;-------------------------------------------------------------------------------; Programa: Conversor A/D de 10bits
; Version: 0.0
;
; Dispositivo: ATmega8 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa realiza una conversin de una tensin analgica a valores
; digitales de 10bits
;
; Registros: r16 para configuraciones de los puertos, del ADC, y para lectura de la
; conversin. r17 y r18 para retardos.
;
; Conexiones: ADC0/C0 -> Potenciometro a Vcc y Gnd
;
D0-D7 -> Led's
; B0 y B1 -> Led's
;-------------------------------------------------------------------------------;DIRECTIVAS EN ENSAMBLADOR
.include "m8def.inc"
;ATmega8
;reset-vector address $0000
.org $0000
rjmp main
;ve al main

;PROGRAMA PRINCIPAL
main:
ldi r16,$04
;Configuracion de...
out sph,r16
ldi r16,$5F
out spl,r16
;...la pila: Stack: $045F=RAMEND
clr r16
;r16 <- $00
out ddrc,r16
;portC entrada
ser r16 ;r16 <- $ff
out ddrd,r16
;portD salidas
out ddrb,r16 ;portB salidas
ldi r16,$40
;r16 <- $40
out admux,r16 ;configuro ADC a canal0, ajuste a derecha y referencia en Vref
con capacitor
ldi r16,$85 ;r16 <- $85
out adcsra,r16 ;habilito ADC, interrupcion y free running desactivados, divisor
32
rcall delay200u ;retardo para inicializar el conversor A/D
;se necesita 25 cilos del clock ADC, el clock ADC esta puesto a
4MHz/32=125kHz
;25 ciclos de 125Khz, es 200us que se debe esperar para la configuracin de todo
el circuito
;interno del conversor A/D del micro
loop:
sbi adcsra,adsc ;se inicia conversion A/D, seteando el bit adsc
convertir:
sbis adcsra,adsc ;pregunto por el bit de conversin terminada
rjmp leer ;si termino la conversin, voy a leer la conversin
rjmp convertir ;si no se sigue esperando hasta que termine
leer: ;rutina de lectura de los datos convertidos
in r16,adcl ;carga el valor de ADCL en r16
out portd,r16 ;muestra por el puertoD
in r16,adch ;carga el valor de ADCH en r16
out portb,r16 ;muestra por el puertoB
rcall delay25m ;retardo para visualizar, puede no ser necesario

rjmp loop ;bucle infinito


; =============================
; delay loop generator
; 100000 cycles:
; ----------------------------; delaying 99990 cycles:
delay25m:
ldi R17, $A5
WGLOOP0: ldi R18, $C9
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================
; =============================
; delay loop generator
; 800 cycles:
; ----------------------------; delaying 798 cycles:
delay200u:
ldi R17, $02
WGLOOP3: ldi R18, $84
WGLOOP4: dec R18
brne WGLOOP4
dec R17

brne WGLOOP3
; ----------------------------; delaying 2 cycles:
nop
nop
ret
; =============================

El esquema del circuito:

El circuito montado:

y por ltimo el vdeo del funcionamiento:


Belgitaes:
Muchas Gracias Cryn Ahora Si Los Puedo Simular En Proteus :g)
Cryn:
Ejemplo 6
Es el turno de estudiar a la EEPROM interna del microcontrolador, para esto
solamente grabaremos un dato en la primera posicin de la memoria,
posteriormente lo leeremos y lo mostraremos en leds al presionarse un pulsador
conectado en INT0, usaremos entonces la interrupcin externa 0, y mientras se
espere este pulso pondremos al micro a dormir.
La memoria EEPROM interna del microcontrolador ATmega8 posee 512 bytes
disponibles, que se los tratan desde 3 registros del microcontrolador que son:
EEARH and EEARL The EEPROM Address RegisterEEDR The EEPROM
Data RegisterEECR The EEPROM Control Register
EEARH and EEARL The EEPROM Address Register

En estos registros se colocar la direccin de la memoria en la cual se escribir o


de la cual se leer el dato, las posiciones de la memoria varias de 0 a 512, el
registro EEARH contiene al bit ms significativo de la direccin. Ambos
registros son de lectura y escritura, salvo los bits del 1 al 7 del registro EEARH,
ya que no se usan.
EEDR The EEPROM Data Register

En este registro se colocar el dato ledo tras una lectura de una direccin de la
EEPROM o se colocar el dato a escribir en la EEPROM. Es entonces un registro
de lectura y escritura.
EECR The EEPROM Control Register

Este registro posee 4 bits importantes para el manejo de la eeprom, estos son:
Bit 3 EERIE: EEPROM Ready Interrupt Enable: Habilita interrupcin cuando
EEWE cambia de 1 a 0
Bit 2 EEMWE: EEPROM Master Write Enable: Es la habilitacin de escrituras
en la EEPROM
Bit 1 EEWE: EEPROM Write Enable: Colocando un 1, comienza la escritura
del dato escrito previamente en EEDR en la direccin que tambin se escribi
previamente en EEARH y EEARL, el bit EEWE se volver a 0 por hardware
cuando se termine la escritura.
Bit 0 EERE: EEPROM Read Enable: Colocando un 1, comienza la lectura del
dato de la direccin cargada previamente en EEARH y EEARL, el dato ser
guardado en EEDR, el bit EERE se volver a 0 por hardware cuando se termine
la lectura.
En caso que la energa de alimentacin al microcontrolador no sea la adecuada,
se peude tener escrituras de datos corruptos.

En cuanto al modo SLEEP podemos mencionar la participacin del siguiente


registro:
MCUCR MCU Control Register

posee, en para al modo sleep los siguientes bits importantes:


Bit 7 SE: Sleep Enable: Este bit debe ser puesto a 1 cuando se ingresar a modo
SLEEP antes de ejecutar la instruccin SLEEP.
Bits 6:4 SM2:0: Sleep Mode Select Bits 2, 1, and 0: Con combinaciones de
estos bits se selecciona el tipo de modo sleep disponibles para el micro, estos
son:

Para el ejemplo usaremos en el SLEPP el modo IDLE.


Entonces para lo propuesto tenemos este cdigo:
Cdigo
GeSHi (asm):
;-------------------------------------------------------------------------------; Programa: Escritura y Lectura de un byte en la memoria EEPROM interna
; Version: 0.0
;
; Dispositivo: ATmega8 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa realiza la escritura y lectura de un byte en la memoria
; eeprom interna del microcontrolador, la laectura se la realiza mediante
; la interrupcin externa, y el micro se encontrar en modo de bajo consumo
; (sleep) hasta recibir la interrupcin para despertar al micro.
;

; Registros: r16 para configuraciones de puertos, de la eeprom, interrupcion y


; lectura de eeprom. r17, r18 y r19 para retardos. r20 bandera de
; interrupcin, indica cuando ha ocurrido la interrupcin
;
; Conexiones: D2 pulsador
;
D0-D1 D3-D7 -> Led's
;-------------------------------------------------------------------------------;DIRECTIVAS EN ENSAMBLADOR
.include "m8def.inc"
;ATmega8
.def flag=r20
;reset-vector address $0000
.org $0000
rjmp main
;ve al main
rjmp int_ext ;va a interrupcin externa
;PROGRAMA PRINCIPAL
int_ext:
ser flag ;ponemos flag a 255
reti
main:
ldi r16,$04 ;Configuracion de...
out sph,r16
ldi r16,$5F
out spl,r16
;...la pila: Stack: $045F=RAMEND
ldi r16,$fb ;r16 <- $fb
out ddrd,r16
;portD salidas, excepto D2/INT0 que ser entrada
clr flag ;limpiamos bandera para sealar la interrupcin
clr r16
;r16 <- $00
out eearh,r16 ;direccin para escribir y leer de la eeprom
out eearl,r16 ;puesta en 0
ldi r16,$73 ;r16 <- $73
out eedr,r16 ;se carga el dato para escribir en la eeprom

sbi eecr,eemwe ;habilitar escritura en eeprom


sbi eecr,eewe ;Start eeprom write by setting EEWE
esperar: ;Wait for completion of write
sbic eecr,eewe
rjmp esperar
ldi r16,3 ;r16 <- 3
out mcucr,r16 ;configuramos a modo sleep idle, y flanco de subida para INT0
ldi r16,$40 ;r16 <- $40
out gicr,r16 ;activamos la mscara de la INT0
clr r16 ;r16 <- 0
out gifr,r16 ;limpiarmos flags de interrupcion INTF0 e INTF1
sei ;activacin de interrupciones global
loop:
cpi flag,255 ;preguntamos si flag es 255
breq mostrar ;si es 255, la interrupcin ocurri, saltamos a mostrar dato de
eeprom
;ldi r16,$88 ;r16 <- $83
;out mcucr,r16 ;configuramos a modo sleep idle, y flanco de subida para INT0
;sbi mcucr,se ;hablitamos modo sleep. Estas 3 instrucciones comentadas la hoja
de dtos dice
;que deben hacerse pero si estan ahi no funciona bien el
programa
sleep
rjmp loop ;bucle infinito
mostrar:
rcall delay25m ;retardo antirrebote
sbic pind,2 ;pin D2 esta todava siendo pulsado?
rjmp mostrar ;si, est pulsado, volvemos a generar retardo, sino se salta
instruccin
EEPROM_read: ;Wait for completion of previous write
sbic eecr,eewe
rjmp EEPROM_read
sbi EECR,EERE ;Start eeprom read by writing EERE
in r16,EEDR ;Read data from data register
out portd,r16 ;se muestra el dato por el puerto D
rcall delay2s ;retardo 2 segundos

clr flag ;ponemos flag a 0


out portd,flag ;se apaga todo el puerto D
rjmp loop ;al bucle
; =============================
; delay loop generator
; 100000 cycles:
; ----------------------------; delaying 99990 cycles:
delay25m:
ldi R17, $A5
WGLOOP0: ldi R18, $C9
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================
; =============================
; delay loop generator
; 8000000 cycles:
; ----------------------------; delaying 7999992 cycles:
delay2s:
ldi R17, $48
LOOP0: ldi R18, $BC
LOOP1: ldi R19, $C4

LOOP2: dec R19


brne LOOP2
dec R18
brne LOOP1
dec R17
brne LOOP0
; ----------------------------; delaying 6 cycles:
ldi R17, $02
LOOP3: dec R17
brne LOOP3
; ----------------------------; delaying 2 cycles:
nop
nop
ret
; =============================

Que usar este esquema:


hay un error en el esquema, como ya saben lo condensadores del cristal deben ser
de 22p
y se ver una vez armado ms o menos as:

y solo nos queda ver como funciona:

Vous aimerez peut-être aussi