Autor Tema: Empezando con AVR  (Leído 75949 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #75 en: 08 de Octubre de 2009, 19:29:35 »
siii me sumo, gracias

Pero tengo un problema con gtp+ en mi pc, ya la reinstalé y nada todavía :( así no puedo seguir publicando los ejemplos que ya hice

Seguiré intentando, que bronca!

saludos
.

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Empezando con AVR
« Respuesta #76 en: 10 de Octubre de 2009, 02:33:26 »
CASi todas los pines del atmega tiene pull-up. Asi que esas rsistencias de 10k podia sacarlas si activas los pull-up de puertod.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #77 en: 10 de Octubre de 2009, 12:11:26 »
Si tienes razón en las pull-up cristian_elect, pero mis resistencias de los pulsadores son pull-down y a la vez debería cambiar algunas sentencias del código.

Y como dije antes solo es para empezar, se muy bien que hasta el cristal se puede omitir. Pero para mi es más didáctico hacerlo como lo hice, ya después veré las mejoras que se podrían hacer tanto en hard como en soft.

saludos y gracias por los comentarios.
.

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Empezando con AVR
« Respuesta #78 en: 10 de Octubre de 2009, 16:07:15 »
Hola Cryn Me Alegro Que Te Funcionné Ya
« Última modificación: 11 de Octubre de 2009, 14:29:35 por Belgitaes »

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Empezando con AVR
« Respuesta #79 en: 10 de Octubre de 2009, 16:52:32 »
Lamentablemente No E Podido Simularlo 
El Archivo De Simulacion Que Pusiste Conmutacion 3 pts
En Mi Version De Proteus
Por Tener Una Version No Actualizada Del Mismo
Pero Para Eso Hay Una solucion
Te Adjunto Un Documento World Con Fotos
Lo E Subido A Rapidshare
 
http://rapidshare.com/files/291267272/Importar_Un_Proyecto_En_Formato_Seccion.zip.html
 
Por Si Lo Quieres Hacer Y Asi De Esta Manera Podamos Ver Los Demas
Y Simular El Design Hecho Por Ti En Tu Version De Proteus
Bueno Es Una Sugerencia


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #80 en: 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
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #81 en: 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: 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. ; =============================

esquema:

circuito montado:

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #82 en: 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:

ADC=\frac{1024*V_{IN}}{V_{REF}}



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: 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. ; =============================

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 »
.

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Empezando con AVR
« Respuesta #83 en: 11 de Octubre de 2009, 19:51:37 »
Muchas Gracias Cryn Ahora Si Los Puedo Simular En Proteus  :g)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #84 en: 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: 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. ; =============================

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 »
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #85 en: 11 de Octubre de 2009, 21:27:29 »
Muchas Gracias Cryn Ahora Si Los Puedo Simular En Proteus  :g)
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!.
.

Desconectado betito_mmf

  • PIC10
  • *
  • Mensajes: 13
Re: Empezando con AVR
« Respuesta #86 en: 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  :mrgreen:

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 »
:-) :-) :-)  HOY SERE MEJOR QUE AYER  :mrgreen:

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: Empezando con AVR
« Respuesta #87 en: 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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #88 en: 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: 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  :mrgreen:
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! :mrgreen: 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 :D

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!
.

Desconectado kcire

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 84
Re: Empezando con AVR
« Respuesta #89 en: 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  :mrgreen: , voy a sacarme un poco de tiempo y asi aprender con tus ejemplos.

Un saludo,
Erick
"La imaginación es más rica que el lenguaje... sugiere con palabras, la imaginación podrá hacer el resto."