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

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Empezando con AVR
« en: 02 de Septiembre de 2009, 14:31:04 »
Hola estoy iniciándome en el mundo de los AVR, y pues leí algunas cosas por acá y por la web y decidí usar el AVR STUDIO 4 y el WINAVR para asm y para c respectivamente. Y por motivos de gusto usaré un ATmega8 para empezar, ya que creo estará incluido en un pedido que pronto lo haré :mrgreen:

Simularé con el mismo AVR STUDIO y con Proteus. Y estoy consiguiendo el IAR Embedded Workbench, que tengo entendido sirve para simulaciones también? o para que sirve?

Sobre el grabador, usaré mi GTP-USB+ recién adquirido :-/ y uno llamado Elcipse, quizá lo conozcan, es freeware, he tenido algunos problemas en el funcionamiento, pero si resulta lo usaré también.

Quiero empezar como lo hice con los PIC, comenzando con assembler y después con C. Y vi algunos ejemplos acá en ambos lenguajes, y comencé con este de vsZener, que era para el ATmega16, pero creo que es fácilmente adaptable al ATmega8 que es mi elegido, este el código para el parpadeo de un led cada 500ms aproximadamente por el pin B1:

Código: ASM
  1. ;--------------------------------------------------------------------------------
  2. ;       Programa:       Led on/off
  3. ;
  4. ;       Dispositivo: ATmega8                            Compilador: AVRASM2
  5. ;       Entorno IDE: AVR Studio4.15                     Simulador:      Proteus 7.5sp3
  6. ;
  7. ;       Notas:  Este programa hace parpadear un led conectado al pin RB1 del puerto
  8. ;                       B durante aprox. 0.5seg.
  9. ;      
  10. ;       Registros:      r0  -> sirve para el parpadeo del led al aplicarle un eor
  11. ;                               r16 -> On/Off led
  12. ;
  13. ;       Conexiones:     B0 -> Led
  14. ;--------------------------------------------------------------------------------
  15. ;DIRECTIVAS EN ENSAMBLADOR
  16. .include "m8def.inc"                      ;ATmega8
  17.  
  18. ;DEFINICION DE REGISTROS
  19. .def led_cambio=r0                       ;registro para parpadeo del led
  20.  
  21. ;reset-vector address $0000                    
  22. .org $0000
  23.  rjmp main                                  ;ve al main
  24.  
  25. ;PROGRAMA PRINCIPAL
  26. main:                                                  
  27.    ldi    r16,$04                            ;Configuracion de...
  28.    out  sph,r16
  29.    ldi   r16,$5F                       
  30.    out  spl,r16                              ;...la pila: Stack: $045F=RAMEND
  31.  
  32.    ser   r16                                  ;r16 <- $FF
  33.    out  ddrb,r16                            ;portB salida
  34.  
  35.    ldi   r16,$02                             ;r16 <- $02 -> Iluminar led conectado pin RB1
  36.  
  37.    mov  led_cambio,r16                  ;led_cambio <- r16 :variable para el parpadeo
  38.        
  39. loop:
  40.    out   portb,r16                          ;actuamos sobre el led(conectado al pin RB0)
  41.    eor   r16,led_cambio                  ;cambiamos estado on/off
  42.    rcall  delay                               ;retraso de 0.5seg
  43.    rjmp  loop                                ;bucle infinito
  44.  
  45.  
  46. ;************************************
  47. ;       Subrutina: Delay
  48. ;
  49. ;       Genera un retardo via software de
  50. ;       aproximadamente 0.5seg
  51. ;
  52. ;       Tiempo= 0.75us + 1.5us + 0.75us +
  53. ;                       490.8875ms + 0.5us + 1.5us
  54. ;                       + 1us = 490.8935ms
  55. ;
  56. ;       Se conserva todo
  57. ;*************************************
  58. delay:                          ;llamada a subrutina -> 3#clocks -> 0.75seg
  59.         push    r16                     ;apilamos...         : 0.5us
  60.         push    r1                      ;                                    : 0.5us
  61.         push    r2                      ;registros r16,r1,r2 : 0.5us --> 3·0.5 = 1.5us
  62.  
  63.         ldi             r17,$0A         ;Cargamos retardo  : 0.25us
  64.         clr             r1                      ;r1 <- 0           : 0.25us  
  65.         clr             r2                      ;r2 <- 0           : 0.25us  --> 3·0.25 = 0.75us
  66. delay_1:                       
  67.         dec             r1                      ;r1--              : 255·(0.25us + 0.5us)=191.25us                                                    
  68.         brne    delay_1         ;cuando es cierto  : 0.5us
  69.         dec             r2                      ;r2--              : 255·(191.75us + 0.5us + 0.25us)=49.0875ms
  70.         brne    delay_1         ;cuando es cierto  : 0.5us
  71.         dec             r17                     ;r17--                     : 10(49.088ms + 0.5us + 0.25us)=490.8875ms
  72.         brne    delay_1         ;cuando es cierto  : 0.5us
  73.        
  74.         pop             r16                     ;desapilamos...    : 0.5us
  75.         pop             r1                      ;                                  : 0.5us
  76.         pop             r2                      ;...registros      : 0.5us --> 3·0.5 = 1.5us
  77.  
  78.         ret                                     ;fin subrutina delay : 1us

El esquema de la simulación:

Y adjunto el .asm y el archivo de proteus.

Seguiré leyendo y haciendo las mismas practicas que hice con PIC's cuando me inicie. Todavía falta la prueba física.

saludos
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #1 en: 02 de Septiembre de 2009, 14:41:17 »
Y bueno ahora empezando con este ejemplo me quedan varias dudas, espero puedan ayudarme

1. Existe algún soft para generar retardos para AVR?
2. En el código de ejemplo no ví los fuses, palabra de configuración o equivalente para los AVR, no es necesario? o donde se lo hace? el cristal por ejemplo :?

3. En el proteus vi que existe una ventana muy diferente a la de los pic's, hay otras cosas más, y como saber las configuraciones correctas, esos ya son los fuses? con el código de arriba dejé con estas configuraciones en el proteus:


Muchas gracias por la ayuda, saludos
.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4917
Re: Empezando con AVR
« Respuesta #2 en: 02 de Septiembre de 2009, 14:56:58 »
 :-/ :-/ pues aqui tiene uno que te sigue  :-/ :-/ :-/
 :D ya somos 2 a ver quien mas se apunta  :-/ :-/

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #3 en: 02 de Septiembre de 2009, 15:18:10 »
gracias por el interés Rafa, a ver quien puede ayudarnos con las primeras dudas

saludos
.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4917
Re: Empezando con AVR
« Respuesta #4 en: 02 de Septiembre de 2009, 16:59:02 »
Y bueno ahora empezando con este ejemplo me quedan varias dudas, espero puedan ayudarme

1. Existe algún soft para generar retardos para AVR?
2. En el código de ejemplo no ví los fuses, palabra de configuración o equivalente para los AVR, no es necesario? o donde se lo hace? el cristal por ejemplo :?

3. En el proteus vi que existe una ventana muy diferente a la de los pic's, hay otras cosas más, y como saber las configuraciones correctas, esos ya son los fuses? con el código de arriba dejé con estas configuraciones en el proteus:


Muchas gracias por la ayuda, saludos


yo no se un software de retardo pero se puede hacer WINAVR, aunque no estoy muy fino encontre este ejemplo

Código: [Seleccionar]
void delayLong() //retardo
{
   unsigned int delayvar;
   delayvar = 0;
   while (delayvar <=  65500U)      
   {
      asm("nop");
      delayvar++;
   }
}  


los Fuses se debe programar CKSEL Fuses aqui seliciona el cristal interno o externo y su funcion en division.
ya pondre algunos ejemplo cuando tenga un tiempo.
« Última modificación: 02 de Septiembre de 2009, 17:39:05 por un Moderador »

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #5 en: 02 de Septiembre de 2009, 17:17:21 »
el WINAVR es compilador en C, verdad? todavía no quiero ver mucho de C, quisiera aprender ASM primero

y los otros fuses como van?

y dentro del código se colocan los fuses?

gracias
.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Empezando con AVR
« Respuesta #6 en: 02 de Septiembre de 2009, 23:35:42 »

Los programas que realize en asm , los fuses los seleccionaba al momento de programar por eso tuve algunos inconveniente sy mates unos cuantos aTMEGAS xD.

Cuidado con los fuses de OScilador y el MCLR.

Espero poder ayudar con algunos programillas en asm.

Saludos!

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: Empezando con AVR
« Respuesta #7 en: 03 de Septiembre de 2009, 00:02:57 »
cryn el IAR Embedded Workbench es un compilador c/c++ ..segun eh leido por hay es uno de los mejores en optimizacionde codigo....tambien otro muy popular   bueno es el codevisionavr....todos estos en c.... tanto el winavr,iar,codevision.puedes simularlos  en el proteus
los fuses los puedes configurar haci por ejemplo...
en WINAVR

#Fuse settings
HFUSE=0xc1
LFUSE=0xef
EFUSE=0xff

o utiliza mejor el wizard de esta pagina para configurarlos...
calfuses

otro

AVR Coder

o si no puedes configurarlos directamente desde el software que utlizes para programar hay configurar los fuses

aunque cryn yo estoy por comprarme un tarjeta de desarrollo arduino mega o la duemilanove me parece un buen comienzo...


edit...

para el generador de retardos esta este programa
generador
« Última modificación: 03 de Septiembre de 2009, 00:25:23 por MiCrOtRoNiC »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Empezando con AVR
« Respuesta #8 en: 03 de Septiembre de 2009, 00:11:50 »

A mi no me convenció Arduino , lo probe un rato pero pues es mi gusto xD

Empece con ASM , luego WINAVR GCC y después ARduino

Me quede con WinAVR.

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: Empezando con AVR
« Respuesta #9 en: 03 de Septiembre de 2009, 00:32:03 »
bueno a mi me parecio muy bueno un amigo tiene el mega y ha hecho cosas increibles con el :mrgreen: :mrgreen:...pero no me refiero tanto a su entorno de programacion si no a la "placa"






 es muy util ademas de ser de bajo coste...igual tiene conector isp para programarlo con cualquier otro programador....se puede utlizar como un entrenador si cabe el termino...
« Última modificación: 03 de Septiembre de 2009, 00:38:12 por MiCrOtRoNiC »

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #10 en: 03 de Septiembre de 2009, 10:46:39 »
Hola AKENA y MiCrOtRoNiC, gracias por las respuestas

ahorita el fuse del oscilador es el que más me está confundiendo, me pueden explicar las distintas configuraciones de ese Fuse?

Tengo entendido que no todos los fuses son accesibles por el modo de programación Serial? y que para tener control de todos los fuses hay que programar en paralelo? porque?

Lo de la pagina de calfuses, al final muestra el word que será grabado?

El AVR COder, me vendrá  muy bien cuando este empezando en C. Primero quisiera entender su asm de los AVR.

Quisiera comprarme una placa para esto, pero primeramente necesito una impresora y una plastificadora

Estaba probando el generador que mencionas par lso retardos, pero nose usarlo, nose como puedo generar un retardo de 1 seg por ej, con un cristal de 4MHz

muchas gracias por sus respuestas.
.

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: Empezando con AVR
« Respuesta #11 en: 03 de Septiembre de 2009, 11:08:55 »
aqui explican la configuracionde fuses para el oscilador del atmega 8...
 los fuses los puedes programar todos de forma serial....el problema es que si lo configuras mal el oscilador mediante la programacion tendras que saber como lo configuraste para volverlo a programar....mediante la opcion paralela no importa como configures el clock simpre podras programarlo o revivirlo.....

link

 aqui tienes otra calcular de fuses hecho en excel...

CAL Excel


edit..

el generador cryn es facil solo seleccionas donde dice "or time and cycle rate"  time / sec" hay puedes colocar 1 que quiere decir un segundo y abajo selecionas el clock ...

despues en la parte superior estas para que te dibiertas con los 32 registros de proposito general puedes utlizar 3 diferentes cualquiera que quieras...
« Última modificación: 03 de Septiembre de 2009, 11:14:17 por MiCrOtRoNiC »

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4917
Re: Empezando con AVR
« Respuesta #12 en: 03 de Septiembre de 2009, 12:56:49 »
 :-/ :-/ gracias Microtronic por tu aporte, estoy preparando ejemplo para postearlo y probandolo con mi placa STK500 ante de postearlo, paciencia  :mrgreen:

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #13 en: 03 de Septiembre de 2009, 14:28:35 »
Gracias por responder Microtronic,

leeré el link que dejaste de los fuses

muy util ese exel, también es para el atmega8? o para varios?

sobre el generador de retardos, si intenté eso pero no me genera nada, quizá haya algo que em estoy olvidando, pero no veo nada, mira esto es lo que tengo, después de darle en GO, no me genera nada :(:


Esperamos entonces por tu ejemplo Rafa!

mil gracias, saludos
.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4917
Re: Empezando con AVR
« Respuesta #14 en: 03 de Septiembre de 2009, 15:03:30 »
Cryn el error esta en los registros R29,R30,R31, aparte con 1  segundo y 4Mhz no se lo hace, prueba otros registros,Pje, 17,18,19 , o prueba como lo tiene con frecuencia de 8Mhz, aqui esta
Código: [Seleccionar]
WGLOOP1:  ldi  R31, $C4
WGLOOP2:  dec  R31
          brne WGLOOP2
          dec  R30
          brne WGLOOP1
          dec  R29
          brne WGLOOP0
; -----------------------------
; delaying 6 cycles:
          ldi  R29, $02
WGLOOP3:  dec  R29
          brne WGLOOP3
; -----------------------------
; delaying 2 cycles:
          nop
          nop
; =============================  


Código: [Seleccionar]
WGLOOP0:  ldi  R18, $BC
WGLOOP1:  ldi  R19, $C4
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; delaying 3 cycles:
          ldi  R17, $01
WGLOOP3:  dec  R17
          brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
          nop
; =============================