TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
23 de Abril de 2014, 04:08:19

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
342685 Mensajes en 38373 Temas por 39732 Usuarios
Último usuario: tunegropp
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Otros microcontroladores/dispositivos programables
| |-+  ATMEL (Moderador: stk500)
| | |-+  Empezando con AVR
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: 1 2 3 4 [5] 6 7 Marcar como favorito Imprimir
Autor Tema: Empezando con AVR  (Leído 29476 veces)
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #80 : 11 de Octubre de 2009, 17:38:47 »

Hola Belgitaes, gracias por las respuestas y estaba viendo un poco rara la corrección que me dabas, espero no quede demás decirte que si, hice la prueba con las líneas que me dijiste que aumente y de todas formas seguía 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
En línea

.
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #81 : 11 de Octubre de 2009, 19:36:22 »

EJEMPLO 4

Veremos un poco de las interrupciones, como bien sabemos una interrupción es un evento especial, ya que "interrumpe" al microcontrolador de su ejecución en curso, podríamos mencionar como ejemplo el hecho de que el microcontrolador este ocupado ejecutando una secuencia de código para sumar multiplicar y hacer algunos procesos más de unos datos, una interrupción se genera y el microcontrolador es obligado a detener su ejecución de ese proceso que estaba haciendo y desviar su atención por un momento para ejecutar un código (rutina) que se debe hacer por la presencia de la interrupción, posteriormente cuando se termine de ejecutar la rutina que se hace por la interrupción, 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 código 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 código que ejecutar en la rutina de interrupción.

El microcontrolador tiene varias fuentes de interrupcion, como ser, por conversión ad terminada, por escritura en la eeprom completada, por desborde de temporizadores, por recepción de datos en la uart, por transmisión 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 interrupción posee su propio vector de interrupción lo que hace más cómoda su ejecución y programación de la rutina correspondiente.


Describiremos ahora las configuraciones para utilizar la interrupción externa INT0, cabe mencionar que el micro que usamos posee dos fuentes de interrupción externa, estas son INT0 ya mencionada además de INT1, alojadas en los pines D2 y D3 del micro respectivamente.

Usaremos la Interrupción INT0 en el pin D2, los registros involucrados para su configuración son:

  • MCUCR – MCU Control Register
  • GICR – General Interrupt Control Register
  • GIFR – 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 interrupción, 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 máscara de Interrupción Externa 0, esto quiere decir que activando el bit de interrupciones globales se podrá esperar por la interrupción configurada.

GIFR – General Interrupt Flag Register


Bit 6 – INTF0: External Interrupt Flag 0: Es la bandera de interrupción que se pone automáticamente en 1 cuando se ha producido la Interrupción Externa 0 y además las interrupciones globales está habilitada, entonces el procesador saltará al vector de interrupción correspondiente. Se pondrá a 0 por hardware cuando la rutina de interrupción se ejecute.


Ahora en el ejemplo veremos entonces la manera de manejar la interrupción 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 más acá el código:
Código
GeSHi (asm):
  1. ;--------------------------------------------------------------------------------
  2. ; Programa: Contador 0-99 por interrupción
  3. ; Version: 0.0
  4. ;
  5. ; Dispositivo: ATmega8 Compilador: AVRASM2
  6. ; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
  7. ;
  8. ; Notas: Este programa realiza un conteo ascendente de 0 a 99 mediante
  9. ;           2 Displays de 7 segmentos, y un pulsador que incrementa la cuenta
  10. ;
  11. ; Registros: r16 para configuraciones, y despues con r15 manipula los datos de
  12. ; unidades y decenas. r30 y r31 (Z) para direccionamiento indirecto
  13. ; de las constantes en memoria de programa que se almacenan de los
  14. ; datos del display de 7 segmentos. r28 y r29 (Y), para copia de la
  15. ; dirección original de las constantes. r17 y r18 son usadas para
  16. ; los retardos de 25ms y 1ms
  17. ;
  18. ; Conexiones: C0 -> Anodo Display 1
  19. ; C1 -> Anodo Display 2
  20. ;               D0 -> Segmento a del Display
  21. ;               D1 -> Segmento b del Display
  22. ;               D2 -> Pulsador
  23. ;               D3 -> Segmento c del Display
  24. ;               D4 -> Segmento d del Display
  25. ;               D5 -> Segmento e del Display
  26. ;               D6 -> Segmento f del Display
  27. ;               D7 -> Segmento g del Display
  28. ;--------------------------------------------------------------------------------
  29. ;DIRECTIVAS EN ENSAMBLADOR
  30. .include "m8def.inc"        ;ATmega8
  31.  
  32. .equ unidades=$60
  33. .equ decenas=$61
  34. .def flag=r19
  35.  
  36. ;reset-vector address $0000
  37. .org $0000
  38. rjmp main               ;ve al main
  39. rjmp int_ext ;va a la interrupción externa
  40. seg7:.db 0x80,0xf1,0x48,0x60,0x31,0x22,0x02,0xb0,0x00,0x20
  41.  
  42. int_ext:
  43. ser   flag ;ponemos flag a 255
  44. reti ;retorno de rutina de interrupción, habilitando I del SREG
  45.  
  46. ;PROGRAMA PRINCIPAL
  47.  
  48. main:
  49. ldi  r16,$04             ;Configuracion de...
  50. out  sph,r16
  51. ldi  r16,$5F
  52. out  spl,r16        ;...la pila: Stack: $045F=RAMEND
  53. ser  r16                 ;r16 <- $FF
  54. out  ddrc,r16           ;portC salida
  55. ldi  r16,$fb             ;r16 <- $fb
  56. out  ddrd,r16           ;portD salidas, excepto D2
  57. ldi  r16,3 ;r16 <- 3
  58. out  mcucr,r16 ;configuramos a modo sleep idle, y flanco de subida para INT0
  59. ldi  r16,$40 ;r16 <- $40
  60. out  gicr,r16 ;activamos la máscara de la INT0
  61. clr  r16 ;r16 <- 0
  62. out  gifr,r16 ;limpiarmos flags de interrupcion INTF0 e INTF1
  63. sts  unidades,r16 ;unidades <- 0
  64. sts  decenas,r16 ;decenas <- 0
  65. clr  flag ;bandera para identificar interrupción pueta a 0
  66. sei   ;se habilitan las interrupciones globales
  67. ldi  r30,low(seg7) ;se carga en Z
  68. ldi  r31,high(seg7) ;la dirección en flash de los datos del display
  69. ldi  r16,2 ;r16 <- 2
  70. add  r30,r16 ;adecuamos el puntero Z para qeu apunte a bytes
  71. loop:
  72. cpi   flag,255 ;preguntamos si flag es 255
  73. breq  incremento ;si es 255, la interrupción ocurrió, saltamos a incrementar unidades
  74. multi:
  75. rcall multiplexar ;vamos a visualizar los datos en los displays
  76. rjmp  loop                ;bucle infinito
  77. incremento:
  78. ;rcall delay25m ;retardo antirrebote
  79. rcall multiplexar ;mostramos datos, hasta que se suelte el pulsador
  80. sbic  pind,2 ;pin D2 esta todavía siendo pulsado?
  81. rjmp  incremento ;si, está pulsado, volvemos a generar retardo, sino se salta instrucción
  82. lds   r16,unidades ;r16 <- unidades
  83. lds   r17,decenas ;r17 <- decenas
  84. inc   r16 ;incrementamos el valor de r16 que contiene el valor de unidades
  85. cpi   r16,10 ;r16<10?
  86. brmi  salir ;si es menor, salimos, sino...
  87. clr   r16 ;r16 <- 0, unidades a cero
  88. inc   r17 ;incrementamos r17 que contiene el valor de decenas
  89. cpi   r17,10 ;r17<10?
  90. brmi  salir ;si es menor, salimos, sino...
  91. clr   r17 ;r17 <- 0,decenas a cero
  92. salir:
  93. sts   unidades,r16 ;unidades <- r16
  94. sts   decenas,r17 ;decenas <- r17
  95. clr   flag ;ponemos flag a 0
  96. rjmp  multi ;volvemos a multiplexar, con los nuevos datos
  97.  
  98. multiplexar:
  99. sbi   portc,0 ;apagamos ambos
  100. sbi   portc,1 ;displays
  101. lds   r16,unidades ;r16 <- unidades
  102. lds   r15,decenas ;r17 <- decenas
  103. mov   r28,r30 ;copiamos la dirección donde estan
  104. mov   r29,r31 ;los datos del display
  105. add   r30,r16 ;se suma el valor de unidades, para desplazarse en la tabla
  106. lpm   r16,Z ;r16 <- (Z)
  107. mov   r30,r28 ;r30 <- r28
  108. add   r30,r15 ;se suma el valor de decenas, para desplazarse en la tabla
  109. lpm   r15,Z ;r17 <- (Z)
  110. mov   r30,r28 ;r30 <- r28
  111. out   portd,r16 ;se muestra en el display de unidades, el valor correspondiente
  112. cbi   portc,1 ;enciende el display correspondiente
  113. rcall delay1m ;tiempo de retardo para que sea visible al ojo
  114. sbi   portc,1 ;se apaga el display encendido anteriormente
  115. nop nop nop nop nop nop nop nop ;apagando transistor, requiere un tiempo para apagarse
  116. out   portd,r15 ;se muestra en el display de decenas, el valor correspondiente
  117. cbi   portc,0 ;enciende el display correspondiente
  118. rcall delay1m ;tiempo de retardo para que sea visible al ojo
  119. sbi   portc,0 ;se apaga el display encendido anteriormente
  120. ret
  121.  
  122. ; =============================
  123. ;    delay loop generator
  124. ;     100000 cycles:
  125. ; -----------------------------
  126. ; delaying 99990 cycles:
  127. delay25m:
  128.          ldi  R17, $A5
  129. WGLOOP0:  ldi  R18, $C9
  130. WGLOOP1:  dec  R18
  131.          brne WGLOOP1
  132.          dec  R17
  133.          brne WGLOOP0
  134. ; -----------------------------
  135. ; delaying 9 cycles:
  136.          ldi  R17, $03
  137. WGLOOP2:  dec  R17
  138.          brne WGLOOP2
  139. ; -----------------------------
  140. ; delaying 1 cycle:
  141.          nop
  142.          ret
  143. ; =============================
  144.  
  145. ; =============================
  146. ;    delay loop generator
  147. ;     4000 cycles:
  148. ; -----------------------------
  149. ; delaying 3999 cycles:
  150. delay1m:
  151.          ldi  R17, $1F
  152. WGLOOP00: ldi  R18, $2A
  153. WGLOOP11: dec  R18
  154.          brne WGLOOP11
  155.          dec  R17
  156.          brne WGLOOP00
  157. ; -----------------------------
  158. ; delaying 1 cycle:
  159.          nop
  160.  ret
  161. ; =============================
  162.  

esquema:

circuito montado:

y el video funcionando:
« Última modificación: 22 de Octubre de 2009, 21:46:22 por Cryn » En línea

.
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #82 : 11 de Octubre de 2009, 19:50:01 »

Ejemplo 5

Es el turno de estudiar algo del Conversor Analógico a Digital, este tiene una resolución de conversión de 10bits de hasta 15kSPS, 6 canales Analógicos, Ajuste a derecha i izquierda del resultado de la conversión, Voltajes de referencia, 2 modos de conversión: simple y contínuo, Interrupción en el momento de la conversión completada, cancelación de ruido activando modo Sleep, y algunos má que se pueden ver en la hoja de datos.

El método de conversión que usa el micro es de aproximaciones sucesivas.

Los registros involucrados con el Conversor A/D son:

  • ADMUX – ADC Multiplexer Selection Register – ADMUX
  • ADCSRA – ADC Control and Status Register A
  • ADCL and ADCH – The ADC Data Register

ADMUX – ADC Multiplexer Selection Register – ADMUX


Este registro es muy importante ya que en el se realizan la mayoría 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, según la tabla:

Bit 5 – ADLAR: ADC Left Adjust Result: Configurado con 1, ajustará el resultado de la conversión en los registros ADCH y ADCL a la Izquierda, caso contrario con un 0 lo hará a la derecha, esto lo veremos más adelante con unas imágenes.

Bits 3:0 – MUX3:0: Analog Channel Selection Bits: Estos bits seleccionarán el canal analógico que se usará en la presente conversión, de acuerdo a la siguiente tabla:

ADCSRA – ADC Control and Status Register A


En este registro se hacen las demás configuraciones y también se tiene los bits de control de inicio/fin de conversión.

Bit 7 – ADEN: ADC Enable: Es la habilitación 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 conversión analógica, ya sea en modo normal o en modo contínuo, salvo que en el contínuo no hará falta volverlo a colocar a 1 cuando se necesite otra conversión, 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 conversión AD se ha terminado.

Bit 5 – ADFR: ADC Free Running Select: Con 1 se habilita el modo contínuo (free running), y el ADC muestreará y actualizará los registros de datos de la conversión contínuamente, colocando un 0 el modo contínuo se detiene.

Bit 4 – ADIF: ADC Interrupt Flag: Este bit se coloca a 1 cuando la conversión AD es completada y los registros de datos de la conversión son actualizados. Se ejecutará la rutina de interrupción si esta implementada y se tiene configurada las máscaras correspondientes para esta interrupción y el bit de Interrupciones globales, y se pondrá a 0 por hardware al terminar la rutina de interrupción.

Bit 3 – ADIE: ADC Interrupt Enable: Es la máscara de habilitación para la interrupción por Conversión 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 según la tabla:

ADCL and ADCH – The ADC Data Register

Por último los registros de datos donde se almacena el resultado de 10bits de la conversión AD, que son de dos formas según la justificación configurada en ADLAR

ADLAR=0

ADLAR=1

Cuando la conversión 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 más de 8 bits de resolución son necesarios se puede usar ADLAR=1 y leer directamente ADCH.

Por último queda indicar que el resultado de la conversión será aproximadamente:




En este ejemplo veremos cómo funciona el ADC de 10bits de resolución del micro, usaremos un potenciómetro conectado en el canal 0 el cual nos dará los diferentes valores de tensión analógica 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 código:
Código
GeSHi (asm):
  1. ;--------------------------------------------------------------------------------
  2. ; Programa: Conversor A/D de 10bits
  3. ; Version: 0.0
  4. ;
  5. ; Dispositivo: ATmega8 Compilador: AVRASM2
  6. ; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
  7. ;
  8. ; Notas: Este programa realiza una conversión de una tensión analógica a valores
  9. ; digitales de 10bits
  10. ;
  11. ; Registros: r16 para configuraciones de los puertos, del ADC, y para lectura de la
  12. ; conversión. r17 y r18 para retardos.
  13. ;
  14. ; Conexiones: ADC0/C0 -> Potenciometro a Vcc y Gnd
  15. ;               D0-D7 -> Led's
  16. ; B0 y B1 -> Led's
  17. ;--------------------------------------------------------------------------------
  18. ;DIRECTIVAS EN ENSAMBLADOR
  19. .include "m8def.inc"        ;ATmega8
  20.  
  21. ;reset-vector address $0000
  22. .org $0000
  23. rjmp main               ;ve al main
  24.  
  25. ;PROGRAMA PRINCIPAL
  26.  
  27. main:
  28. ldi   r16,$04           ;Configuracion de...
  29. out   sph,r16
  30. ldi   r16,$5F
  31. out   spl,r16           ;...la pila: Stack: $045F=RAMEND
  32. clr   r16               ;r16 <- $00
  33. out   ddrc,r16          ;portC entrada
  34. ser   r16 ;r16 <- $ff
  35. out   ddrd,r16          ;portD salidas
  36. out   ddrb,r16 ;portB salidas
  37. ldi   r16,$40           ;r16 <- $40
  38. out   admux,r16 ;configuro ADC a canal0, ajuste a derecha y referencia en Vref con capacitor
  39. ldi   r16,$85 ;r16 <- $85
  40. out   adcsra,r16 ;habilito ADC, interrupcion y free running desactivados, divisor 32
  41. rcall delay200u ;retardo para inicializar el conversor A/D
  42. ;se necesita 25 cilos del clock ADC, el clock ADC esta puesto a 4MHz/32=125kHz
  43. ;25 ciclos de 125Khz, es 200us que se debe esperar para la configuración de todo el circuito
  44. ;interno del conversor A/D del micro
  45. loop:
  46. sbi   adcsra,adsc ;se inicia conversion A/D, seteando el bit adsc
  47. convertir:
  48. sbis  adcsra,adsc ;pregunto por el bit de conversión terminada
  49. rjmp  leer ;si termino la conversión, voy a leer la conversión
  50. rjmp  convertir ;si no se sigue esperando hasta que termine
  51. leer: ;rutina de lectura de los datos convertidos
  52. in    r16,adcl ;carga el valor de ADCL en r16
  53. out   portd,r16 ;muestra por el puertoD
  54. in    r16,adch ;carga el valor de ADCH en r16
  55. out   portb,r16 ;muestra por el puertoB
  56. rcall delay25m ;retardo para visualizar, puede no ser necesario
  57. rjmp  loop ;bucle infinito
  58.  
  59. ; =============================
  60. ;    delay loop generator
  61. ;     100000 cycles:
  62. ; -----------------------------
  63. ; delaying 99990 cycles:
  64. delay25m:
  65.          ldi  R17, $A5
  66. WGLOOP0:  ldi  R18, $C9
  67. WGLOOP1:  dec  R18
  68.          brne WGLOOP1
  69.          dec  R17
  70.          brne WGLOOP0
  71. ; -----------------------------
  72. ; delaying 9 cycles:
  73.          ldi  R17, $03
  74. WGLOOP2:  dec  R17
  75.          brne WGLOOP2
  76. ; -----------------------------
  77. ; delaying 1 cycle:
  78.          nop
  79.          ret
  80. ; =============================
  81.  
  82. ; =============================
  83. ;    delay loop generator
  84. ;     800 cycles:
  85. ; -----------------------------
  86. ; delaying 798 cycles:
  87. delay200u:
  88.          ldi  R17, $02
  89. WGLOOP3:  ldi  R18, $84
  90. WGLOOP4:  dec  R18
  91.          brne WGLOOP4
  92.          dec  R17
  93.          brne WGLOOP3
  94. ; -----------------------------
  95. ; delaying 2 cycles:
  96.          nop
  97.          nop
  98.  ret
  99. ; =============================
  100.  

El esquema del circuito:

El circuito montado:

y por último el vídeo del funcionamiento:
« Última modificación: 22 de Octubre de 2009, 18:57:58 por Cryn » En línea

.
Belgitaes
Colaborador
PIC16
*****
Desconectado Desconectado

Mensajes: 182


« Respuesta #83 : 11 de Octubre de 2009, 19:51:37 »

Muchas Gracias Cryn Ahora Si Los Puedo Simular En Proteus  chica
En línea
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #84 : 11 de Octubre de 2009, 20:06:01 »

Ejemplo 6

Es el turno de estudiar a la EEPROM interna del microcontrolador, para esto solamente grabaremos un dato en la primera posición de la memoria, posteriormente lo leeremos y lo mostraremos en leds al presionarse un pulsador conectado en INT0, usaremos entonces la interrupción 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 Register
  • EEDR – The EEPROM Data Register
  • EECR – The EEPROM Control Register

EEARH and EEARL – The EEPROM Address Register


En estos registros se colocará la dirección 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 más significativo de la dirección. 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 leído tras una lectura de una dirección 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 interrupción cuando EEWE cambia de 1 a 0
Bit 2 – EEMWE: EEPROM Master Write Enable: Es la habilitación 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 dirección que también 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 dirección 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 energía de alimentación al microcontrolador no sea la adecuada, se peude tener escrituras de datos corruptos.



En cuanto al modo SLEEP podemos mencionar la participación 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 instrucción 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 código:
Código
GeSHi (asm):
  1. ;--------------------------------------------------------------------------------
  2. ; Programa: Escritura y Lectura de un byte en la memoria EEPROM interna
  3. ; Version: 0.0
  4. ;
  5. ; Dispositivo: ATmega8 Compilador: AVRASM2
  6. ; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
  7. ;
  8. ; Notas: Este programa realiza la escritura y lectura de un byte en la memoria
  9. ; eeprom interna del microcontrolador, la laectura se la realiza mediante
  10. ; la interrupción externa, y el micro se encontrará en modo de bajo consumo
  11. ; (sleep) hasta recibir la interrupción para despertar al micro.
  12. ;
  13. ; Registros: r16 para configuraciones de puertos, de la eeprom, interrupcion y
  14. ;   lectura de eeprom. r17, r18 y r19 para retardos. r20 bandera de
  15. ;   interrupción, indica cuando ha ocurrido la interrupción
  16. ;
  17. ; Conexiones: D2 pulsador
  18. ;                   D0-D1 D3-D7 -> Led's
  19. ;--------------------------------------------------------------------------------
  20. ;DIRECTIVAS EN ENSAMBLADOR
  21. .include "m8def.inc"        ;ATmega8
  22.  
  23. .def flag=r20
  24.  
  25. ;reset-vector address $0000
  26. .org $0000
  27. rjmp main               ;ve al main
  28. rjmp int_ext ;va a interrupción externa
  29.  
  30. ;PROGRAMA PRINCIPAL
  31.  
  32. int_ext:
  33. ser  flag ;ponemos flag a 255
  34. reti
  35.  
  36. main:
  37. ldi  r16,$04 ;Configuracion de...
  38. out  sph,r16
  39. ldi  r16,$5F
  40. out  spl,r16         ;...la pila: Stack: $045F=RAMEND
  41. ldi  r16,$fb ;r16 <- $fb
  42. out  ddrd,r16           ;portD salidas, excepto D2/INT0 que será entrada
  43. clr  flag ;limpiamos bandera para señalar la interrupción
  44. clr  r16               ;r16 <- $00
  45. out  eearh,r16 ;dirección para escribir y leer de la eeprom
  46. out  eearl,r16 ;puesta en 0
  47. ldi  r16,$73 ;r16 <- $73
  48. out  eedr,r16 ;se carga el dato para escribir en la eeprom
  49. sbi  eecr,eemwe ;habilitar escritura en eeprom
  50. sbi  eecr,eewe ;Start eeprom write by setting EEWE
  51. esperar: ;Wait for completion of write
  52. sbic eecr,eewe
  53. rjmp esperar
  54. ldi  r16,3 ;r16 <- 3
  55. out  mcucr,r16 ;configuramos a modo sleep idle, y flanco de subida para INT0
  56. ldi  r16,$40 ;r16 <- $40
  57. out  gicr,r16 ;activamos la máscara de la INT0
  58. clr  r16 ;r16 <- 0
  59. out  gifr,r16 ;limpiarmos flags de interrupcion INTF0 e INTF1
  60. sei ;activación de interrupciones global
  61. loop:
  62. cpi   flag,255 ;preguntamos si flag es 255
  63. breq  mostrar ;si es 255, la interrupción ocurrió, saltamos a mostrar dato de eeprom
  64. ;ldi  r16,$88 ;r16 <- $83
  65. ;out  mcucr,r16 ;configuramos a modo sleep idle, y flanco de subida para INT0
  66. ;sbi  mcucr,se ;hablitamos modo sleep.  Estas 3 instrucciones comentadas la hoja de dtos dice
  67.                                ;que deben hacerse pero si estan ahi no funciona bien el programa
  68. sleep
  69. rjmp  loop ;bucle infinito
  70. mostrar:
  71. rcall delay25m ;retardo antirrebote
  72. sbic  pind,2 ;pin D2 esta todavía siendo pulsado?
  73. rjmp  mostrar ;si, está pulsado, volvemos a generar retardo, sino se salta instrucción
  74. EEPROM_read: ;Wait for completion of previous write
  75. sbic  eecr,eewe
  76. rjmp  EEPROM_read
  77. sbi   EECR,EERE ;Start eeprom read by writing EERE
  78. in    r16,EEDR ;Read data from data register
  79. out   portd,r16 ;se muestra el dato por el puerto D
  80. rcall delay2s ;retardo 2 segundos
  81. clr   flag ;ponemos flag a 0
  82. out   portd,flag ;se apaga todo el puerto D
  83. rjmp  loop ;al bucle
  84.  
  85. ; =============================
  86. ;    delay loop generator
  87. ;     100000 cycles:
  88. ; -----------------------------
  89. ; delaying 99990 cycles:
  90. delay25m:
  91.          ldi  R17, $A5
  92. WGLOOP0:  ldi  R18, $C9
  93. WGLOOP1:  dec  R18
  94.          brne WGLOOP1
  95.          dec  R17
  96.          brne WGLOOP0
  97. ; -----------------------------
  98. ; delaying 9 cycles:
  99.          ldi  R17, $03
  100. WGLOOP2:  dec  R17
  101.          brne WGLOOP2
  102. ; -----------------------------
  103. ; delaying 1 cycle:
  104.          nop
  105.          ret
  106. ; =============================
  107.  
  108. ; =============================
  109. ;    delay loop generator
  110. ;     8000000 cycles:
  111. ; -----------------------------
  112. ; delaying 7999992 cycles:
  113. delay2s:
  114.        ldi  R17, $48
  115. LOOP0:  ldi  R18, $BC
  116. LOOP1:  ldi  R19, $C4
  117. LOOP2:  dec  R19
  118.        brne LOOP2
  119.        dec  R18
  120.        brne LOOP1
  121.        dec  R17
  122.        brne LOOP0
  123. ; -----------------------------
  124. ; delaying 6 cycles:
  125.        ldi  R17, $02
  126. LOOP3:  dec  R17
  127.        brne LOOP3
  128. ; -----------------------------
  129. ; delaying 2 cycles:
  130.          nop
  131.          nop
  132.  ret
  133. ; =============================
  134.  

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 más o menos así:

y solo nos queda ver como funciona:
« Última modificación: 21 de Octubre de 2009, 22:43:00 por Cryn » En línea

.
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #85 : 11 de Octubre de 2009, 21:27:29 »

Muchas Gracias Cryn Ahora Si Los Puedo Simular En Proteus  chica
De nada Belgitaes, que bueno que ahora si lo puedas ver en la simulación

Y bien con esos primeros 6 ejemplos seguro que estamos hechos para adentrarnos más y más en el mundo de los AVR, todavía seguiré pensando si haré algunas practicas en ASM, es que este lenguaje no me gusta mucho, pero me gustaría hacer una comunicación serie y quizá algo más por ahí, pero después nos pasamos al C con WINAVR.

Así que hasta la próxima, saludos!.
En línea

.
betito_mmf
PIC10
*
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 13


cof cofff


« Respuesta #86 : 14 de Octubre de 2009, 03:29:13 »

amigo cryn disculpa me podrias decir que version de proteus estas utilizando , por lo que veo cuando armas el diseño en proteus sera necesario poner ese cristal mas  los condensadores dado que solo es simulacion ? , igual en el circuto de reset que pasa si no los pongo ,  tengo problemas al simular en proteus la interrupcion del timer0 no hace lo que deberia hacer , pues me late que es el simulador proteus , si podrias por favor poner una imagen de como es la parte en que cargas el HEX en el proteus te agradeceria ver esa ventana del micro "Edit Componet".

haber si haces un programita donde se use interrrupciones INT0  por ejemplo y el TIMER0, y ver si se puede simular bien en el proteus
graciela  Mr. Green

Por ahi vi que desde al AVR Studio se puede ver el diseño hecho en proteus tan solo seleccionando la palateforma "PROTEUS  VSM VIEWER " esto funciona con AVR studio 4.14  o superior   y proteus 7.4  o superior.   ,   ahi les dejo una imagen








 
« Última modificación: 14 de Octubre de 2009, 03:53:40 por betito_mmf » En línea

Smile Smile Smile  HOY SERE MEJOR QUE AYER  Mr. Green
MiCrOtRoNiC
PIC18
****
Desconectado Desconectado

Sexo: Masculino
Venezuela Venezuela

Mensajes: 271



« Respuesta #87 : 14 de Octubre de 2009, 09:36:54 »

betito_mmf ... amigo ese pulgin ya lo tiene integrado el mismo avr studio  desde la version 4.15 creo yo tengo la ultima que es la 4.17 buil 666 cuando creas un proyecto hay en la opciones de la opcion de proteus vsm.... si no creas el proyecto normal y donde dice debug buscas 'Select Platform and Device'  y hay tienes la opcion de selecionar el proteus vsm viewer....

saludos
En línea
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #88 : 14 de Octubre de 2009, 12:01:47 »

me podrias decir que version de proteus estas utilizando , por lo que veo cuando armas el diseño en proteus sera necesario poner ese cristal mas  los condensadores dado que solo es simulacion ?
Parece que no te fijaste bien los ejemplos que puse, ni leíste los primeros post, porque algunas respuestas las tienes ahí.
En la sexta linea del último ejemplo esta las versiones que uso:
Código
GeSHi (asm):
  1. ; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
En el esquema puse el cristal porque físicamente para mis ejemplos y los fuses que use debe estar presente el cristal, se que para la simulación no hace falta colocarlo, como mencioné solo son para efectos de tener en claro el circuito a armar.

igual en el circuto de reset que pasa si no los pongo
El reset tanto en simulación como en circuito armado debe estar conectado a Vcc, en simulación no hace falta la resistencia, pero en lo real debe estar. Y si o si se usan ya que si no leí mal en la hoja de datos si lo cambias a RESET no habilitado en programación serial, puede que después ya no funcione más. Y como sabrás uso modo serial para la programación del micro.

tengo problemas al simular en proteus la interrupcion del timer0 no hace lo que deberia hacer , pues me late que es el simulador proteus , si podrias por favor poner una imagen de como es la parte en que cargas el HEX en el proteus te agradeceria ver esa ventana del micro "Edit Componet".
Eso lo puedes ver en el segundo post del hilo, en la primera página.

haber si haces un programita donde se use interrrupciones INT0  por ejemplo y el TIMER0, y ver si se puede simular bien en el proteus
graciela  Mr. Green
Ya hice un ejemplo de la interrupción externa INT0, es el Ejemplo 4. Contador de 00-99. La interrupción y manejo del TIMER/COUNTER0 es mi siguiente ejemplo, lo estaba estudiando en la hoja de datos, no pude terminarlo todavía porque tuve algunos problemas con el grabador en mi PC, reinstale mi winxp 2 veces y nada, todavía sigo instalando algunos programas, será entre estos días que pueda estar más relajado.

Lo de ver el esquema del proteus en el studio pra debug, ya te lo contestó nuestro buen amigo MiCrOtRoNiC, gracias MiCrOtRoNiC! Mr. Green no me sabía esa opción, aunque lo vi por ahí pero no me llamaba mucho la atención, pero lo probaré para saciar sus delicias lol

Y a la vez colocaré una mejor explicación de las configuraciones de los registros para uno u otro funcionamiento de los ejemplos que hice, para que se puedan comprender mejor, los editaré ahí mismo. Pero todo con calma...

Saludos!
En línea

.
kcire
Colaborador
PIC12
*****
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 84



« Respuesta #89 : 19 de Octubre de 2009, 19:23:14 »

Muy lindos ejemplos los que publicaste Cryn, veo que en pocos dias despues que te llegaron los micros ya estas avanzando a pasos agigantados  Mr. Green , voy a sacarme un poco de tiempo y asi aprender con tus ejemplos.

Un saludo,
Erick
En línea

"La imaginación es más rica que el lenguaje... sugiere con palabras, la imaginación podrá hacer el resto."
Suky
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 6725


Con Qt...


WWW
« Respuesta #90 : 19 de Octubre de 2009, 19:45:16 »

Realmente muy interesante! Pero me parece que voy a esperar tus primeros ejemplos en C  Mr. Green Basta de ASM  llorica  lol lol

Mis felicitaciones!!!

Un saludo!
En línea

Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #91 : 19 de Octubre de 2009, 22:04:21 »

Gracias kcire, y desde hace tiempo que les tenía ganas a esos micros y hasta ahora que los tengo gracias a ti y pude por fin meterles mano. Lo malo que mi GTP+ no funciona en mi casa, y eso que reinstale mi winxp 2 veces, lo debo grabar en la casa de mi asistente que ya lo tenía instalado, y para rematar no puedo instalarlo ni siquiera en la portátil de un amigo Sad. Pero bueno cada vez que puedo grabarlo allá lo hago, ahora tengo listo el siguiente ejemplo el del Timer/Counter0, en cuanto pille tiempo lo cuelgo.

jajaja que paso SUky, si a ti te gustan todos los lenguajes lol ya se viene pronto en C Mr. Green

saludos amigos y gracias por los comentarios.
En línea

.
Suky
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 6725


Con Qt...


WWW
« Respuesta #92 : 19 de Octubre de 2009, 23:40:37 »

..en la casa de mi asistente..
shocked    Mr. Green    wink

jajaja que paso SUky, si a ti te gustan todos los lenguajes lol ya se viene pronto en C Mr. Green
See! pero me estoy acostumbrando a lo fácil  lol lol

Saludos y animo en el aprendizaje!
En línea

kcire
Colaborador
PIC12
*****
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 84



« Respuesta #93 : 20 de Octubre de 2009, 11:26:28 »

Realmente muy interesante! Pero me parece que voy a esperar tus primeros ejemplos en C  Mr. Green Basta de ASM  llorica  lol lol

Pues creo yo tambien esperare a los ejemplos en C o talves realizamos algunos ejemplos en conjunto los tres Suky, Cryn y mi persona por supuesto, claro esta en menor medida  wink porque ASM me da una pereza hace ya mucho que no lo utilizo...  Confused

Asi que por el momento consigo los programas necesarios para comenzar con C.

Que raro lo que comentas sobre el GTP USB+, si en algo puedo ayudar pues estoy a la orden Cryn.

Un saludo,
Erick
En línea

"La imaginación es más rica que el lenguaje... sugiere con palabras, la imaginación podrá hacer el resto."
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #94 : 20 de Octubre de 2009, 11:28:13 »

..en la casa de mi asistente..
shocked    Mr. Green    wink

jajaja que paso SUky, si a ti te gustan todos los lenguajes lol ya se viene pronto en C Mr. Green
See! pero me estoy acostumbrando a lo fácil  lol lol

Saludos y animo en el aprendizaje!

Me contraté una jajaja, pero me anda cobrando caro, creo que comenzaré a hacerlo solo de nuevo lol lol

Vale, ya pronto comienzo en C, una vez que coloque los detalles de las configuraciones de los anteriores ejemplos para que se entiendan mejor los registros, y todavía sigo pensando en si hago una comunicación serie en asm, ya veremos.

Bien lo estarán viendo por acá, saludos
En línea

.
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #95 : 20 de Octubre de 2009, 11:38:01 »

Realmente muy interesante! Pero me parece que voy a esperar tus primeros ejemplos en C  Mr. Green Basta de ASM  llorica  lol lol

Pues creo yo tambien esperare a los ejemplos en C o talves realizamos algunos ejemplos en conjunto los tres Suky, Cryn y mi persona por supuesto, claro esta en menor medida  wink porque ASM me da una pereza hace ya mucho que no lo utilizo...  Confused

Asi que por el momento consigo los programas necesarios para comenzar con C.

Que raro lo que comentas sobre el GTP USB+, si en algo puedo ayudar pues estoy a la orden Cryn.

Un saludo,
Erick

jajaja que son flojos con el ASM lol lol lol

muy buena idea kcire, lo que podría comentarte es que veas la hoja de datos y quieras manejar algo de ahi, algún módulo que quizá se me haya olvidado y lo podemos ver en ASM.

Yo trabajo con el WinAVR y con el AVRStudio ya me descargue las últimas versiones, en cuanto siga con los ejemplos lo actualizaré en mi PC.

Rarísimo lo del GTP+, hice todo lo que pude y en mi PC no volvió más a dar luz verde Sad reinstalé 2 veces como te mencioné y diferentes winXP uno con SP2 y otro con SP3, y probé el una portátil y naa. Sisco dijo que iba ayudar, y en eso estamos. Gracias por la disposición de ayuda, si algo se te ocurre que pueda hacer me avisas, ya intenté de todo, el driver del gtp+ no se instala en mi PC, siempre aparece un mensaje de error y no se instala.

Saludos Erick, estamos hablando.
En línea

.
MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4463

MLO


« Respuesta #96 : 20 de Octubre de 2009, 11:40:26 »

 lol lol

Contrata varias, lo importante es que no se crucen los horarios!!!  wink

Yo ya comencé con el C -en verso y todo- pero no he podido pasar de la simulación, no tengo un Atmega y tampoco el programador Sad, pero nada, que en ISIS sale la cosa bien, asi que ya es un aliciente.

http://www.todopic.com.ar/foros/index.php?topic=24309.msg229362#msg229362

Saludos
En línea

El papel lo aguanta todo
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4169


ya no te extraño =p


« Respuesta #97 : 20 de Octubre de 2009, 13:44:29 »

Si lo estaba viendo de calladito MLO__ Mr. Green

Se ven muy bien tus ejemplos, son en WINAVR? ya estaré husmeando más por ahí...
Si en simulación se ve bien, ya lograste depurar en proteus directamente, sin pasar por el AVRSTUDIO?
Acá en mi ciudad tampoco los encontraba, me los compró muy amablemente kcire y el grabador me lo trajo un amigo que se fue a España y estaba de visita hace un tiempo atrás, pero incluso no hay muchos ATMEL por acá Sad ya será por otros medios...

Saludos, ya iremos aprendiendo más...
« Última modificación: 20 de Octubre de 2009, 13:48:20 por Cryn » En línea

.
MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4463

MLO


« Respuesta #98 : 20 de Octubre de 2009, 15:43:30 »

Hola.

El WINAVR no genera el .coff (o no he podido configurar eso). Los ejemplos son hechos con el CodeVisionAVR, sería como el CCS de los PIC jeje, muy fácil de usar.

Saludos
En línea

El papel lo aguanta todo
Suky
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 6725


Con Qt...


WWW
« Respuesta #99 : 20 de Octubre de 2009, 15:55:34 »

Hola.

El WINAVR no genera el .coff (o no he podido configurar eso). Los ejemplos son hechos con el CodeVisionAVR, sería como el CCS de los PIC jeje, muy fácil de usar.

Saludos

CodeVisionAVR voy a usar yo entonces  lol lol
En línea

TODOPIC
   

 En línea
Páginas: 1 2 3 4 [5] 6 7 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.26 segundos con 23 consultas.
anything