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

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

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Empezando con AVR
« Respuesta #90 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

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

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Empezando con AVR
« Respuesta #92 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!
No contesto mensajes privados, las consultas en el foro

Desconectado kcire

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 84
Re: Empezando con AVR
« Respuesta #93 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
"La imaginación es más rica que el lenguaje... sugiere con palabras, la imaginación podrá hacer el resto."

Desconectado Cryn

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #95 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 y con el AVRStudio ya me descargue las últimas versiones, en cuanto siga con los ejemplos lo actualizaré en mi PC.

Rarísimo lo del GTP+, hice todo lo que pude y en mi PC no volvió más a dar luz verde :( 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.
.

Desconectado MLO__

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

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #97 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...
« Última modificación: 20 de Octubre de 2009, 13:48:20 por Cryn »
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Empezando con AVR
« Respuesta #98 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
El papel lo aguanta todo

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Empezando con AVR
« Respuesta #99 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
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Empezando con AVR
« Respuesta #100 en: 20 de Octubre de 2009, 15:59:25 »
Seee, al menos si el ANSI C  :D
El papel lo aguanta todo

Desconectado MiCrOtRoNiC

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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Empezando con AVR
« Respuesta #102 en: 21 de Octubre de 2009, 14:57:12 »
Pues, la ayuda que trae es muy buena  ;-)
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Empezando con AVR
« Respuesta #103 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
  • TCNT0 – Timer/Counter Register
  • TIMSK – Timer/Counter Interrupt Mask Register
  • TIFR – Timer/Counter Interrupt Flag Registe

TCCR0 – Timer/Counter Control Register


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


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


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


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:

La foto del circuito montado:

Y por último el video:

hasta la próxima... :-/
« Última modificación: 24 de Octubre de 2009, 10:22:57 por Cryn »
.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Empezando con AVR
« Respuesta #104 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  :-/ :-/   


 

anything