TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: Cryn en 02 de Septiembre de 2009, 14:31:04

Título: Empezando con AVR
Publicado por: Cryn 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 (http://www.todopic.com.ar/foros/index.php?topic=15073.msg93770#msg93770), 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:
(http://img212.imageshack.us/img212/26/eskema.jpg) (http://img212.imageshack.us/img212/26/eskema.jpg)

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
Título: Re: Empezando con AVR
Publicado por: Cryn 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:

(http://img405.imageshack.us/img405/1857/ventana.jpg) (http://img405.imageshack.us/img405/1857/ventana.jpg)

Muchas gracias por la ayuda, saludos
Título: Re: Empezando con AVR
Publicado por: stk500 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  :-/ :-/
Título: Re: Empezando con AVR
Publicado por: Cryn 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
Título: Re: Empezando con AVR
Publicado por: stk500 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:

(http://img405.imageshack.us/img405/1857/ventana.jpg) (http://img405.imageshack.us/img405/1857/ventana.jpg)

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.
Título: Re: Empezando con AVR
Publicado por: Cryn 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
Título: Re: Empezando con AVR
Publicado por: AKENAFAB 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!
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC 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 (http://www.engbedded.com/fusecalc/)

otro

AVR Coder (http://www.jarkonkotisivu.org/AVRcoder/)

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 (http://www.electronics-lab.com/downloads/cnt/fclick.php?fid=23)
Título: Re: Empezando con AVR
Publicado por: AKENAFAB 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.
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC 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"

(http://farm4.static.flickr.com/3451/3386716407_c973585e6e.jpg)

(http://inmotion.pt/blog/wp-content/uploads/2009/01/arduino_specialed.jpg)


 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...
Título: Re: Empezando con AVR
Publicado por: Cryn 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.
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC 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 (http://www.scienceprog.com/programming-avr-fuse-bits-oscillator-settings/)

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

CAL Excel (http://www.4shared.com/file/129894724/4a1631a8/fuse.html)


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...
Título: Re: Empezando con AVR
Publicado por: stk500 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:
Título: Re: Empezando con AVR
Publicado por: Cryn 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 :(:

(http://img377.imageshack.us/img377/8706/delay.jpg)

Esperamos entonces por tu ejemplo Rafa!

mil gracias, saludos
Título: Re: Empezando con AVR
Publicado por: stk500 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
; ============================= 
Título: Re: Empezando con AVR
Publicado por: stk500 en 03 de Septiembre de 2009, 16:07:48
aqui un ejemplo de encender LED con el atmega 8, se puede hacer con otro Micro tambien.
 
Código: [Seleccionar]
;encled.asm
;LED en pin PORTB0 con resistencia 470 Ohm



.include "m8def.inc"
.cseg
.org 0
rjmp RESET ;Reset Handle
rjmp RESET
rjmp RESET
RESET: ldi r16, 0b11111111 ;cargamos el  registro r16 como salida
out DDRB, r16 ;configuramos PORT B for all outputs
loopit: ldi r16, 0 ;cargamos todos PORTB a 0 al registro R16
out PORTB, r16 ;aqui encendemos todas las salida del PORTB
rjmp loopit
 
y luego sigo
Título: Re: Empezando con AVR
Publicado por: AKENAFAB en 03 de Septiembre de 2009, 16:33:36
Eso si Microtronic xD las placas son una pasada , más las MEga que muestras.

Saludos!
Título: Re: Empezando con AVR
Publicado por: Cryn en 03 de Septiembre de 2009, 16:40:09
sigo sin sacar el retardo, quisiera tener 1 seg con 4MHz de preferencia, pero aunque vario tanto los registros como las frecuencias nada, no genera nada. En ciclos, la 1ra opción en 1 (decide wether to input) ahi si lo genera, pero con la otra como deje, nada...

si lo hiciste con la opción "or time and cycle rate", te rogaría qeu me muestres una captura de tu pantalla, para que pueda como se hace, como dices si es necesario usar otro valor de cristal no hay problema, pero porque no puedo usar 4MHz?

gracias por el ejemplo Rafa

saludos
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 03 de Septiembre de 2009, 23:37:03
Aqui tengo una version que lo baje año pasado esta si funciona para los segundos.
La ultima que baje solo funciona con ciclos.

Edición por moderador:
http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html
Título: Re: Empezando con AVR
Publicado por: Cryn en 04 de Septiembre de 2009, 00:09:33
creo que tengo una maldición, no puedo hacerlo :( sigue sin salir nada de código, como el la última imagen que mostré
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 04 de Septiembre de 2009, 02:33:54
Código: [Seleccionar]
sigo sin sacar el retardo,
quisiera tener 1 seg con 4MHz de preferencia

(Tiempo Reloj)= Periodo De Oscilador/Frecuencia Oscilador
Siendo El Tiempo De Muestreo = 1/Valor Del Oscilador
Usando Un Clock A 4Mhz Significa Que Cada Ciclos Son 0.25 Segundos

Eso Quiere Decir Que Si Queremos Obtener 0.25 Microsegundos
(T=1/f) = 1/4Mhz = 0,25Microsegundos Por Ciclo
Si Usamos Un Clock De 4Mhz
 
Estas Instrucciones Llevarian Segun El Datasheet
Instruction Set Summary
 
 ldi  r16,$04 ;Load Immediate (1 ciclo)                         
 out  sph,r16 ;Out Port           (1 ciclo)
 ldi  r16,$5F ;Load Immediate (1 ciclo)          
 out  spl,r16 ;Out Port              (1 ciclo)

1+1+1+1= 4 Ciclos x 0,25 Microsegundos = 1Microsegundo
Si Quieres Hacer Un Retardo De 1 Microsegundo

ldi r17,$01 ;Cargamos Retardo  : 0.25us = (1 ciclo)
dec r17     ;=  0.25us = (1 ciclo)                 
brne        ;= Cuando Salta = 0.50us = (2 ciclos)
            ;= Cuando No Salta =  0.25us = (1 ciclo)
Como r17 Ya Decremento No Salta Por Lo Que Tenemos = -> 0.75us = (3 Ciclos)
Y Como Buscamos 4 Ciclos Para Completar 1 Segundo
Le Añadimos Un Nop Quedando la Cosa Asi

delay:

nop           = (1 ciclo)
ldi r17,$01   = (1 ciclo)
dec r17       = (1 ciclo)
brne delay    = (1 ciclo)
Título: Re: Empezando con AVR
Publicado por: Cryn en 04 de Septiembre de 2009, 10:08:53
 :? :?

nop           = (1 ciclo)
ldi r17,$01   = (1 ciclo)
dec r17       = (1 ciclo)
brne delay    = (1 ciclo)

ahí no son solo 1us??

lo que necesito son 1'000.000 de us que es igual a 1seg

supongo que tendría que ir por ese lado, calcular cada ciclo, etc y colocar valores en ciclos, y para eso debería ayudarnos un soft. No hay uno parecido al PICDEL para los micros pic?

gracias por responder, saludos
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC en 04 de Septiembre de 2009, 10:46:56
aqui para 1 seg  4MHZ

; =============================
;    delay loop generator
;     4000000 cycles:
; -----------------------------
; delaying 3999996 cycles:
          ldi  R17, $24
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
; =============================
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 04 de Septiembre de 2009, 12:11:16
Código: [Seleccionar]
Vamos A ver No debo de Andar Mut Rate Cuando En El Mismo
Soft De MiCrOtRoNiC  Te Lo Pone

; =============================
;    delay loop generator
;     4000000 cycles:
; -----------------------------


; -----------------------------
; delaying 3 cycles:    ;= (3 Ciclos) = 0.75us
          ldi  R17, $01 ;Cargamos Retardo  : 0.25us = (1 ciclo)
WGLOOP3:  dec  R17      ;=  0.25us = (1 ciclo)
          brne WGLOOP3  ;= Cuando No Salta =  0.25us = (1 ciclo)
; -----------------------------
; delaying 1 cycle:     ;= (1 Ciclo) = 0.25us
          nop           ;=  0.25us = (1 ciclo)
; =============================

Código: [Seleccionar]
ahí no son solo 1us??

lo que necesito son 1'000.000 de us que es igual a 1seg
aqui para 1 seg  4MHZ

Te Lo Explico De Otra Manera

la Palabra Magnitud Significa Tamaño Dimension :

El Segundo Es La Unidad De La Magnitud Tiempo
1 Segundo Es Igual A 1 Unidad
Y Las Dimensiones Mas Pequeñas Que La Unidad ??
En Este Caso Utilizaremos SubMultiplos

En Electronica No Se Emplean Todos Los Multiples
Sino Que Se Recurre A Aquellos Que Van De 1000 En 1000
Es Decir:

Unidad = 1
MicroSegundo (us) = 0,000,001 us
NanoSegundo (ns) = 0,000,000,001 ns

El Microsegundo Es La Unidad De Tiempo Que Equivale A La Millonesima Parte De Un Segundo
1 Micro Segundo = 1 Millon / 1 Segundo

El Nanosegundo Es La Unidad De Tiempo Que equivale A La MIL Millonesima Parte De Un Segundo
1 Nano Segundo = 1000 Millon / 1 Segundo

Este Tiempo Tan corto No Se Usa En La Vida Diaria
Pero Es De Interes En La Electronica

Megahertz (MHz): = 1
El Mhz Es Una Unidad De Medida De Frecuencia
Es Una Medida Para Determinar El Numero De Repeticiones De Cualquier Accion Periodica En Una Unidad De Tiempo
1 Mhz Es Igual A 1.000.000 De Ciclos Por Segundo

Por Lo Que 1/4Mhz = 0,25 Que Es Lo Mismo Que
1/4000000 cycles = 0,000.000.25
0,000.000.25 * 4 Ciclos = 1 MicroSegundo Con Un Cristal De 4 Mhz
Y Como Quieres 1 Segundo Pues Lo Multiplicas Por 1 Million
; -----------------------------
; delaying 3999996 cycles:
          ldi  R17, $24
WGLOOP0:  ldi  R18, $BC
WGLOOP1:  ldi  R19, $C4
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
;-----------------------------

3999996 cycles + 4 Ciclos = 1.000.000 MicroSegundos





Título: Re: Empezando con AVR
Publicado por: Cryn en 04 de Septiembre de 2009, 13:11:14
ok, ahora si, 4'000'000 de ciclos, eso es porque la velocidad de cada ciclo es directamente 1/Fosc, verdad?

diferente de los Pic's que es 1/(4Fosc)

ok ahora si entendido.

muchas gracias microtonic y belgitaes por tus explicaciones

Ya lo tengo! mi primer programa acabado, parpadeo cada 1 seg, ahora solo espero por mis micros que pronto llegarán para probarlo físicamente.

Código: ASM
  1. ;--------------------------------------------------------------------------------
  2. ;       Programa:       Led on/off
  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 hace parpadear un led conectado al pin RB0 del puerto
  9. ;                       B durante aprox. 0.5seg.
  10. ;      
  11. ;       Registros:      r0  -> sirve para el parpadeo del led al aplicarle un eor
  12. ;                               r16 -> On/Off led
  13. ;
  14. ;       Conexiones:     B1 -> Led
  15. ;--------------------------------------------------------------------------------
  16. ;DIRECTIVAS EN ENSAMBLADOR
  17. .include "m8def.inc"        ;ATmega8
  18.  
  19. ;DEFINICION DE REGISTROS
  20. .def  led_cambio=r0         ;registro para parpadeo del led
  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.         ldi  r16,$02            ;r16 <- $02 -> Iluminar led conectado pin RB1
  35.         mov  led_cambio,r16     ;led_cambio <- r16 :variable para el parpadeo
  36.        
  37. loop:
  38.         out   portb,r16          ;actuamos sobre el led(conectado al pin RB0)
  39.         eor   r16,led_cambio     ;cambiamos estado on/off
  40.         rcall  delay_1s         ;retraso de 1seg
  41.         rjmp   loop             ;bucle infinito
  42.  
  43. ;*******************************
  44. ; =============================
  45. ;    delay loop generator
  46. ;     4000000 cycles:
  47. ; -----------------------------
  48. ; delaying 3999996 cycles:
  49. delay_1s:
  50.           ldi  R17, $24
  51. WGLOOP0:  ldi  R18, $BC
  52. WGLOOP1:  ldi  R19, $C4
  53. WGLOOP2:  dec  R19
  54.           brne WGLOOP2
  55.           dec  R18
  56.           brne WGLOOP1
  57.           dec  R17
  58.           brne WGLOOP0
  59. ; -----------------------------
  60. ; delaying 3 cycles:
  61.           ldi  R17, $01
  62. WGLOOP3:  dec  R17
  63.           brne WGLOOP3
  64. ; -----------------------------
  65. ; delaying 1 cycle:
  66.           nop
  67.                   ret
  68. ; =============================

aaah y los fuses que ahora mismo me fijo, directamente en el programa en asm hay alguna forma para incluirlos? estaré checando la hoja de datos del micro.

saludos.
Título: Re: Empezando con AVR
Publicado por: stk500 en 04 de Septiembre de 2009, 14:08:02
Cryn para configurar los Fuses, con el Cristal o Oscilador debe tener la hoja de Micro a mano, buscalo en eso que te mande  :mrgreen:
Saludo
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 04 de Septiembre de 2009, 18:30:32
El moderador me lo a cambiado la ruta de mi archivo.
Título: Re: Empezando con AVR
Publicado por: Cryn en 04 de Septiembre de 2009, 18:37:20
creo que estaba adjuntado, no?

quizá sea por liberar espacio, nose...

gracias por el aporte cristian_elect
Título: Re: Empezando con AVR
Publicado por: migsantiago en 04 de Septiembre de 2009, 23:10:43
Publiqué el link a la página del software porque no deben subir programas ajenos al servidor. Es mejor tener el link y descargarlo desde allá.
Título: Re: Empezando con AVR
Publicado por: Cryn en 15 de Septiembre de 2009, 12:43:13
Bueno, de vuelta al tema, después de haber leído muchas hojas de las hojas de datos :D

y vuelvo por los fuses, porque veo que son muy importantes y hay que tener cuidado (http://www.todopic.com.ar/foros/index.php?topic=24394.0), no???

Empiezo por el Oscilador, hay varios tipos de configuración, según la hoja de datos son:


Los que yo uso son el primero y el cuarto, el resto de momento no me interesa jaja, pero sus detalles como siempre están en la hoja de datos.

Para el cristal los fusibles reservados se llaman CKSEL3, CKSEL2, CKSEL1 y CKSEL0, son 4 bits, de ahora en adelante llamados como en la hoja de datos: CKSEL3:0

En la primera opción se usan los fusibles de 1111 - 1010 en CKSEL3:0, variando esas configuraciones se logran las distintas frecuencias, yo para empezar usaré un cristal de 4MHz, entonces haré lo que me dice la hoja de datos:

(http://img33.imageshack.us/img33/4773/opcion1.jpg)

y usaré CKSEL3:1=111 y CKOPT=1, este último es un fuse de optimización del clock, que se lo usa cuando se usará la salida del OSC para conectar a otro micro, para entregar mayor potencia, por tanto consume mayor energía cuando esta activado, se desactiva si no se usará la salida de OSC y de esta manera ahorrar energía. Hay un detalle que la hoja de datos recalca casi cada vez que se habla de los fuses y es que 1 significa NO PROGRAMADO y 0 significa PROGRAMADO

Nos quedó un bit por configurar que es el CKSEL0, que va de la mano con SUT, este último son 2 bits de fusibles que determinan un tiempo para dejar que la tensión y  el oscilador se estabilicen antes de ejecutar la primera instrucción, es como el PUT (Power Up Timer o Power On Timer) de los micros PIC de Microchip.

Este esta detallado en la siguiente tabla en la hoja de datos:

(http://img17.imageshack.us/img17/885/sute.jpg)

el cual usaré el máximo jeje por si las moscas:
entonces tengo elegido: CKSEL0=1 y SUT1:0=11

Y hasta ahí tenemos configurado el cristal corriendo a 4MHz sin optimización de la salida de OSC del micro (para ahorro) y con 16CK y 65ms de tiempo para esperar estabilización en el oscilador
Título: Re: Empezando con AVR
Publicado por: Cryn en 15 de Septiembre de 2009, 12:58:39
Ahora veremos la siguiente opción que usaré, que es la configuración del oscilador como RC interno, para ello otra vez recurrimos a la sabia hoja de datos que nos dice que debemos hacer:

(http://img29.imageshack.us/img29/4848/opcion2t.jpg)

y los bits de SUT igual:

(http://img33.imageshack.us/img33/1482/sutop2.jpg)

En este caso yo usaría 4 u 8 MHz, el SUT al máximo y CKOPT siempre deshabilitado cuando se usa el Oscilador interno, como dice la hoja de datos:

CKSEL3:0 = 0011(4MHz) ó 0100(8Mhz)
SUT1:0=10 (16CK y 65ms)
CKOPT=1


Esta es mi segunda opción en cuanto a configuración de oscilador.

Por favor si he cometido algún error por favor háganmelo saber para que maneje información correcta y no le pase nada a los AVR's.

Y me quedó una duda dentro las características del ATmega8 está que puede trabajar a 16MIPS a 16MHz, cual sería la configuración para usarlo a tope? está bien de esta manera??:

CKOPT=0 CKSEL3:1=111

o que significa la ultima opción de la tabla 8-3 que esta en mi anterior post? 1.0<= :?

saludos
Título: Re: Empezando con AVR
Publicado por: Cryn en 15 de Septiembre de 2009, 14:06:42
Cabe aclarar que este micro, el ATmega8 tiene 2 bytes de fuses, y un byte de protección, llamados:

Fuse Low Byte: CKSEL0:3, SUT0:1, BODEN, BODLEVEL
Fuse High Byte: BOOTRST, BOOTSZ0:1, EESAVE, CKOPT, SPIEN, WDTON, RSTDISBL
Lock Bit Byte:   LB1:2, BLB01, BLB02, BLB11, BLB12

de los cuales ya vimos los que están en negrilla, entonces para terminar con el Low byte nos falta ver al Brown out, que es similar al de los micros PIC de microchip:

BODEN: habilitar o deshabilitar la detección del Brown-out ("1"=desactivado; "0"=activado)
BODLEVEL: establece el umbral del Broun-out en 2.7V ó 4.0V ("1"=2.7V; "0"=4.0V)



Ahora nos toca detallar el Fuse High Byte:

(http://img38.imageshack.us/img38/9641/bootsz.jpg)


NOTA.- En este último bit creo que es donde se debe tener un cuidado especial, ya que la hoja de datos dice que si se activa el pin PC6 como I/O, solo se puede cambiar a que funcione como RESET en modo de programación paralela o al menos eso entendí.
Título: Re: Empezando con AVR
Publicado por: Cryn en 15 de Septiembre de 2009, 14:26:16
Ahora solo falta el detalle de los Lock Bits, que son de protección, que para empezar no necesito proteger nada, pero si se desea proteger a cierto nivel, se puede escoger cualquiera de las opciones:

(http://img410.imageshack.us/img410/9593/lockbits1.jpg)

(http://img27.imageshack.us/img27/5146/lockbits2.jpg)

Entonces lo que haré es deshabilitar todo, osea no proteger nada:

LB2:1=11 Sirven para la Memoria de Programa y para la EEPROM
BLB02:01=11; BLB12:11=11 Son para accesos al Bootloader

Con eso no más fuses que ver del micro con el que trabajaré, espero entonces sus comentarios, para ver si hay algún error por ahí o algo más que considerar?

saludos!
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC en 15 de Septiembre de 2009, 19:14:40
Ahora veremos la siguiente opción que usaré, que es la configuración del oscilador como RC interno, para ello otra vez recurrimos a la sabia hoja de datos que nos dice que debemos hacer:
En este caso yo usaría 4 u 8 MHz, el SUT al máximo y CKOPT siempre deshabilitado cuando se usa el Oscilador interno, como dice la hoja de datos:

CKSEL3:0 = 0011(4MHz) ó 0100(8Mhz)
SUT1:0=10 (16CK y 65ms)
CKOPT=1


Esta es mi segunda opción en cuanto a configuración de oscilador.

Por favor si he cometido algún error por favor háganmelo saber para que maneje información correcta y no le pase nada a los AVR's.

Y me quedó una duda dentro las características del ATmega8 está que puede trabajar a 16MIPS a 16MHz, cual sería la configuración para usarlo a tope? está bien de esta manera??:

CKOPT=0 CKSEL3:1=111

o que significa la ultima opción de la tabla 8-3 que esta en mi anterior post? 1.0<= :?

saludos

1.0<=
edit. tienes razon ma4826 :z)   

cryn eso quiere decir que si lo configuras asi es para frecuncias iguales o menores  mayores a 1mhz...

´para frecuencias mayores a 8mhz seria
cksel 1-3: 111
ckopt :0

saludos
Título: Re: Empezando con AVR
Publicado por: ma4826 en 15 de Septiembre de 2009, 19:25:29
Ahora veremos la siguiente opción que usaré, que es la configuración del oscilador como RC interno, para ello otra vez recurrimos a la sabia hoja de datos que nos dice que debemos hacer:
En este caso yo usaría 4 u 8 MHz, el SUT al máximo y CKOPT siempre deshabilitado cuando se usa el Oscilador interno, como dice la hoja de datos:

CKSEL3:0 = 0011(4MHz) ó 0100(8Mhz)
SUT1:0=10 (16CK y 65ms)
CKOPT=1


Esta es mi segunda opción en cuanto a configuración de oscilador.

Por favor si he cometido algún error por favor háganmelo saber para que maneje información correcta y no le pase nada a los AVR's.

Y me quedó una duda dentro las características del ATmega8 está que puede trabajar a 16MIPS a 16MHz, cual sería la configuración para usarlo a tope? está bien de esta manera??:

CKOPT=0 CKSEL3:1=111

o que significa la ultima opción de la tabla 8-3 que esta en mi anterior post? 1.0<= :?

saludos

1.0<=

cryn eso quiere decir que si lo configuras asi es para frecuncias iguales o menores a 1mhz...

saludos por lo demas esta bien

Es justamente lo contrario, con esa configuración funciona para cristales de frecuencia igual o mayor de 1MHz y es el único modo posible para frecuencias mayores de 8MHz.

Saludos,

Miguel Ángel.


Título: Re: Empezando con AVR
Publicado por: Cryn en 16 de Septiembre de 2009, 12:39:11
no sabía si era mayo o menor, que rareza eso, deberían hacerlo más entendible, creo que el signo debe ir siempre antes del numero...

en fin, supongo que es la opción que dice ma4826, ya que si no no hubiera posibilidad de usar frecuencias mayores a 8MHz, para llegar al tope de 16MHz que dice en sus características

gracias por las respuestas muchachos, ahora a la espera de los micros para que pueda probarlo físicamente

saludos.
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 19 de Septiembre de 2009, 03:33:37
El Atmega Tiene Un Oscilator Rc Interno Que Por Defecto Viene Programado Como A 1Mhz
Y Es Lo Primero Que Hay Que Mirar Y Es Muy Importante Estar Seguro De Lo Que Se Pone
No Sea Que Se Programé Para Funcionnar Con Uno Externo Y No Haya Ningun Cristal Puesto
Y Esto Suele Ser La Mayoria De Veces La Causa De que Los Micros Se Mueren Al Programarlos
Por Suerte Con Un Reloj Externo Se Pueden Resucitar

El Atmega Tiene Un Oscilator Rc Interno Y Sino Configuras Los Fuses Para Usar El Oscilator Externo
Terminas Usando El Oscilator Interno Por Defecto

El Atmega  Tiene Una Frecuencia De Funcionamiento De 8 Mhz Maxima Sin Cristal
Para Utilizar Una Frecuencia Mayor se Necesita Emplear Un Cristal Externo

Asi Que Esos Fuses Son Los Que Hay que Mirar Cuando Uno Programa El Micro

En El Datasheet Tienes:
External Crystal: CKSEL3..0  1111
Pero Cuidado Note:
Fuse and Lock bits that are programmed will be read as zero
Fuse and Lock bits that are unprogrammed will be read as one
Interpretando :
“1” means unprogrammed
“0” means programmed
Lo Mejor Antes De Manipularlos Es Darle La Opcion Read
Para Ver La Configuracion Actual
Es Decir Si Utilizas Ponyprog Y Lee La Configuracion De Los Bits
Normalmente Tendras

CLSEL3: “v” Señalado   = 0 PROGRAMADO
CLSEL2: “v” Señalado   = 0 PROGRAMADO
CLSEL1: “v” Señalado   = 0 PROGRAMADO
CLSEL0: “ ” NOSeñalado = 1 NO PROGRAMADO

Lo Que Corresponde Al Modo 1Mhz Interno

Tienes Una Pagina Web Que Hace De Funcion de Calculadora
Para Los Fuses

http://www.engbedded.com/fusecalc/
Ahi Podras Ver Todas Las Opciones de Configuracion Possible

AVR part name:  – please select –
Título: Re: Empezando con AVR
Publicado por: Cryn en 19 de Septiembre de 2009, 11:25:33
Muy buenos datos Belgitaes, gracias! tendré cuidado en no matar a los micros, para no luchar por recusitarlos.

Si, eso del unprogrammed y programmed ya se me grabó, todo el tiempo lo repiten en la hoja de datos jaja

Vi la pagina, también me la dejó de link MiCrOtRoNiC (http://www.todopic.com.ar/foros/index.php?topic=27420.msg225693#msg225693), muy buena página;  pero tuve que estudiarlas a detalle y ver que significan dentro la hoja de datos, y las comprendo casi todas, gracias por los aportes amig@s! :mrgreen:

La duda que ahora me queda es que, si se peude incluir dentro del código en ASM los fuses, como en los pics con el comando __CONFIG ...    hay algo similar para AVR's, o solo se los programa cuando se está grabando el programa al micro?

muchas gracias por los comentarios, saludos
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 19 de Septiembre de 2009, 13:23:55
Código: [Seleccionar]
La duda que ahora me queda es que,
si se peude incluir dentro del código en ASM los fuses,
como en los pics con el comando __CONFIG ...    
hay algo similar para AVR's,
o solo se los programa cuando se está grabando el programa al micro?

muchas gracias por los comentarios, saludos


De Pic No Entiendo Nada
Bueno Te Cuento El Vicio Mio Es Desemsamblar Algunos Codigos
Para ver Como Estan Hechos
De Esta Manera Es Como Aprendi Un Poco A Manejar el Avr
Mirando Como Lo Hacian Los Demas
Es Otra Forma De Aprender
Consegui Desemsamblar Un Codigo Protegido Por Los Locks bits
De Un Firmware Hecho Con Un Atmega88
Asi Que Te Pondre El Code Donde Efectivamente Habia Algo De Eso
Para Que Veas Que Si Se Puede Hacer

En Principio Vamos A Ver El Significado De Cada Uno :

Código: [Seleccionar]

( LOCK BITS)

Seguridad De la Memoria : Tipo De Protecion
************************
..............
LB2  .  LB1  .
..............
 1   .   1   . Sin Habilitar La Protecion De La Memoria
..............
 1   .   0   . Deshabilita Futuras Programacion De La Flash Y EEprom En Los Modos Paralelo Y Serial
.............. Los Bits De Los Fusibles De Programacion Estan Asegurados En Ambos Modos
     .       .
 0   .   0   . Igual Al Anterior Y Tambien Se Deshabilita La Verificacion
..............


Seguridad De la Aplicacion : Tipo De Protecion
***************************
..................
BLB02  .  BLB01  .
..................
  1    .    1    . Sin Restriciones En Las Instruciones SPM o LPM Para El Acceso
.................. A La Seccion De La Aplicacion
       .         .
  1    .    0    . SPM No Esta Permitido Para Escribir En La Seccion De La Aplicacion      
..................
  0    .    0    . Igual A Lo Anterior Y Posterior Pero Juntos
..................
  0    .    1    . LPM Ejecutada En El BootLoader No Esta Permitida Para Leer
                 . Desde La Seccion De La Aplicacion    
                 . Si Un Vector De Interupcion Es Puesto En La Seccion Del BootLoader
                 . La Interupcion Esta Deshabilitada Mientra Se Ejecuta Desde La Seccion De La Aplicacion
..................  

Seguridad De la Seccion Del Bootloader  : Tipo De Protecion
***************************************
..................
BLB12  .  BLB11  .
..................
  1    .    1    . Sin Restriciones En Las Instruciones SPM o LPM Para El Acceso A La Seccion Del BootLoader
..................
       .         .
  1    .    0    . SPM No Esta Permitido Para Escribir En La Seccion Del BootLoader      
..................
  0    .    0    . Igual A Lo Anterior Y Posterior Pero Juntos
..................
  0    .    1    . LPM Ejecutada En La Aplicacion No Esta Permitida Para Leer
                 . Desde La Seccion Del BootLoader    
                 . Si Un Vector De Interupcion Es Puesto En La Seccion De La Aplicacion
                 . La Interupcion Esta Deshabilitada Mientra Se Ejecuta Desde La Seccion Del BootLoader

Código: [Seleccionar]
La Memoria Del Programa Se Divide En 2 Secciones
  ............ = 0x0000
  .          .
  .          .
  .          .  
  .          .
  .          .  Organizacion De La Memoria
  .          .  
  .          .  La Parte Alta Contiene El Codigo Del BootLoader
  .          .
  .          .
  .          .
  .        .
  .      .   .
  .    .   . .
  .  .   .   .
  ..   .     .
     .       .la Parte Baja Contiene El Codigo De La Aplicacion
  ..         .    
  .          .
  .          .
  ............
  .          .
  .          . Flash Para La Seccion Del Boot
  ............ = 0x 0FFF/0x1FFF

  La Parte Baja Contiene El Codigo De La Aplicacion Y Esta Protegida Por Los Bits BLB02  BLB01
  La Parte Alta Contiene El Codigo Del BootLoader Y Esta Protegida Por Los Bits BLB12  BLB11

.........................................................................


Desde El Bootloader Se Puede Escribir De Muchas Maneras
Normalmente Cuando Se Necesita Poner Un Nuevo Software En Un Micro
El LLamado Programador Se Connecta Por Ejemplo A Traves Del Puerto RS232
Lee El Nuevo Software Desde El PC Y Lo Pone En La Parte Principal
Llamada Seccion De Aplicacion De La Flash
 
Por Lo Que Al Software Se Le Puede Dar Al Mismo Actualizaciones Individuales
Sin El Riesgo De Ingenieria Inversa O Firmware Hackeado

La Organizacion De La Memoria Flash Esta dividida En Dos Secciones
Una Aplica La Seccion De Aplicacion y La Otra La Seccion De Carga De Boot(Autoarranque)
La Seccion De Aplicacion Contiene El Codigo Principal Para Su Uso
Mientras La Seccion De Autoarranque (BootLoader o Carga De Boot) Contiene El Codigo Para La Autoprogramacion Real

Vamos A Ver Como Lo Hicieron A Traves El Mismo Firmware ( Codigo Asm)

Si Nos Fijamos Bien En La Tabla Que Segun El Datasheet Del Atmega88

..................

Esto Seria Parte Del Desemblado Del Firmware

Código: [Seleccionar]

;.....................................................................................
;Configura El Boot Loader Lock Bits Con SPM
;Bits:                                                
;|--7--|--6---|--5---|--4---|--3---|--2--|--1--|--0--|
;|-----|------|------|------|------|-----|-----|-----|
;|  1  |  1   |BLB12 |BLB11 |BLB02 |BLB01| LB2 | LB1 |
;|-----|------|------|------|------|-----|-----|-----|
;   0     0      0     0       1      0     0     0  | =LDI     R17,0x08
;               SI    SI      NO     SI    SI    SI
;...........................................................................................

 LDI     R17,0x08         ;Configura El Boot Loader Lock Bits Con SPM En R17
 OUT     SPMCSR,R17       ;Copia Los Datos En SPMCSR
 SPM                      ;Ejecuta SPM
 RCALL   SPM              ;Espera SPM Y Vuelve Aqui

Esto Seria Otra Parte Del Firmware

;Configura El Boot Loader Lock Bits Con SPM
;Bits:                                                
;|--7--|--6---|--5---|--4---|--3---|--2--|--1--|--0--|
;|-----|------|------|------|------|-----|-----|-----|
;|  1  |  1   |BLB12 |BLB11 |BLB02 |BLB01| LB2 | LB1 |
;|-----|------|------|------|------|-----|-----|-----|
;   0     0      0     0       1      0     0     1  | =LDI     R17,0x09
;               SI    SI      NO     SI    SI    NO

Esto Seria Otra Parte Del Firmware

 LDI     R17,0x09         ;Configura El Boot Loader Lock Bits Con SPM En R17
 OUT     SPMCSR,R17       ;Copia Los Datos En SPMCSR
 SPM                      ;Ejecuta SPM
 RCALL   SPM              ;Espera SPM Y Vuelve Aqui
;.................................................................................

 SPM:      ;Espera SPM
 
 IN      R17,SPMCSR       ;
 SBRC    R17,0            ;Salta A La Siguiente Instrucion Si r17 = 0
 RJMP    PC-0x0002        ;Salta SPMCSR Si r17 Es Positivo
 RET                      ;
;....................................................................................


Es Decir Como El Firmware Necesita Rellenar La Parte Superior Del Micro
Que Es La Que No Se Ve Ya Que Esta Es La Que Esta Protegida Una Parte De Ella A Traves El Mismo Firmware
Y La Otra A Traves El AvrDude o El Win Pic

Una Aplica La Seccion De Aplicacion y La Otra La Seccion De Carga De Boot(Autoarranque)
La Seccion De Aplicacion Contiene El Codigo Principal Para Su Uso La Que No Se Vé
Mientras La Seccion De Autoarranque (BootLoader o Carga De Boot) Contiene El Codigo Para La Autoprogramacion Real
De La Parte Oculta
La Instruccion SPM Solo Puede Ser Ejecutada Desde La Seccion De BootLoader(Autoarranque)

La Totalidad De La Flash Memory Tanto En Seccion De Aplicacion Como Seccion De Carga De Boot
Esta Dividida en Paginas Que Contienen 32, 64, o 128 Words Cada Una

Segun El Datasheet Del Atmega88 :
La Limitacion Para No Read-While-Write section (NRWW)Pagina 282 Datasheet Table 26-7.
ATmega88 NO Read-While-Write section (NRWW) = 32 Paginas 0xC00 - 0xFFF

Es Decir Hara Boot Reset Address (Start (Carga De Boot)BootLoader Section) En La Direcion 0xC00
La Instrucion LPM Sirve Entonce Para Leer Unos Valores
Ya Colocadas En La Memoria Flash En El Momento De La Carga

La Direcion De La Pagina Sera Tomada En La Parte Alta Del Registro Z
Las Instruciones Son Todas De 16 Bits O 32 Bits
Y Ocupan 1 o 2 Direciones En La Memoria Flash (1 o 2 x 16 Bits = 2 o 4 Bytes)
+00000000:   FFFF   = 16 Bits ( 2 Bytes)

POR ESO!!!
Configura Despues Con El WinPic o AvrDude Los Bits BLB12  BLB11 =“v” means = 0 PROGRAMADOS
Para No Permitir Escribir Ni Leer El Contenido Una Vez Programado El Chip

Código: [Seleccionar]

Seguridad De la Seccion Del Bootloader  : Tipo De Protecion
***************************************
..................
BLB12  .  BLB11  .
..................
  1    .    1    . Sin Restriciones En Las Instruciones SPM o LPM Para El Acceso A La Seccion Del BootLoader
..................
       .         .
  1    .    0    . SPM No Esta Permitido Para Escribir En La Seccion Del BootLoader      
..................
  0    .    0    . PROGRAMADOS  PERO ESTA VEZ A 00 A Traves El Software Win Pic
                 . El Cual Lo Interpreta De Esta Manera =“v” means = 0
                 . (Igual A Lo Anterior Y Posterior Pero Juntos)  
..................
  0    .    1    . LPM Ejecutada En La Aplicacion No Esta Permitida Para Leer
                 . Desde La Seccion Del BootLoader    
                 . Si Un Vector De Interupcion Es Puesto En La Seccion De La Aplicacion
                 . La Interupcion Esta Deshabilitada Mientra Se Ejecuta Desde La Seccion Del BootLoader
..................  


Una Vez Hecho Eso
La Funcion Del Software Es La Que Le Corresponde Mandar Aquellas 32 Paginas En Formato De Comandos
2 Bytes * 32 Paginas = 64 Bytes Por Cada Comando
Para Actualizar En Conjunto Con El BootLoader Section
Hasta Rellenar La Totalidad De La Seccion De Aplicacion ( Parte Oculta )
La Cual No Podremos Ver Despues Una Vez Rellenado El Micro En Su Totalidad
Debido A La Protecion Puesta Por Los Bits De Seguridad

Por Lo Que Al Software Se Le Puede Dar Al Mismo Actualizaciones Individuales
Sin El Riesgo De Ingenieria Inversa O Firmware Hackeado

Cuando El Bit BOOTRST Esta Programado El Dispositivo Saltara A La Direccion « Boot Loader » Automaticamente
BootLoader Flash Seccion =  0C00 - 0FFF
La Configuracion Mas Tipica De Programacion Y Interupciones Para La Transmision De Direciones En El Atmega88 Son :
Org 0x0C00

Pon BOOTRST a 1. Eso Deshabilita El Bootloader Y Todo Arrancara Como Quieres

En Fin Toda Teoria Sin Practica No Vale Nada
Yo Solamente Aplico La Teoria
Creo Que No Me Equivoque En Nada

edito para Corregir Algo
Hasta Rellenar La Totalidad De La Seccion De Aplicacion
Borrado
Parte Oculta
Para Actualizar En Conjunto Con El BootLoader Section
Hasta Rellenar La Parte Alta Del Codigo Del BootLoader
Parte Del Codigo QUE NO SE VÉ
La Seccion De Aplicacion Contiene El Codigo Principal Para Su Uso
La Que Se Vé
Título: Re: Empezando con AVR
Publicado por: Cryn en 26 de Septiembre de 2009, 01:27:29
Hola Belgitaes, primeramente quiero pedirte disculpas por no responder rápido, es que me he entretenido con otras cosas, de los pic's esencialmente..

muchas gracias por tu respuesta, si que hay bastante información de la que no mucho entendí.

Tienes una forma interesante de aprender, lo que yo hago es leer las hojas de datos, ver otros códigos (ya sea en asm o en c) y tratar de entenderlos, merodear por los foros y generalmente preguntar ahí cuando no entiendo algunas cosas :mrgreen:.

Creo que todavía estoy algo newbee en los AVR's y por eso que no logre comprender todo lo que dijiste.

Seguiré buscando algo de info para ver si se puede colocar algún comando dentro del mismo código .asm para configurar algunos o los que se pueda de los fuses, quizá no se pueda, pero en fin, sigo en la busqueda...

Saludos.
Título: Re: Empezando con AVR
Publicado por: stk500 en 26 de Septiembre de 2009, 03:14:52
Pues Cryn si lo encuentra pon un mensaje por aqui, ya que yo hace muchos tiempos pensaba lo mismo que tu, pero deberia darte cuenta que la mayoria de programadores que yo usos los Fuses se programan por Software , todavia no he visto nada en Asm o Basic que se pueda hacer, uso muchos el Bascom AVR ,Studio4 AVR y WinAVR y la verdad son los mas ventajoso y hay muchas informaciones en internet.
por eso te dije que para quemar un Atmel siempre debe tener el Datasheef del micro.
Saludos
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 26 de Septiembre de 2009, 13:37:31
El C de Winavr no se pero no funciona bien.
Hago sub. funciones y no lo ejecuta lo salta eso solo me sucede en winavr en otros compiladores no.
Para que lo tome en cuenta tengo que declarar las variables como volatile. Ese tipo de declaraciones solo lo hacia para funciones dentro de interrupciones.
en -0s se pierde la funcion delay.

#include <avr/io.h>   


void delay( unsigned int a)
{
  while(a--){
  ;
   }
}

int main(void){
char a=0;
 DDRB=255;
 PORTB=0x00;
 delay(50);
 while(1){
   PORTB=a;
   ++a;
   delay(10000);
   if(a>254)
     a=0;
  }
  return 0;
}

Es unico compilador que me sucede esto optimizado en size.
Título: Re: Empezando con AVR
Publicado por: Cryn en 26 de Septiembre de 2009, 14:04:45
Del winavr todavía nose mucho, pero si conozco un poco del lenguaje C, pues he programado en lenguaje C de CCS para microcontroladores de microchip, y en algunas materias de la U llevé C++

y me parece muy extraña tu condicional

  while(a--){
  ;
   }

acaso el while testea valores bytes? hasta donde yo se, pregunta por bits. Probablemente si el byte por el que preguntas en el while no es cero, la condicional toma el valor de 1, manteniéndose el ciclo while activo y en ese caso tendría que funcionar tu condición. Pero si no creo que va por ahí el problema

Seguramete tendrás que colocar:

while(a!=0){
a--;
}

me parece que esta forma es más correcta.

bueno espero sirva, saludos
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 26 de Septiembre de 2009, 14:13:20
La condicion si lo hace.
Pero si lo pones de otra forma la mas legible igual el compilador no lo toma la funcion delay().
sin optimizacion si funciona normal.
Título: Re: Empezando con AVR
Publicado por: stk500 en 26 de Septiembre de 2009, 14:38:44
pues como decia programar  los Fuses a mano nunca lo he vistos, porque para eso ya lo hace el programador, digo yo!!
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 27 de Septiembre de 2009, 02:59:40
Código: [Seleccionar]

Seguiré buscando algo de info para ver si se puede colocar
algún comando dentro del mismo código .asm


Cuando Preguntabas Algun Comando En El Codigo Asm
Lo Entendi De Esta Manera Me Explico:
Se Supone Que El Codigo Que Vayas A Escribir En Asm Quieres Protegerlos de Forma De Que Nadie
A La Hora De Leer El Micro Pueda Ver Lo Que Hay Dentro Una Vez Actualizado El Micro En Su Totalidad
Pues Me Referia A Los Bits De Bloqueo De Programacion Y De Datos
Es Decir En Proteger El Codigo Asm

Bloqueo De Programacion Y De Los Datos:
Segun El DATASHEET Atmega88 
Program Flash memory space is divided in two sections, the Boot Program section and the
Application Program section. Both sections have dedicated Lock bits for write and read/write
protection. The SPM instruction that writes into the Application Flash memory section must
reside in the Boot Program section.
Código: [Seleccionar]
La Memoria Del Programa Se Divide En 2 Secciones
  ............ = 0x0000
  .          .
  .          .
  .          . 
  .          .
  .          .  Organizacion De La Memoria
  .          . 
  .          .  La Parte Alta Contiene El Codigo Del BootLoader(Boot Program section)
  .          .
  .          .
  .          .
  .        .
  .      .   .
  .    .   . .
  .  .   .   .
  ..   .     .
     .       .  La Parte Baja Contiene El Codigo De La Aplicacion (Application Program section)
  ..         .     
  .          .
  .          .
  ............

Entre Ambas Secciones Se Han Dedicado Unos Bits De Bloqueo Para La Escritura Y Para La Lectura / Escritura

Los Atmegas Poseen 6 Bits De Seguridad Para Proteger A La Memoria Independientemente De Los Bits De Fusibles
 
Que Estos Si Se Gravan A Traves Un Software
Bits De Programacion:
Bit Low
-CKDIV-CKOUT-SUT1-SUT0-CKSEL3-CKSEL2-CKSEL1-CKSEL0

Bit High:
RSTDISBL- -DWEN-SPIEN-WDTON-EESAVE-BODLEVEL2-BODLEVEL1-BODLEVEL0

Extended Bits :
BOOTSZ1-BOOTSZ0-BOOTRST


..................
BLB12  .  BLB11  .
..................6 Bits De Seguridad Para Proteger A La Memoria
BLB02  .  BLB01  .
..................
LB2  .  LB1  .
..............

Vienen Desde La Fabrica Sin Programar Todos En (1) Logico
Tambien Se Quedan Sin Programar Cuando Se Envia El Commando De Borrar
Lock Bit Byte(1)

..................
BLB12  .  BLB11  . Sin Restriciones En Las Instruciones SPM o LPM Para El Acceso A La Seccion Del BootLoader
..................
BLB02  .  BLB01  . Sin Restriciones En Las Instruciones SPM o LPM Para El Acceso A La Seccion De La Aplicacion
..................
LB2  .  LB1  ..    Sin Habilitar La Protecion De La Memoria
..............

La Parte Baja De La Memoria Contiene El Codigo De La Aplicacion Esta Protegida Por Los Bits BL0
La Parte Alta De La Memoria Contiene El Codigo Del BootLoader Esta Protegida Por Los Bits BL1


Es Decir Suponemos Que Quiero Hacer Un Codigo Que Actualize Despues Y Que Tu No Pueda Leer
Entonce Lo Primero Que Hago Es Gravar Mi Codigo En La Parte Baja De la Memoria

Ahora Una Vez Gravado El Codigo
Y Como Lo Voy A Gravar En La Parte Baja De La Memoria
La Instrucion SPM Es La Que Escribe En La Seccion De Aplicacion Es Decir En La Seccion Del Programa De Arranque
;Boot Reset Address (Start BootLoader Section) 0xC00
;No Read-While-Write section = (NRWW)
;Significa Que No Se Podra Leer Si Se Escribe En Esta Seccion ;Direciones Desde  0xC00 - 0xFFF
;Como Esta Zona Esta Protegida Por Los Bits BL0 Habra Que Acudir
;A Las Direciones De La Memoria Desde  0x000 - 0xBFF Para Poder Leer El Firmware Una Vez Actualizado

RJMP ; 0C00 ;RESET ;Principio De La Alimentacion
; Aqui Comienza El Programa
Una Vez Gravado El Code
Programo Mis Bits De Programacion Que Estos Si Se Gravan A Traves Un Software
Bits De Programacion:
Cuando El Bit BOOTRST Esta Programado El Dispositivo Saltara A La Direccion BootLoader Flash Seccion =  0C00 - 0FFF
Y Cpmo Mi Code Empieza En Esta Parte Pues Lo Configuro Asi Mas Las Demas Configuraciones Segun El Metodo Empleado






Título: Re: Empezando con AVR
Publicado por: Cryn en 27 de Septiembre de 2009, 14:41:54
Hola Belgitaes, nuevamente gracias por pasarte a explicarme tantas cosas

Te explico un poco:
los micros pic de microchip, también tienen fuses, se les llama así o palabra de configuración (CONFIG WORD) en esta se establecen similares formas de trabajo como en los AVR, estás son el cristal, el power on, el watch dog, proteccion de flash contra lecturas, protección de eeprom contra lecturas, etc, etc.

cuando se programa en ASM o C, se puede configurar estos fuses mediante líneas de código en el .asm o .c, por ejemplo en ASM se hace así:

__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _WRT_ENABLE_OFF & _LVP_OFF & _BODEN_ON
ó se puede colocar el equivalente en hexadecimal: __CONFIG 0x3f71

en C de CCS se hace:
#fuses XT,NOWDT,PUT,NOPROTECT,NOLVP,BROWNOUT

y al compilar el programa esto está guardado dentro del .hex, y al momento de grabar no hace falta más nada que cargar el .hex al soft y grabarlo al micro, y funciona como debería, a la frecuencia programada, con o sin WDT, etc, etc.

Mi pregunta iba apuntando a ello, si es que habían líneas de programación en el .asm o .c que hagan que los fuses se queden dentro del .hex para los AVR. Me parece que no es posible por tus comentarios
Los Atmegas Poseen 6 Bits De Seguridad Para Proteger A La Memoria Independientemente De Los Bits De Fusibles
 
Que Estos Si Se Gravan A Traves Un Software

La Parte Alta De La Memoria Contiene El Codigo Del BootLoader Esta Protegida Por Los Bits BL1

No quiero proteger ningún código todavía, y entendiendo que los Lock bits, sirven para ello. Lo que busco es "meter" dentro del .hex la configuración de los fuses. Para cargar el .hex en el soft de grabación y grabarlo en el micro directamente, sin tener que preocuparse por todavía tener que configurar los fuses en el soft para recién grabarlos.

saludos.
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 29 de Septiembre de 2009, 03:31:19
Código: [Seleccionar]

cuando se programa en ASM o C,
se puede configurar estos fuses mediante líneas de código en el .asm o .c,
por ejemplo en ASM se hace así:

__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _WRT_ENABLE_OFF & _LVP_OFF & _BODEN_ON
ó se puede colocar el equivalente en hexadecimal: __CONFIG 0x3f71

similares formas de trabajo como en los AVR,
estás son el cristal, el power on, el watch dog,
proteccion de flash contra lecturas,
protección de eeprom contra lecturas, etc, etc.

Bit de configuración (Fuse Bits)
Los Fuse Bit Son Un Sistema De Configuracion De Muy Bajo Nivel
Activando O Borrando Estos Bits Puedes Cambiar Completamente Las
Funciones Del AVR

El Atmega Da Varias Opciones De Generar Un Ritmo Para El Micro Sin Tener Que Acudir A Los (Fuse Bits)

El Oscilador Externo Es Usado De Forma Estandar
El ATMega Viene Configurado Con Un Oscilador Interno De 1MHz
Lo Podemos Presionar A Ser Mas Rapido Configurando Para Que Corra
Con Un Cristal Externo   
Connectando Un Cristal De Cuarzo A Los Pines TOSC El Codigo Se Ejecutara A La Frecuencia Deseada
A Traves De La Uart
Por Ejemplo Si Necesitas Lograr 9600Bps En Comunicacion Serial
 
;Reloj Externo = XCK = Reloj De Transferencia
;La Entrada Del Reloj Externo Pin XCK Es La Muestra De Un Registro De Sincronizacion
Esto Seria Un Ejemplo En El Atmega88
 
Código: [Seleccionar]

;---------------------------------------------------------
; Configuro La Uart Para 9600 Bauds Con Un Cristal De 4 Mhz
;----------------------------------------------------------
                   ;\  Para fijar la velocidad tienes que pasar un valor a UBRR
                   ; | Inicialisation Uart 9600 BDS Quartz
   ; | 9600*16 = 153.600
   ; | 4.000.000 / 153600)= 26,04 Decimal -1 = 25.04 Decimal
                   ; | 25 Decimal = 19 Hexadecimal
   ; | UBRR = (frecuencia cristal/(16 * baudrate)) - 1 
LDI     R16,0x19   ; | UBRR = 25 Decimal= 19 Hexadecimal
STS     UBRR0L,R16 ; /
;..........................................................
;UCSR0B: USART Control and Status Register B

;RXEN: Este Bit Debe De Estar A 1 Para validar El Funcionamiento De La UART En Modo Recepcion
; En Este Caso El Pin Del Puerto PD0 Es Compartido Con La Entrada De Datos

;|-------|-------|------|-----|-----|------|-----|-----|
;|RXCIE0 |TXCIE0 |UDRIE0|RXEN0|TXEN0|UCSZ02|RXB80|RXB80|
;|-------|-------|------|-----|-----|------|-----|-----|
;   0       0       0     1      1     0      0     0     LDI  R16,0x18



 LDI     R16,0x18         ; Transmision Activada Bit3 TXEN0 Y/Recepcion Activada Bit 4 RXEN0 En UCSR0B 
 STS     UCSR0B,R16       ; UCSR0B 
;.............................................................................   

Con El Watchdog Pasa Lo Mismo Se Puede Configurar A Traves El Code Asm Sin Tener Que Acudir A Los (Fuse Bits)
Con La EEprom Pasa Lo Mismo
Los Bits De Configuracion De Los Pics Los Programa Directamente En Tu Codigo Sin Problemas
Los AVR Son Muy Diferentes Si Programa Mal Tus Bits De Configuracion Puedes Estropearlo

Saludo Y Suerte 





               
Título: Re: Empezando con AVR
Publicado por: stk500 en 29 de Septiembre de 2009, 05:56:01
Perdona Belgitas pero eso no tiene nada que ver con los Fuses, hasta ahora cuando programa un atmel en bascom debo configurar los Fuses en el programador, y como dije ante no conozco ningun Compilador de Atmel que compiler FUSES, sino en el Programador que uses, es todos los contrarios a los Pic.
Saludos

Edito
Aqui os dejos todos referente a programacion y 'Tutorial de Atmel tantos para Linus
http://electrons.psychogenic.com/modules/arms/sec/1/AVR/
Título: Re: Empezando con AVR
Publicado por: AKENAFAB en 29 de Septiembre de 2009, 09:34:31
pues como decia programar  los Fuses a mano nunca lo he vistos, porque para eso ya lo hace el programador, digo yo!!


Pues he visto lo mismo , los fuses al final ,justo al momento de programar.

Título: Re: Empezando con AVR
Publicado por: Cryn en 29 de Septiembre de 2009, 10:40:11
Cada vez que leo un mensaje de Belgitaes me confundo más aún :(, disculpa tu Belgitaes

gracias por el link stk500, los veré :-/

Entiendo AKENA, entonces mi búsqueda será en vano, porque no encontraré tal cosa, no?

En si lo veo con ventajas y desventajas este hecho, la desventaja sería que si no sabes los fuses de un programa X, no podrás probarlo nunca o si lo hiciste tu y aquella vez de la programación si los sabías, y te olvidaste apuntarlos, ya la cagaste :D. No solo basta con que te "roben" el .hex un usuario mal intencionado, si no sabe los fuses, le tomará bastante tiempo descifrarlos, por lo que leí en los comentarios de Belgitaes, se puede proteger contra lectura a los fuses, no?

Tiene sus cosas buenas y malas....

Saludos y muchas gracias por las respuestas. Ya tengo 5 ejemplos de mi inicio, todos funcionando casi muy bien, solo quería confirmar los fuses para colocarlo, lo iré preparando entonces, y sis e peude estos días también colocaré fotos.
Título: Re: Empezando con AVR
Publicado por: AKENAFAB en 29 de Septiembre de 2009, 10:50:43
xD

Si es una c@gada xD , porque si programas tu avr con X fuses , luego pasa el tiempo , lo desarmas , quieres volver a programarlo , pero digamo ahora con otro clock u otros settings , te jodiste , porque no responde mas que con lo que marcaste al inicio , esto solo con el ISP , que es el más comun.

El que salva de todo desastre es un programador HV paralelo.

Porque si puede reprogramar todos los FUSES , cosas que ISP , en determinados fuses una vez hecho el desastre no hay marcha atras xD .

Esto te lo cuento porque puedes desactivar el ISP , osea que xD hahha watch out xD

Título: Re: Empezando con AVR
Publicado por: Cryn en 29 de Septiembre de 2009, 13:06:34
si ya veo...

a ver pues como se da

saludos
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 30 de Septiembre de 2009, 04:42:37
Me Parece Que No Me Han entendido

Un Cargador De Arranque ( Bootloader ) Es Una Parte De Sotfware Que Se Carga En La Aplicacion De La Memoria
El Gestor De Arranque En Si Se Coloca En Los Controladores De La Memoria

El Programa Cargador ( .Hex) Cargara El Programa De Datos
A Partir De Este Momento Es El Cargador El Encargado De Cargar El Programa De Aplicacion En La Memoria
Cargar - Arrancar - Iniciar

Esto se puede hacer de 2 formas distintas:

•usando AVRdude + un programador hardware
•usando AVRdude + un cargador de arranque (bootloader) previamente grabado en flash.

Esta es una pequeña utilidad de carga de programas que se hace con el control del micro después de dar un reset.
Si durante los primeros 4 segundos el host le envía un fichero de software (*.hex) a través del puerto serie
lo graba en la flash, de lo contrario, si no recibe nada del host,
transfiere el control al programa que esta actualmente grabado en flash.
 
La segunda opción es, con diferencia, la más cómoda durante la fase de desarrollo
pero exige tener grabar el cargador en memoria.
Para grabarlo es necesario un programador hardware.
el Parallel Programmer, que básicamente es un cable paralelo.

¿Qué es un fusible?
http://www.ladyada.net/learn/avr/fuses.html
Si Lo Traduce Con Google Lo Puedes Entender mejor
Título: Re: Empezando con AVR
Publicado por: stk500 en 30 de Septiembre de 2009, 06:23:32
Perdoname Belgitaes pero tampoco te sigo comprendiendo, que tiene que ver un Bootloader con los Fuses!!! el temas que puso el amigo Cryn es si se podia compilar los Fuses, como los pic, cosas que con el Atmel es imposible, ya se comento muchos de esos, conclusion los Fuses de lo Atmel se configuran cuando se programa el micro, soy novato de verdad en Atmel, pero he leido muchos Tutorial de Atmel y nunca lei de programar los Fuse como tu lo explica, pero si tu esta convencido que se puede , te ruego que me ponga un Ejemplo en Assembler o GGC que se pueda quemar en el micro y funciones.  repito soy un Novato en los Micros y estoy aqui para aprender con ustedes.
 :mrgreen:
Saludos
Título: Re: Empezando con AVR
Publicado por: MLO__ en 30 de Septiembre de 2009, 12:03:19
Hola.

Revisando los archivos de salida resultado de la compilación, no encuentro por ningún lado el .cof. Como se habilita la generación de este archivo? En la ayuda hay algo sobre los tipos de archivos soportados pero no indica que se deba hacer para que lo genere.

Saludos
Título: Re: Empezando con AVR
Publicado por: AKENAFAB en 30 de Septiembre de 2009, 12:48:34

Yo nunca simule paso a paso con proteus .

La simulacion fue completa usando solo HEX.

Estos son los archivos que puede generar :

(http://img169.imageshack.us/img169/4367/makefile.jpg)
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 30 de Septiembre de 2009, 14:12:29
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.
Título: Re: Empezando con AVR
Publicado por: Cryn en 30 de Septiembre de 2009, 14:16:50
Perdoname Belgitaes pero tampoco te sigo comprendiendo, que tiene que ver un Bootloader con los Fuses!!! el temas que puso el amigo Cryn es si se podia compilar los Fuses, como los pic, cosas que con el Atmel es imposible, ya se comento muchos de esos, conclusion los Fuses de lo Atmel se configuran cuando se programa el micro, soy novato de verdad en Atmel, pero he leido muchos Tutorial de Atmel y nunca lei de programar los Fuse como tu lo explica, pero si tu esta convencido que se puede , te ruego que me ponga un Ejemplo en Assembler o GGC que se pueda quemar en el micro y funciones.  repito soy un Novato en los Micros y estoy aqui para aprender con ustedes.
 :mrgreen:
Saludos

Coincido con stk500, creo que nuestra amigo Belgitaes o bien no nos entiende o nosotros no la entendemos.

Nuevamente quiero agracederte por las respuestas que das Belgitaes, me serán de mucha utilidad cuando vea el lado de los bootloader y todas las buenas cosas que te molestaste en explicar, que de momento no me ayudaban en lo que buscaba de los fuses...

en fin, saludos para todos! y continuar aprendiendo, solo estoy esperando por los AVR que pedí para mostrarles circuitos funcionando, espero que no la pele con los fuses :mrgreen:
Título: Re: Empezando con AVR
Publicado por: Cryn en 30 de Septiembre de 2009, 14:22:23
Hola.

Revisando los archivos de salida resultado de la compilación, no encuentro por ningún lado el .cof. Como se habilita la generación de este archivo? En la ayuda hay algo sobre los tipos de archivos soportados pero no indica que se deba hacer para que lo genere.

Saludos
con que quieres compilar MLO__, con WINAVR o con AVR STUDIO, porque el 1ro es para C y el segundo para ASM aunque el 1ro se integra al AVR STUDIO, como bien ya debes saber

Personalmente estoy comenzando con ASM, y lo que te puede decir es que tiene un entorno de simulación parecida al del MPLAB, y me pareció muy buena, logre depurar varios programas y encontrar mis errores. Pienso que en C se debe poder hacer la misma simulación, todavía no vi nada de C del WINAVR.

Y si existiera una forma de depurar ya sea el asm o el c para los AVR, si alguien sabe de ello que nos lo comente
Título: Re: Empezando con AVR
Publicado por: Cryn 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
Título: Re: Empezando con AVR
Publicado por: Cryn 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??
Título: Re: Empezando con AVR
Publicado por: AKENAFAB en 30 de Septiembre de 2009, 14:45:38

Deja reviso que de momento no recuerdo , hace tiempo que no toco avrstudio xD.
Título: Re: Empezando con AVR
Publicado por: stk500 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
Título: Re: Empezando con AVR
Publicado por: Cryn 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
Título: Re: Empezando con AVR
Publicado por: AKENAFAB 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!
Título: Re: Empezando con AVR
Publicado por: Belgitaes 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
;****************************************************************************************

Título: Re: Empezando con AVR
Publicado por: MLO__ 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.

(http://img242.imageshack.us/img242/8558/avr1.png)

Saludos
Título: Re: Empezando con AVR
Publicado por: Cryn 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

(http://img200.imageshack.us/img200/2628/ddrbt.jpg)

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

(http://img29.imageshack.us/img29/7231/portbj.jpg)

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 (http://www.todopic.com.ar/foros/index.php?topic=27420.msg225876#msg225876)

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

(http://img205.imageshack.us/img205/9919/eskema2.jpg) (http://img205.imageshack.us/img205/9919/eskema2.jpg)

Ahora nos toca ver una imagen del circuito montado:

(http://img223.imageshack.us/img223/9663/dsc00097g.jpg) (http://img223.imageshack.us/img223/9663/dsc00097g.jpg)

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:

(http://img80.imageshack.us/img80/7541/fuses.jpg) (http://img80.imageshack.us/img80/7541/fuses.jpg)

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í.
Título: Re: Empezando con AVR
Publicado por: Cryn 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

(http://img26.imageshack.us/img26/6370/pind.jpg)

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:

(http://img384.imageshack.us/img384/26/eskema.jpg) (http://img384.imageshack.us/img384/26/eskema.jpg)

La imagen del circuito montado:

(http://img237.imageshack.us/img237/6471/dsc00100pl.jpg) (http://img237.imageshack.us/img237/6471/dsc00100pl.jpg)

Y por último el video del circuito funcionando:
[/youtube]
Título: Re: Empezando con AVR
Publicado por: jonathanPIC888 en 07 de Octubre de 2009, 15:03:54
Muchas gracias cryn por los ejemplos están muy buenos  :-/ :-/
Título: Re: Empezando con AVR
Publicado por: stk500 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  :-/ :-/

Título: Re: Empezando con AVR
Publicado por: Cryn 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.
Título: Re: Empezando con AVR
Publicado por: Cryn 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:
(http://img99.imageshack.us/img99/5665/eskemar.jpg) (http://img99.imageshack.us/img99/5665/eskemar.jpg)

La foto del circuito montado:
(http://img122.imageshack.us/img122/8190/dsc00087d.jpg) (http://img122.imageshack.us/img122/8190/dsc00087d.jpg)

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.
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC en 08 de Octubre de 2009, 18:52:31
que bien cryn ya se suman mas usuarios al club avr   :-/ ..jejeje

felicidades
Título: Re: Empezando con AVR
Publicado por: Cryn 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
Título: Re: Empezando con AVR
Publicado por: cristian_elect 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.
Título: Re: Empezando con AVR
Publicado por: Cryn 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.
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 10 de Octubre de 2009, 16:07:15
Hola Cryn Me Alegro Que Te Funcionné Ya
Título: Re: Empezando con AVR
Publicado por: Belgitaes 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

Título: Re: Empezando con AVR
Publicado por: Cryn 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
Título: Re: Empezando con AVR
Publicado por: Cryn 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.

(http://img98.imageshack.us/img98/1559/resetandinterruptvetors.jpg)

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

(http://img40.imageshack.us/img40/4103/mcucr.jpg)

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:
(http://img98.imageshack.us/img98/5520/interrupt0sensecontrol.jpg)

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

(http://img25.imageshack.us/img25/8438/gicr.jpg)

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

(http://img98.imageshack.us/img98/938/gifr.jpg)

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:
(http://img129.imageshack.us/img129/8593/eskemag.jpg) (http://img129.imageshack.us/img129/8593/eskemag.jpg)

circuito montado:
(http://img517.imageshack.us/img517/2050/dsc00091n.jpg) (http://img517.imageshack.us/img517/2050/dsc00091n.jpg)

y el video funcionando:
Título: Re: Empezando con AVR
Publicado por: Cryn 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

(http://img96.imageshack.us/img96/9347/admux.jpg)

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:
(http://img223.imageshack.us/img223/3703/voltagereferenceselecti.jpg)

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:
(http://img21.imageshack.us/img21/9803/inputchannelselections.jpg)

ADCSRA – ADC Control and Status Register A

(http://img16.imageshack.us/img16/8500/adcsra.jpg)

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:
(http://img96.imageshack.us/img96/7605/adcprescalerselections.jpg)

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
(http://img44.imageshack.us/img44/6285/adlar0.jpg)

ADLAR=1
(http://img223.imageshack.us/img223/4287/adlar1.jpg)

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:
(http://img97.imageshack.us/img97/26/eskema.jpg) (http://img97.imageshack.us/img97/26/eskema.jpg)

El circuito montado:
(http://img517.imageshack.us/img517/5452/dsc00092m.jpg) (http://img517.imageshack.us/img517/5452/dsc00092m.jpg)

y por último el vídeo del funcionamiento:
Título: Re: Empezando con AVR
Publicado por: Belgitaes en 11 de Octubre de 2009, 19:51:37
Muchas Gracias Cryn Ahora Si Los Puedo Simular En Proteus  :g)
Título: Re: Empezando con AVR
Publicado por: Cryn 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

(http://img8.imageshack.us/img8/2071/eearhyeearl.jpg)

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

(http://img41.imageshack.us/img41/1795/eedr.jpg)

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

(http://img25.imageshack.us/img25/4036/eecr.jpg)

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

(http://img17.imageshack.us/img17/4103/mcucr.jpg)

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:

(http://img10.imageshack.us/img10/4162/sleepmodeselet.jpg)

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:
(http://img517.imageshack.us/img517/26/eskema.jpg) (http://img517.imageshack.us/img517/26/eskema.jpg)
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í:
(http://img15.imageshack.us/img15/4190/dsc00099rj.jpg) (http://img15.imageshack.us/img15/4190/dsc00099rj.jpg)

y solo nos queda ver como funciona:
Título: Re: Empezando con AVR
Publicado por: Cryn 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!.
Título: Re: Empezando con AVR
Publicado por: betito_mmf 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




(http://img207.imageshack.us/img207/8171/dibujouu.jpg)



 
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC 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
Título: Re: Empezando con AVR
Publicado por: Cryn 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 (http://www.todopic.com.ar/foros/index.php?topic=27420.msg225640#msg225640) 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 (http://www.todopic.com.ar/foros/index.php?topic=27420.msg230381#msg230381). 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!
Título: Re: Empezando con AVR
Publicado por: kcire 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
Título: Re: Empezando con AVR
Publicado por: Suky en 19 de Octubre de 2009, 19:45:16
Realmente muy interesante! Pero me parece que voy a esperar tus primeros ejemplos en C  :mrgreen: Basta de ASM  :8}  :D :D

Mis felicitaciones!!!

Un saludo!
Título: Re: Empezando con AVR
Publicado por: Cryn en 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 :(. 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 :D ya se viene pronto en C :mrgreen:

saludos amigos y gracias por los comentarios.
Título: Re: Empezando con AVR
Publicado por: Suky en 19 de Octubre de 2009, 23:40:37
..en la casa de mi asistente..
:shocked:    :mrgreen:    ;-)

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

Saludos y animo en el aprendizaje!
Título: Re: Empezando con AVR
Publicado por: kcire en 20 de Octubre de 2009, 11:26:28
Realmente muy interesante! Pero me parece que voy a esperar tus primeros ejemplos en C  :mrgreen: Basta de ASM  :8}  :D :D

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  ;-) porque ASM me da una pereza hace ya mucho que no lo utilizo...  :?

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
Título: Re: Empezando con AVR
Publicado por: Cryn en 20 de Octubre de 2009, 11:28:13
..en la casa de mi asistente..
:shocked:    :mrgreen:    ;-)

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

Saludos y animo en el aprendizaje!

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

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
Título: Re: Empezando con AVR
Publicado por: Cryn en 20 de Octubre de 2009, 11:38:01
Realmente muy interesante! Pero me parece que voy a esperar tus primeros ejemplos en C  :mrgreen: Basta de ASM  :8}  :D :D

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  ;-) porque ASM me da una pereza hace ya mucho que no lo utilizo...  :?

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 :D :D :D

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 (http://sourceforge.net/projects/winavr/files/) y con el AVRStudio (http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725) 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 :( 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.
Título: Re: Empezando con AVR
Publicado por: MLO__ en 20 de Octubre de 2009, 11:40:26
 :D :D

Contrata varias, lo importante es que no se crucen los horarios!!!  ;-)

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 :(, 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 (http://www.todopic.com.ar/foros/index.php?topic=24309.msg229362#msg229362)

Saludos
Título: Re: Empezando con AVR
Publicado por: Cryn en 20 de Octubre de 2009, 13:44:29
Si lo estaba viendo de calladito MLO__ :mrgreen:

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á :( ya será por otros medios...

Saludos, ya iremos aprendiendo más...
Título: Re: Empezando con AVR
Publicado por: MLO__ en 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
Título: Re: Empezando con AVR
Publicado por: Suky en 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  :D :D
Título: Re: Empezando con AVR
Publicado por: MLO__ en 20 de Octubre de 2009, 15:59:25
Seee, al menos si el ANSI C  :D
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC en 21 de Octubre de 2009, 14:02:54
yo tambien estoy hay dandole al codevision avr me parece unos de los mejores compiladores en c para avr  :mrgreen:...ademas como lei alguna vez por hay trae ese asistonto que te salva la patria mas de una vez... :D
Título: Re: Empezando con AVR
Publicado por: MLO__ en 21 de Octubre de 2009, 14:57:12
Pues, la ayuda que trae es muy buena  ;-)
Título: Re: Empezando con AVR
Publicado por: Cryn en 21 de Octubre de 2009, 20:35:52
EJEMPLO 7

Es turno del Timer/Counter0, este es un módulo interno del microcontrolador que sirve para realizar temporizaciones internas en el micro o bien, conteos de pulsos externos, Es un registro de 8 bits del micro que puede leerse y escribirse. El conteo o temporización será siempre ascendente.

El Timer/Counter0 posee un preescaler que sirve de divisor de frecuencia, para retardar o mantener el incremento de este registro a la velocidad del Oscilador/Cristal usado para el micro, cuando el timer/counter0 trabaja con reloj interno.

Dependiendo el valor que necesitemos temporizar en segundos, ms ó us se usará uno u otro valor de preescaler para llegar a nuestro objetivo.

Usando el temporizador con reloj externo, pasa a modo contador ya que contará los pulsos que le ingresen, en este caso el preescaler siempre estará en 1:1 ya que no existe división de la frecuencia cuando el timer/counter0 está configurado de esta manera.

Teniendo estos conceptos claros, podemos ver a detalle los registros involucrados con el manejo del timer/counter0, que son 4, de los cuales en algunos registros no se usan todos los bits para configuraciones del timer/counter0 sino sirven también para configuraciones de los otros timer/counter, estos registros para el Timer/Counter0 son:


TCCR0 – Timer/Counter Control Register

(http://img32.imageshack.us/img32/1691/tccr0.jpg)

En este registro se configura el Preescaler, si por ejemplo seleccionamos la segunda opción, clkI/O/(No prescaling), significa que el timer/counter0 se incrementará a la velocidad del oscilador que se tiene para el micro, si por el contrario configuramos con otro valor como clkI/O/256 (From prescaler), significa que cada 256 pulsos del oscilador que tenemos configurado al micro incrementarán solo en 1 al valor del Timer/Counter0. De esta manera encontramos ese retardo o división de frecuencia para el conteo del Timer.

La primera opción sirve para desactivar el funcionamiento del Timer/Counter0, es decir éste no se incrementará, permanecerá detenido.

TCNT0 – Timer/Counter Register

(http://img96.imageshack.us/img96/5081/tcnt0.jpg)

Este es el registro de lectura y escritura de 8 bits que lleva la cuenta del Temporizador/Contador, puede comenzar la cuenta en caulquier valor que nosotros le carguemos y puede ser leído en cualquier momento.

TIMSK – Timer/Counter Interrupt Mask Register

(http://img44.imageshack.us/img44/6628/timsk.jpg)

Como el timer/counter0 es un registro de 8 bits que se irá incrementando a una frecuencia determinada, sucederá un caso muy particular y este es cuando el temporizador llegue a su valor máximo que es 255, como más allá de 255 en un registro de 8 bits no se puede hacer nuestro timer volverá a 0 para continuar su conteo indefinido hasta que el micro se quede sin energía. Este paso de 255 a 0 se llama desborde o en inglés overflow, este desborde puede generar una interrupción al micro.

Mediante el Bit 0 de este registro, TOIE0, podemos activar o desactivar esta interrupción por desborde de nuestro Timer/Counter0. Con un 1 queda activada la interrupción y con un 0 desactivada.

TIFR – Timer/Counter Interrupt Flag Registe

(http://img17.imageshack.us/img17/5831/tifr.jpg)

El bit0, TOV0, es el que interesa para el timer/counter0. Es una bandera que indica que ha sucedido el desborde el timer/counter0, se coloca a 1 en ese caso, y se vuelve a 0 automáticamente cuando el timer/counter0 toma el valor de 1. El bit de bandera de desborde se coloca a 1 en el momento que el timer/counter está en 0 previamente de haber venido de 255.

Si se usa la interrupción por desborde del timer, no se debe olvidar colocar en 1 la bandera de interrupciones globales.

Ahora nuestro ejemplo, configuraremos nuestro timer0 para contar 1 seg, ya que a un segundo encenderemos un led, y al siguiente lo apagaremos, haremos lo mismo del ejemplo 1 pero utilizando el Timer/Counter0.

Para ello configuraremos el preescaler en 256 con reloj interno, usaremos la interrupción por desborde, y siempre precargaremos al timer0 con el valor de 130 para solamente contar 125 estados del timer y a la vez contaremos 125 interrupciones para poder recién contar el segundo que buscamos. Eso salió del siguiente cálculo y una búsqueda algo paciente porque no encontré un buen programa para hacer ello, el avrcalc no lo logré entender :(. Este mi cálculo:

Uso 4MHz de Oscilador, entonces mi periodo es 0.25us, necesitaré 4'000.000 incrementos en el timer0 si el preescaler estaría en 1, usaré un preescaler de 256 por tanto solo necesitaré 4'000.000/256=15625 de incrementos en el timer0.

Si contamos los 256 valores (incrementos) del registro del timer0 tendríamos: 15625/256=61.03515625 interrupciones que contar, lo que no es "exacto" para nuestro caso, se podría quizá adoptar directamente ese número ya que sería aproximado el valor temporizado al valor que necesitamos.

Pero como nos gusta ser un poquitín más precisos, encontramos un numero divisible entre 15625, pero este número debe ser entre 0 y 255 pues son los valores que el timer0 de 8 bits puede soportar.

Ese número divisible que elegí es 15625/125=125, por tanto debemos contar 125 interrupciones y además debemos reducir la resolución de los 8 bits del timer, por tanto debemos precargar al timer con un valor para que solamente se cuente 125 incrementos antes de desbordar.

Nuestro valor de precarga será: 255-125=130.

Con esto podemos ver también nuestra tan conocida formula:

  Tiempo=Preescaler*(255-Precarga)*interrupciones*Tosc     donde Tosc es el periodo de nuestro Oscilador

  Tiempo = 256*125*125*0.25u = 1seg.

Ahora queda plasmarlo en código:
Código: ASM
  1. ;--------------------------------------------------------------------------------
  2. ;       Programa:       Led on/off con Timer/Counter0
  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 hace parpadear un led conectado al pin RB0 del puerto
  9. ;                       B durante aprox. 1seg. utilizando el timer0 para esto con su interrupcion
  10. ;      
  11. ;       Registros:      r0  -> sirve para el parpadeo del led al aplicarle un eor
  12. ;                       r16 -> On/Off led, r17 para precargar al timer/counter0,
  13. ;                       r18 contador de interrupciones, r19 flag indicación de que paso un segundo
  14. ;
  15. ;       Conexiones:     B1 -> Led
  16. ;--------------------------------------------------------------------------------
  17. ;DIRECTIVAS EN ENSAMBLADOR
  18. .include "m8def.inc"        ;ATmega8
  19.  
  20. ;DEFINICION DE REGISTROS
  21. .def  led_cambio=r0         ;registro para parpadeo del led
  22. .def  count=r18
  23. .def  flag=r19
  24.  
  25. ;reset-vector address $0000                    
  26. .org $0000
  27.         rjmp main               ;ve al main
  28. .org $009
  29.         rjmp int_tmr0           ;va a la interrupcion por desborde del timer0
  30.  
  31. ;PROGRAMA PRINCIPAL
  32. main:                                                  
  33.         ldi  r16,$04            ;Configuracion de...
  34.         out  sph,r16   
  35.         ldi  r16,$5F                   
  36.         out  spl,r16            ;...la pila: Stack: $045F=RAMEND
  37.         ser  r16                ;r16 <- $FF
  38.         out  ddrb,r16           ;portB salida
  39.         clr  flag               ;ponemos a cero la bandera para indicar que ha pasado 1seg.
  40.         clr  count              ;ponemos a cero el contador de interrupciones
  41.         ldi  r16,4              ;r16 <- 4
  42.         out  tccr0,r16          ;configuramos el Timer/Counter0 con reloj interno preescaler 256
  43.         ldi  r16,130            ;r16 <- 130
  44.         out  tcnt0,r16          ;valor de precarga para contar solamente 125 estados del timer
  45.         ldi  r16,1              ;r16 <- 1
  46.         out  timsk,r16          ;se habilita la interrupción por desborde del Timer/Counter0
  47.         ldi  r16,$01            ;r16 <- $01 -> Iluminar led conectado pin RB0
  48.         mov  led_cambio,r16     ;led_cambio <- r16 :variable para el parpadeo
  49.         sei                     ;se habilita las interrupciones globales
  50. loop:
  51.         cpi  flag,255           ;pasó 1seg?
  52.         breq toggle             ;saltamos a cambiar estado
  53.         rjmp loop               ;bucle infinito
  54. toggle:
  55.         out  portb,r16          ;actuamos sobre el led(conectado al pin RB0)
  56.         eor  r16,led_cambio     ;cambiamos estado on/off
  57.         clr  flag               ;limpiamos la bandera de indicación de 1seg pasado
  58.         rjmp loop               ;bucle infinito
  59.  
  60. ;RUTINA DE INTERRUPCION
  61. int_tmr0:
  62.         inc  count              ;incrementar contador de interrupciones
  63.         cpi  count,125          ;se han producido 125 interrupciones
  64.         brne salir              ;si no han pasado 125 interrupciones, salimos de la rutina
  65.         ser  flag               ;pasaron las 125 interrupciones = 1 seg, activamos bandera
  66.         clr  count              ;reiniciamos contador de interrupciones
  67. salir:
  68.         ldi  r17,130            ;r17 <- 130
  69.         out  tcnt0,r17          ;valor de precarga para contar solamente 125 estados del timer
  70.         reti                    ;fin de rutina de interrupción

El esquema del circuito:
(http://img38.imageshack.us/img38/26/eskema.jpg) (http://img38.imageshack.us/img38/26/eskema.jpg)

La foto del circuito montado:
(http://img33.imageshack.us/img33/6488/dsc00085gr.jpg) (http://img33.imageshack.us/img33/6488/dsc00085gr.jpg)

Y por último el video:

hasta la próxima... :-/
Título: Re: Empezando con AVR
Publicado por: stk500 en 22 de Octubre de 2009, 02:28:26
Cryn Muy buenos el tutorial que nos da  :-/ :-/ te estoy siguiendo y espero que lleguemos a PWM y sus aplicaciones  :-/ :-/   
Título: Re: Empezando con AVR
Publicado por: Cryn en 22 de Octubre de 2009, 11:01:26
Hola stk500 gracias por el comentario, mmm no había pensado en el PWM, ya quiero pasar al C, pero como no me dejan alternativas tendré que hacer algunas cosas más en ASM :D

saludos
Título: Re: Empezando con AVR
Publicado por: stk500 en 22 de Octubre de 2009, 12:35:56
Tranquilo amigo Cryn, eso no es un compromiso, sigue con tu planes y por aqui estare yo para  tener mas conocimientos.    :P
Saludos
Título: Re: Empezando con AVR
Publicado por: Cryn en 23 de Octubre de 2009, 13:47:55
Siempre que se pueda podemos hacer algo stk500 ;-)

Y quiero comentarles que he modificado todos los ejemplos colocando los registors usados y sus configuraciones posibles, usos, etc. para que quede más completo y se entienda mejor, de ahora en adelante algo nuevo que vea lo iré posteando de esa manera. Y en cuanto pueda también colocaré un índice en el primer post, para que sea más fácil acceder a los ejemplos.

Espero que hasta ahora les haya gustado y sea de utilidad, seguiré viendo algunas cosas más en cuanto me quede tiempo libre.

Saludos para todos!!.
Título: Re: Empezando con AVR
Publicado por: MiCrOtRoNiC en 24 de Octubre de 2009, 00:36:52
que bien amigo cryn estaremos atentos a los avances  :-/

una pregunta? modificaste los post? o tambien modificaste los adjuntos?
Título: Re: Empezando con AVR
Publicado por: Cryn en 24 de Octubre de 2009, 10:29:08
Hola MiCrOtRoNiC, Solo modifique los post, excepto en el ejemplo7 de timer que si modifiqué recién el adjunto, para simplemente aumentar la sección exportada para importarlo en versiones anteriores a la mía del Proteus, después todo sigue igual.

saludos.
Título: Re: Empezando con AVR
Publicado por: jhozate en 15 de Noviembre de 2009, 01:03:33
hay algo q no me queda muy claro..en los pic tenemos q una instruccion se realiza cada 4 ciclos de reloj, q con un crital de 4MHZ seria 1Us..ahora en los atmel ..cada instruccion se realiza a la par con el reloj?  es decir en 0,25Us...entonces podria utilizar la misma formula del timer0 de los pic ..aqui en los atmel  pero en lugar de (4/Fosc)..pongo 0.25Us?
(http://www.aquihayapuntes.com/images/stories/practicasPIC/recursos/tmr0Temp/formulatmr0.png)
Título: Re: Empezando con AVR
Publicado por: stk500 en 15 de Noviembre de 2009, 03:20:21
hay algo q no me queda muy claro..en los pic tenemos q una instruccion se realiza cada 4 ciclos de reloj, q con un crital de 4MHZ seria 1Us..ahora en los atmel ..cada instruccion se realiza a la par con el reloj?  es decir en 0,25Us...entonces podria utilizar la misma formula del timer0 de los pic ..aqui en los atmel  pero en lugar de (4/Fosc)..pongo 0.25Us?
(http://www.aquihayapuntes.com/images/stories/practicasPIC/recursos/tmr0Temp/formulatmr0.png)

Hola Jhozate!
la formula seria esta (T=1/f) = 1/4Mhz = 0,25Microsegundos Por Ciclo, usando un Cristal de 4Mhz,  el Timer0 tiene 8 bit, el Timer1 tiene 16 Bit,  tambien hay que tener la hojas de datos ya que hay Mcu con mas timer,
Título: Re: Empezando con AVR
Publicado por: Cryn en 15 de Noviembre de 2009, 16:17:50
aja exactamente como dice stk500, o para ser exactos la fórmula en los AVR es:

(http://img211.imageshack.us/img211/9963/timer.jpg)

El 4 para los pics es por lo que dijiste de los 4 ciclos de reloj por instrucción, en los AVR tenemos 1 ciclo de reloj por instrucción, por tanto ese 4 es solo para los lentos de los PIC :D

saludos.
Título: Re: Empezando con AVR
Publicado por: Jorge555 en 04 de Diciembre de 2009, 18:43:37
Hola, yo también llevo unos pocos meses desde que empece con los AVR, uso WINAVR que es bueno y gratutio y eso es un motivo de peso para utilizarlo frente a los otros compiladores que comentáis. También estoy haciendome pequeños resumenes de los periféricos y el código que voy ordenando en mi página www.jmnlab.com, ahí están por si a alguien le sirven, no sé si son correctos ya que estoy aprendiendo.

Segurié este hilo que está interesante.

Saludos.
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 09 de Diciembre de 2009, 13:28:39
Jorje555 yo tengo problemas con el winavr por que pierdo codigo en la compilacion en zize.
Eso no me pasa en otros compiladores.
No creo que todas las variables se declaren volatile para que no pierdan.
Yo ya deje un ejemplo aqui en el foro y nadie me supo responder.
Título: Re: Empezando con AVR
Publicado por: Jorge555 en 10 de Diciembre de 2009, 18:49:11
Pues no sé que decirte, yo no he tenido ningún problema con las optimizaciones. Lo único prueba a indicar la base en la que escribes cada número, es decir 0x7D2, etc..

Saludos
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 11 de Diciembre de 2009, 12:45:22
En este ejemplo la funcion delay(...) se pierde. En la simulacion se salta.
Ya este ejemplo ya lo hice con cvavr, iar y trabaja normal.
En un atmega8.

#include <avr/io.h>   

void delay( unsigned int a)
{
  while(a){
  a--;
   }
}

int main(void){
char a=0;
 DDRB=255;
 PORTB=0x00;
 delay(50);
 while(1){
   PORTB=a;
   ++a;
   delay(10000);
   if(a>254)
     a=0;
  }
  return 0;
}


 
Título: Re: Empezando con AVR
Publicado por: Jorge555 en 11 de Diciembre de 2009, 20:20:33
Pues no sé porque no entra en el simulador, au nque tampoco entiendo mucho de éste ya que suelo probar siempre sobre hardware. Si grabas ese código en el micro y lo pruebas te funciona mal.

Prueba a especificar la base con cada número, es decir si es decimal, binario, hexadecimal.. Yo creo que alguna vez he tenido problemas por no hacer ésto. No sé que tipos de base tomará el compilador por defecto.

Saludos.
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 21 de Diciembre de 2009, 00:17:24
Si el simulador funciona mal entonces también en el chip. El Winavr creo que no soporta completamente ANSI C.
 
Título: Re: Empezando con AVR
Publicado por: ma4826 en 21 de Diciembre de 2009, 07:32:07
En este ejemplo la funcion delay(...) se pierde. En la simulacion se salta.
Ya este ejemplo ya lo hice con cvavr, iar y trabaja normal.
En un atmega8.

#include <avr/io.h>   

void delay( unsigned int a)
{
  while(a){
  a--;
   }
}

int main(void){
char a=0;
 DDRB=255;
 PORTB=0x00;
 delay(50);
 while(1){
   PORTB=a;
   ++a;
   delay(10000);
   if(a>254)
     a=0;
  }
  return 0;
}


 

Si activas la optimización es lógico que elimine el delay, el compilador ve un bucle que no hace nada y lo elimina. Sino quieres lo mantenga puedes poner esto.

Código: [Seleccionar]
volatile unsigned int b;
void delay( unsigned int a)
{
  b = a;
  while(b){
  b--;
   }
}

  Aunque lo mejor es que uses las funciones de delay que vienen con avr-gcc. Bien las funciones que se encuentran en "util/delay.h" y que requieren que actives la optimización, que uses valores constantes para llamar a las funciones y que definas den el código la velocidad a la que esta funcionando el microcontrolador (# define F_CPU) para que funcionen correctamente.
void _delay_us(double __us)
void _delay_ms(double __ms)

O las funciones de delay básicas ("util/delay_basic.h")
static inline void _delay_loop_1(uint8_t __count); //Cosume 3x __count ciclos de CPU
static inline void _delay_loop_2(uint16_t __count); //Cosume 4x __count ciclos de CPU

Saludos,

Miguel Ángel.


Título: Re: Empezando con AVR
Publicado por: Jorge555 en 21 de Diciembre de 2009, 11:40:20
Hola ma4826, qué diferencia hay para el compilador entre hacer el primer búcle, sólo con la a, o hacer el segundo que indicas haciendo b = a ?. No entiendo porque el compilador ve un búcle que no hace nada en el primer caso y en el segundo no.

Gracias.
Título: Re: Empezando con AVR
Publicado por: cristian_elect en 21 de Diciembre de 2009, 14:23:25
LA función si es llamada por la programa principal entones como puedes decir que no hace nada en otros compiladores no sucede eso, siempre la funcion en tomada en cuenta, solo en winavr sucede eso.
Prueba con el iar, codevisionavr o de mikroelectronica no pasa eso.
Título: Re:Empezando con AVR
Publicado por: cosmic en 07 de Marzo de 2017, 02:24:32
Hola amigos.
tengo este código en bascom avr, en la simulación proteus corre de maravilla, pero
al montarlo en el protoboard, la señal pwm solo alcanza el 40% en estado alto, y se desfasa al llegar al mínimo, provocando parpadeo en la lampara.
Se trata de un dimer ac, con un ATMEGA328P.
subo código y simulación.

$regfile = "m328Pdef.dat"                                   'ATmega8
$crystal = 8000000                                          'Frecuencia de cristal=8 MHz
$hwstack = 32                                               'Hardware Stack
$swstack = 10                                               'Software Stack
Config Portb = Output                                       'Puerto B como salida
Config Portc = Input                                        'Puerto C como entrada
 Config Portd.2 = Input
'Definicion de variables

                                         'Dato medido en ADC1=Sensor
Dim Rampa As Single                                         'Señal escalón

Dim D As Word                                               'Variable para lectura de potenciómetro
Dim T As Single
'Configuracion ADC

Config Adc = Single , Prescaler = Auto
Admux = $40                                                 '$40

 'Configuracion de unterrupciones
Config Int0 = Low Level
Enable Int0                                      'INT1, flanco de bajada
On Int0 Int_zc

Config Timer1 = Timer , Prescale = 1024                     'Configuración TIMER1, f=31.25 KHz
On Compare1a Int_timer1                                     'Interrupción por comparación
Enable Compare1a                                            'Habilitación interrupción por comparación

                                           'Interrupción externa INT1                                             'Habilitación INT1
Enable Interrupts                                           'Habilitación global de interrupciones

Timer1 = 0                                                  'Reinicialización de Timer1
Compare1a = 1
Stop Timer1
Rampa = 0                                                   'Reiniciar Rampa en cada Interrupción

'Programa principal
                                      'Reinicialización de Rampa
 Do
 nop                                                        'Bucle infinito
 Loop

'Rutinas de interrupción

'Interrupcion cruce por cero
 Int_zc:
   Stop Timer1
    Timer1 = 0
    Rampa = 0                                               'Interrupción cada 7*1/31250= 0.22 ms = 7.5ms/32

   Portb.0 = 0                                              'Señal a Triac =0
   'Obtensión de señales Referencia y Sensor
   Start Adc
   D = Getadc(0)

   Stop Adc

   T = D / 1023                                             '1024
   T = T * 360                                              'Rango 0 - 360 => precisión 0.5 grados.

     Start Timer1

   Return



'Interrupcion Timer  cada 0.22 ms 32 escalones por semiciclo
  Int_timer1:
   'Stop Timer1
   Timer1 = 0                                               'Reiniciar Timer1
   Rampa = Rampa + 2.8                                      'Incrementar rampa por cada interrupción


      If T > Rampa Then
      Portb.0 = 0                                           'Señal a Triac = 0
   Else
      Portb.0 = 1                                           'Señal a Triac =1

   End If
     'Start Timer1
   Return

End