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

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #60 en: 30 de Septiembre de 2009, 14:28:44 »
Ya hay bastante con los fuses ahora empiecen con el winavr y con sub funciones por que a mí no me sale se pierde codigo cuando es optimizado en zize.

jajaja y si, ya nos pasamos con el tema de los fuses y el bootloader que se coló :mrgreen:

Como mencioné yo tengo ya realizadas algunas practicas en ASM, para ser exacto son 5, la primera ya la postié, del parpadeo de un led cada segundo, estoy esperando por obtener unos cuantos AVR para montarlos y mostrar que en realidad si funcionan, para convencerme a mi y a los incrédulos :D

El WINAVR lo estudiaré también colocando las mismas practicas que hice en asm pero como es de esperarse estarán en C. Pero esto lo haré posteriormente, cuando termine estas practicas en ASM para iniciarme y comprender la lógica interna del micro, las instrucciones etc, etc.

Espero no tener muchos problemas con los AVR y poder realizar lo más pronto que se pueda estas praticas tanto en ASM como en C

Saludos
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #61 en: 30 de Septiembre de 2009, 14:34:18 »
AKENAFAB, quería hacerte una consulta, ya que hablaste de algunas configuraciones del avr studio, es la siguiente:

casualmente hice mis cálculos para 4MHz y el avr studio está configurado para que en su simulación-depuración corra a esa misma velocidad, y fue una total coincidencia, aunque no es relevante, pues en cuanto a simulación de retardos prefiero no hacerlos en el avr studio porque parece que demora bastante, al menos no pude apreciarlo, colocaba un breakpoint después del retardo y nuca pasaba.. quizá algo hago mal por ahí pero en fin, esa no es mi duda, sino de que como se puede configurar la frecuencia de clock que se usará en el debug del avr studio??
.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Empezando con AVR
« Respuesta #62 en: 30 de Septiembre de 2009, 14:45:38 »

Deja reviso que de momento no recuerdo , hace tiempo que no toco avrstudio xD.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Empezando con AVR
« Respuesta #63 en: 30 de Septiembre de 2009, 15:26:07 »
AKENAFAB, quería hacerte una consulta, ya que hablaste de algunas configuraciones del avr studio, es la siguiente:

casualmente hice mis cálculos para 4MHz y el avr studio está configurado para que en su simulación-depuración corra a esa misma velocidad, y fue una total coincidencia, aunque no es relevante, pues en cuanto a simulación de retardos prefiero no hacerlos en el avr studio porque parece que demora bastante, al menos no pude apreciarlo, colocaba un breakpoint después del retardo y nuca pasaba.. quizá algo hago mal por ahí pero en fin, esa no es mi duda, sino de que como se puede configurar la frecuencia de clock que se usará en el debug del avr studio??

Hola Cryn , no soy fino simulando en AVR pero haciendo prueba con el AVRStudio4 tu puede controlar la Simulacion, loo puede hacer paso a paso o avanzado,  los del calculo del Reloj, si te va Opcion Debug alli cambie el Reloj :z) :z) quizas este diciendo burradas pero es la unica forma que se puede ver los modulos de los Registros y ver lo que sucede.
Saludo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #64 en: 30 de Septiembre de 2009, 17:10:59 »
ya lo encontré, si, está en el menú DEBUG, la opción AVR SIMULATOR OPTIONS y hay más opciones de simulación

saludos
.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Empezando con AVR
« Respuesta #65 en: 30 de Septiembre de 2009, 21:18:58 »

Hola Cryn , no soy fino simulando en AVR pero haciendo prueba con el AVRStudio4 tu puede controlar la Simulacion, loo puede hacer paso a paso o avanzado,  los del calculo del Reloj, si te va Opcion Debug alli cambie el Reloj :z) :z) quizas este diciendo burradas pero es la unica forma que se puede ver los modulos de los Registros y ver lo que sucede.
Saludo


Amigo stk500 , estuvo fino . Justo como lo comenta 8)

ya lo encontré, si, está en el menú DEBUG, la opción AVR SIMULATOR OPTIONS y hay más opciones de simulación

saludos

Que bien Cryn , me han refrescado la memoria  ;-)

Saludos!

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Empezando con AVR
« Respuesta #66 en: 01 de Octubre de 2009, 03:32:07 »
xstk500

Código: [Seleccionar]
Perdoname Belgitaes pero tampoco te sigo comprendiendo,
que tiene que ver un Bootloader con los Fuses!!!

Bootloader / Principio
Un Programa de Bootloader Tiene Por Funcion Escribir Dentro De La Flash Del Micro
Modificando Los Fuses Bits Del Atmega BOOTRST Y BOOTSIZE
Hay 2 Zonas De Boot
(BOOTRST* Desactivado) Comenzando En La Direcion 00 y
(BOOTRST* Activado) Comenzando En La Parte Alta Dependiendo De BOOTSZ

Los Fusibles Son Bits De Control Que Establecen La Base Operanti Del Micro
Lo Que Permite El Control Como La Fuente De Reloj , El Watchdog Timer , Etc...

En Esta Pagina Tienes Ejemplo De Boot
http://gandalf.arubi.uni-kl.de/avr_projects/
 
Busca En Ella AVRPROG compatible bootloader for ATMEL ATmega Controllers
Y Bajate El Download the old version 0.80 here.De Olaf Rempel

Ahora Abres El Fichero Make files Yo Lo Abri Con El Visual C++
# MCU name
## MCU = atmega8
## MCU = atmega16
MCU = atmega32      Este Es El Que Esta Marcado Por defecto
## MCU = atmega128
## MCU = at90can128


# /* Select if bootloader should include the inverrupt-vectors
# when selecting 'no' here, the bootloader must not use
# any interrupts and the modified linker-scripts are used. */
##BOOTINTVEC=yes
BOOTINTVEC=no

Traducido En Español :Seleccione si el cargador de arranque debería incluir los vectores inverrupt -
Cuando Seleciona "no" el gestor de arranque no se debe utilizar

Ahora Abre El Archivo mega8.h Y Veras Como Configura La Velocidad De Transmision

Con Eso Queria Explicar Que Si Tu En Tu Programa De Bootloader Que Es Un Archivo .Hex
Lo Programas De Forma Que puedas Controlar La Fuente De Reloj , El Watchdog Timer , Etc...
Y Lo Cargas Luego Modificando Los Fuses Bits Del Atmega BOOTRST Y BOOTSIZE
Estas Cargando un Programa Que Permite El Control De Los Bits Que Establecen La Base Operanti Del Micro

CKSEL: Se utiliza para seleccionar los tipos de reloj a utilizar
Código: [Seleccionar]
;****************************************************************************************
;El Timer/Counter Puede Ser Sincronizado Por Un Reloj Interno O Una Fuente Externa
;El Reloj Fuente Esta Selecionando A Traves El Clock Select
;El Clock Select Son Tres Bits CS02 CS01 CS00
;Lo Cuales Permiten Selecionar La Fuente De Reloj A Emplear Por El Timer/Counter
;TCCR0B : Timer/Counter Control Register B :
;|------|------|------|------|------|------|------|------|
;|FOC0A |FOC0B |  –   |  –   |WGM02 | CS02 | CS01 | CS00 |
;|------|------|------|------|------|------|------|------|
;                                           1    0    1 = ClkI/O/1024 (From Prescaler)
;                                                         Table 14-9. Datasheet Pagina 106

;Si Se Utiliza El Modo Externo Para El Timer/Counter0 La Transmision Del Reloj Externo
;Sobre El Pin T0 Se Hara Igualmente Si El Pin Esta Configurado Como Salida
;Esta Particularidad Permite El Control Del Contador Por Software 
 
 LDI     R17,0x05         ;Prescalado CLK/1024
 OUT     TCCR0B,R17       ;Timer/Counter
;****************************************************************************************


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Empezando con AVR
« Respuesta #67 en: 01 de Octubre de 2009, 16:15:22 »
Hola.

Hay algo que no entiendo, cuando cargo el .cof al ISIS no despliega el valor de las variables, eso es normal o hay alguna forma de visualizarlas? Cuando declaro estructuras si se ven, pero si no, no.



Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #68 en: 07 de Octubre de 2009, 13:16:00 »
Bueno lo prometido entonces...

EJEMPLO 1

Manejaremos como primer ejemplo a un puerto del micro como salida, para encender y apagar un led pasado un segundo, veremos también entonces como generar retardos.

Los puertos del micro tienen tres registros para su manipulación, estos son para el puerto B que primeramente usaremos:

  • DDRB – The Port B Data Direction Register
  • PORTB – The Port B Data Register
  • PINB – The Port B Input Pins Address

DDRB – The Port B Data Direction Register


Este Registro sirve para configurar la dirección o sentido que se dará al cada pin del puerto, esto es como entrada o salida.

Si se escribe un 0 en el DDRxn, ese pin se comportará como entrada. Por el contrario si se escribe un 1 en el DDRxn, ese pin se comportará como salida.

PORTB – The Port B Data Register


Este registro se utiliza para manipular solo a los pines que serán salidas.

Si se escribe un 1 en PORTxn cuando el pin ha sido configurado como entrada, la resistencia de pull-up es activada en ese pin, para desactivar la pull-up, el PORTxn debe ser puesto a 0 ó el Ppipn debe ser configurado como salida. Los pines del puerto se comportan como tri-estado cuando vendrá activa la condición de reset. Si el PORTxn es puesto a 1 y está configurado como salida, el pin es puesto a alto (1). Si el PORTnx es puesto a 0, el pin es puesto a bajo (0).

El registro PINx lo veremos en el siguiente ejemplo.

Para generar retardos usaremos el programa AVRdelayloop ya explicado anteriormente, debemos generar un retardo de 4'000.000 de ciclos, ya que el micro correrá a 4MHz y funciona a 4MIPS, pues la Fosc es directamente de 4MHz también, entonces contando los 4 millones de ciclos tenemos el retardo de 1Seg que buscamos.

El código del primer ejemplo es el expuesto antes

Acá una imagen del esquema del circuito completo que debería usarse para este ejemplo:


Ahora nos toca ver una imagen del circuito montado:


y un video de su correcto funcionamiento, esto sirvió para convencerme y espero que para convencerlos :mrgreen:, la uñita pintada es de mi asistente jeje:


Y consideraremos para este y futuros ejemplo, a menos que mencione algún cambio, los siguientes fuses:


Para más detalles de estos registros y de todos los registros que veremos en los ejemplos he usado la información que da la hoja de datos del micro, si algo no está claro o se necesita más información el lugar adecuado para buscarlo es ahí.
« Última modificación: 23 de Octubre de 2009, 13:40:07 por Cryn »
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #69 en: 07 de Octubre de 2009, 13:48:57 »
EJEMPLO 2

Ya manejamos un puerto como salida, ahora nos toca ver el puerto como entrada, ya que el micro posee registros dedicados para entrada y salida, como ya vimos el de salida se llama PORTx y el de entrada es el PINx. Se tiene entonces 3 registros por puerto, son el DDRx, PORTx y PINx.

PIND – The Port D Input Pins Address


Es un registro de solo lectura accedible en cualquier momento para leer el puerto o solo un pin en cualquier momento.

Ahora toca el segundo ejemplo, es el encendido y apagado de un led, mediante pulsadores distintos, es decir con uno solo se enciende y con el otro solo se apaga. Mediante el registro PIND obtendremos la lectura de los pienes correspondientes a los pulsadores.

Acá el código

Código: ASM
  1. ;--------------------------------------------------------------------------------
  2. ;       Programa:       Led on/off con Pulsador On y Pulsador Off distintos
  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 enciende un Led con un Pulsador, y lo apaga
  9. ;           Mediante otro pulsador.
  10. ;      
  11. ;       Registros:      r16, donde se lee el puerto D, y se decide encender, apagar, o no hacer nada
  12. ;
  13. ;       Conexiones:     B1 -> Led
  14. ;               D0 -> Pulsador ON
  15. ;               D1 -> Pulsador OFF
  16. ;--------------------------------------------------------------------------------
  17. ;DIRECTIVAS EN ENSAMBLADOR
  18. .include "m8def.inc"        ;ATmega8
  19.  
  20. ;reset-vector address $0000                    
  21. .org $0000
  22.         rjmp main               ;ve al main
  23.  
  24. ;PROGRAMA PRINCIPAL
  25. main:
  26.         ldi  r16,$04                     ;Configuracion de...
  27.         out  sph,r16   
  28.         ldi  r16,$5F                   
  29.         out  spl,r16                     ;...la pila: Stack: $045F=RAMEND
  30.         ser  r16                         ;r16 <- $FF
  31.         out  ddrb,r16                    ;portB salida
  32.         clr  r16                                 ;r16 <- $00
  33.         out  ddrd,r16                    ;portD entradas
  34.  
  35.         ;ldi  ddrb,$ff                  ;puertoB salidas
  36.         ;ldi  ddrd,$00                  ;puertoD entradas
  37.  
  38. loop:
  39.         in   r16,pind                    ;leer puertoD
  40.         sbrc r16,0                       ;si el pin D0 es cero saltamos una instrucción
  41.         sbi  portb,1                     ;sino se pone a alto el pin B1
  42.         sbrc r16,1                       ;si el pin D1 es cero saltamos una instrucción
  43.         cbi  portb,1                     ;sino se pone a bajo el pin B1
  44.         rjmp loop                        ;bucle infinito

El esquema del circuito:


La imagen del circuito montado:


Y por último el video del circuito funcionando:
[/youtube]
« Última modificación: 23 de Octubre de 2009, 13:03:31 por Cryn »
.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 326
Re: Empezando con AVR
« Respuesta #70 en: 07 de Octubre de 2009, 15:03:54 »
Muchas gracias cryn por los ejemplos están muy buenos  :-/ :-/

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Empezando con AVR
« Respuesta #71 en: 07 de Octubre de 2009, 16:12:24 »
 :-/ :-/ quieros ver mas ejemplo amigo Cryn  :-/ :-/ :-/
Te quedo muy chulo y me alegro que te guste trabajar con losl Atmel,  :P asi nos ayudamos  :-/ :-/


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #72 en: 07 de Octubre de 2009, 16:56:42 »
gracias stk500 y jonathanPIC888, tendrás que cambiar tu nombre a AVR :D

y si tengo 4 pendientes más :mrgreen:, todavía necesita una reinstalación mi PC porque arruiné mi regedit y no puedo reconocer al gtp+, estos ejemplos los tuve que grabar en la casa y PC de mi asistente :D lo hice todo ahí, fotos, video y prueba.

tengo un tercer ejemplo que no esta funcionando, lo raro es que en simulación si da muy bien, en seguida lo cuelgo para que lo vean y quizá encontrar mi error.

saludos y gracias por los comentarios.
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #73 en: 07 de Octubre de 2009, 19:02:28 »
EJEMPLO 3

Bueno ya sabemos manejar los puertos como entrada y salida, esta es una aplicación para tener siempre en cuenta los efectos de los pulsadores, cuando éstos no solo hagan una sola cosa como en el anterior ejemplo.

El tercer ejemplo consiste en un conmutador, es decir se enciende y se apaga un led mediante un mismo pulsador, tengo tres pulsadores instaladas, todos con las mismas funciones. Acá se ve el efecto que se hace para evitar el rebote de contactos, lo combatimos mediante software con retardos.

Este rebote de contactos, como el pulsador tendrá dos funciones, de encender y apagar hace funcionar inadecuadamente al circuito si no se controla adecuadamente.

Existe también el combate a los rebotes mediante hardware, pero como ya no quiero aumentarle más componentes prefiero hacerlo solamente por soft, en la web seguramente encontrarán esquemas muy buenos para pelear contra el ruido de los rebotes por hardware, y la combinación de la lucha por soft y hard seguramente nos dará un equipo más seguro, ya son cuestiones de necesidad, aplicación, etc.

Nuestra código anti-rebote es el siguiente:

toggle:
   rcall delay20m        ;retardo antirrebote
   in    r16,pind          ;leer puertoD
   andi  r16,$07         ;AND con 7 que son los pines habilitados como entradas
   cpi   r16,0             ;comparar con cero, para asegurar que se solto el pulsador
   brne  toggle           ;si no se solto seguimos con el retardo

también puede haber otra forma de hacerlo, como en programación no todos pensamos igual, esta es la que yo aprendí.

Acá tenemos el código del programa:
Código: ASM
  1. ;--------------------------------------------------------------------------------
  2. ;       Programa:       Led on/off con el mismo Pulsador On/Off, conmutación 3 puntos
  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 enciende un Led con un Pulsador, y lo apaga
  9. ;           con el mismo pulsador, desde 3 puntos.
  10. ;      
  11. ;       Registros:      r16 para almacenar la lectura del puertoD, r19 y r20 para
  12. ;                               el XOR, r17 y r18 para el retardo de 25ms antirrebote
  13. ;
  14. ;       Conexiones:     B1 -> Led
  15. ;               D0 -> Pulsador1
  16. ;               D1 -> Pulsador2
  17. ;               D2 -> Pulsador3
  18. ;--------------------------------------------------------------------------------
  19. ;DIRECTIVAS EN ENSAMBLADOR
  20. .include "m8def.inc"        ;ATmega8
  21.  
  22. ;reset-vector address $0000                    
  23. .org $0000
  24.         rjmp main               ;ve al main
  25.  
  26. ;PROGRAMA PRINCIPAL
  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.         ser  r16                ;r16 <- $FF
  33.         out  ddrb,r16           ;portB salida
  34.         clr  r16                ;r16 <- $00
  35.         out  ddrd,r16           ;portD entradas
  36.         ldi  r19,2                              ;cargar el valor para toggle
  37. loop:
  38.         in    r16,pind          ;leer puertoD
  39.         sbrc  r16,0             ;si el pin D0 es cero saltamos una instrucción
  40.         rcall toggle            ;cambiamos estado del pin
  41.         sbrc  r16,1             ;si el pin D1 es cero saltamos una instrucción
  42.         rcall toggle            ;cambiamos estado del pin
  43.         sbrc  r16,2             ;si el pin D2 es cero saltamos una instrucción
  44.         rcall toggle            ;cambiamos estado del pin
  45.         rjmp  loop              ;bucle infinito
  46.  
  47. toggle:
  48.         rcall delay20m          ;retardo antirrebote
  49.         in    r16,pind          ;leer puertoD
  50.         andi  r16,$07           ;AND con 7 que son los pines habilitados como entradas
  51.         cpi   r16,0                     ;comparar con cero, para asegurar que se solto el pulsador
  52.         brne  toggle            ;si no se solto seguimos con el retardo
  53.         eor   r20,r19           ;xor
  54.         out   portb,r20         ;salida al puertob
  55.         ret                             ;retorno de subrutina
  56.  
  57. ; =============================
  58. ;    delay loop generator
  59. ;     80000 cycles:
  60. ; -----------------------------
  61. ; delaying 79998 cycles:
  62. delay20m:
  63.           ldi  R17, $86
  64. WGLOOP0:  ldi  R18, $C6
  65. WGLOOP1:  dec  R18
  66.           brne WGLOOP1
  67.           dec  R17
  68.           brne WGLOOP0
  69. ; -----------------------------
  70. ; delaying 2 cycles:
  71.           nop
  72.           nop
  73.           ret
  74. ; =============================

El esquema del circuito:

La foto del circuito montado:

Y el video del circuito funcionando:

Hay un pequeño problema parece que se debe tener presionado bastante tiempo el pulsador y recién se ejecuta la orden, en simulación si funciona muy bien, pero en el circuito armado pasa el problema que mencioné, estaré revisando el código y lo actualizaré acá mismo cuando encuentre solucionar este pequeño desperfecto.

Lo solucioné colocando un ANDI con 0x07, para colocar a cero los otros pines que están flotantes:

toggle:
        rcall delay20m         ;retardo antirrebote
   in    r16,pind         ;leer puertoD
   andi  r16,$07         ;AND con 7 que son los pines habilitados como entradas
   cpi   r16,0            ;comparar con cero, para asegurar que se solto el pulsador
   brne  toggle         ;si no se solto seguimos con el retardo
   eor   r20,r19         ;xor
   out   portb,r20         ;salida al puertob
   ret                  ;retorno de subrutina

Corregido el error ahora funciona todo ok!

Ya se viene el 4to ejemplo.
« Última modificación: 22 de Octubre de 2009, 22:14:53 por Cryn »
.

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: Empezando con AVR
« Respuesta #74 en: 08 de Octubre de 2009, 18:52:31 »
que bien cryn ya se suman mas usuarios al club avr   :-/ ..jejeje

felicidades


 

anything