Autor Tema: TUTORIAL AVR - ATMEGA16 / 8  (Leído 80300 veces)

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

Desconectado betito_mmf

  • PIC10
  • *
  • Mensajes: 13
TUTORIAL AVR - ATMEGA16 / 8
« en: 02 de Enero de 2009, 00:36:24 »
**************************************************************************************************


   Hola amigos , en vista de la escasa info en español  de los AVRs aqui abrimos un tutorial paso a paso de como programar
   el atmega16 y atmega8   que son los avr que estoy usando en estos momentos con el  software del fabricante
   AVR STUDIO  junto  al WIN AVR   ,  no soy un experto pero empezaremos por lo mas basico esperando sus
   aportes para aprender    mas de estos bichitos 8)
   
   
   
    :-) :-) :-)    Querer es poder     :mrgreen:
   
                                   
« Última modificación: 02 de Enero de 2009, 03:39:03 por betito_mmf »
:-) :-) :-)  HOY SERE MEJOR QUE AYER  :mrgreen:

Desconectado betito_mmf

  • PIC10
  • *
  • Mensajes: 13
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #1 en: 02 de Enero de 2009, 01:07:22 »
Estas son las paginas oficiales y gratuitas de donde pueden descargar el software 

 AVR STUDIO    Entorno integrado de desarrollo  para escribrir y depurar aplicaciones AVR

 WIN AVR         Compilador para C y C++ 

 PONY PROG     Software para programar el micro
NOTAPrimero instalar el AVR STUDIO  y luego recien el WIN AVR 
          (el AVR Studio solo programa en assembler al instalar el "Winavr" , el "Avr Studio" tambien podra

            programar en lenguaje C y C++ )


« Última modificación: 05 de Enero de 2009, 02:53:49 por betito_mmf »
:-) :-) :-)  HOY SERE MEJOR QUE AYER  :mrgreen:

Desconectado betito_mmf

  • PIC10
  • *
  • Mensajes: 13
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #2 en: 02 de Enero de 2009, 03:37:26 »
Creando un nuevo proyecto
Una vez instalados ambos programas abrimos asi:

Menu Inicio - Programas - Atmel AVR Tools  - AVR Studio4

click en  "New Proyect"




luego:

1-  elegir  "AVR GCC"   (  :-)  Nota : para programar en assembler elija  "Atmel AVR Assembler"  y para programar en lenguaje C elija "AVR GCC"    :-))
2-  Poner el nombre del proyecto
3-  elegir  un lugar apropiado para guardar el proyecto
-NEXT>>




a continuacion:

1- elegir la plataforma  "AVR Silmulator"  por que vamos a similuar el programam primero
2- escoja el dispositivo a usar  en este caso el ATMEGA16
- FINISH -






Al final saldra la ventana principal del AVR STUDIO donde tipearemos el programa  led.c




Las partes principales de esta ventana son:
1-  EDITOR DE CODIGO : Area para tipear el programa
2-  ZONA DE REGISTROS de entrada y salida  I/O
3-  AREA DE PROYECTO:  Aqui se muestran todos los archivos fuente y cabeceras del proyecto actual. Se puede
                                      adicionar y remover archivos , haciendo anticlick o menu contextual en los diferentes
                                      grupos como : Source File , Header Files , etc . Hacer doble click para abrir en el editor.
4- AREA  DE MENSAJES:   Aqui el AVR STUDIO muestra los errores , warnings  , o si la compilacion fue exitosa.

bueno mas adelante continuaremos  con la descripcion del programa
 
« Última modificación: 06 de Enero de 2009, 04:56:53 por betito_mmf »
:-) :-) :-)  HOY SERE MEJOR QUE AYER  :mrgreen:

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #3 en: 02 de Enero de 2009, 04:49:09 »
Excelente
gracias   :-/

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #4 en: 02 de Enero de 2009, 14:06:08 »
Muy bueno Beto!!! La verdad q me interesa aprender a usar microcontroladores de otras empresas, y tengo por entendido q los AVR son muy buenos. Voy a seguir el hilo, gracias por el aporte!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #5 en: 02 de Enero de 2009, 14:25:40 »
Ya tengo tiempo usando los atmegas, por que eran mas baratos repondian mejor que los pics. Comprar un pic18 en peru cuesta mucho unos s/25 promedio, mejor un atmega8 estan a s/9.
Use el winavr pero no me salia bien en las sub funciones , me pase al codevisionavr hay todo me va bien y luego me pase al iar que me permite simular en proteus mejor que el ccs para pic  por que te todos las variables al momento que corre paso a paso.

Desconectado josnelihurt

  • PIC12
  • **
  • Mensajes: 64
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #6 en: 02 de Enero de 2009, 20:03:17 »
Hola, Me parece muy bueno el tema he estado interesado en aprender de los AVR desde hace un tiempo, pero tengo grandes dudas para arrancar :shock:, como por ejemplo que uC comprar para iniciarme? me pueden sugerir algo similar al 16f877?
otra cosa que hardware para programar puedo usar? algo sencillo como para adentrarme y empezar a hacer practicas pequeñas.
Muchas gracias
JoN

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #7 en: 02 de Enero de 2009, 21:16:01 »
Hola, Me parece muy bueno el tema he estado interesado en aprender de los AVR desde hace un tiempo, pero tengo grandes dudas para arrancar :shock:, como por ejemplo que uC comprar para iniciarme? me pueden sugerir algo similar al 16f877?
otra cosa que hardware para programar puedo usar? algo sencillo como para adentrarme y empezar a hacer practicas pequeñas.
Muchas gracias


Hola pana!

Puedes hacerte un programador ISP por puerto paralelo o serial , son muy sencillo , tambien puedes armarte este http://www.fischl.de/usbasp/ que es USB.

Mira pues asi -+ similare spara comenzar , de 40 pines el atmega8535, de 28 pines el atmega8.

Muy buenos los 2 y bastantes ejemplito scon esto smicros , son de los más fáciles de conseguir , asi como los 2313.

Yo tengo unas cuantos atmega8 super buenos 8)

Los programadores buscalos como ISP

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #8 en: 03 de Enero de 2009, 03:10:59 »
fabuloso betito_mmf , estare siguiendo este hilo de muy cerca

te ha quedado bien chevere !  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado josnelihurt

  • PIC12
  • **
  • Mensajes: 64
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #9 en: 03 de Enero de 2009, 03:41:52 »
Hola pana!

Puedes hacerte un programador ISP por puerto paralelo o serial , son muy sencillo , tambien puedes armarte este http://www.fischl.de/usbasp/ que es USB.

Mira pues asi -+ similare spara comenzar , de 40 pines el atmega8535, de 28 pines el atmega8.

Muy buenos los 2 y bastantes ejemplito scon esto smicros , son de los más fáciles de conseguir , asi como los 2313.

Yo tengo unas cuantos atmega8 super buenos 8)

Los programadores buscalos como ISP


Hola muchas gracias por su repuesta, pues veo la posibilidad de comprar un atmega8 o atmega88, realmente son muy similares lo que veo es la velocidad, 16MIPS y 20MIPS bueno en concreto, los dos los puedo programar con un ISP? he mirado algunos programadores ISP con un puerto paralelo y son básicamente un 74hc244 ud tiene alguno que le funcione y me pueda facilitar por puerto paralelo, Muchas gracias
JoN

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #10 en: 03 de Enero de 2009, 04:49:29 »
Aca un ejemplo de como parpadear leds por todos los puertos de el atmega ; funciona ok en el proteus setear el oscilador en 1mhz.
Código: C
  1. #include<avr/io.h>
  2. void delay_ms(unsigned char time_ms);
  3. void main()
  4. {
  5. DDRC=0xff; //todos los puertos del atmega16 seran configurados como salidas
  6. DDRA=0xff; // es lo contrario de os pic que son salidas al setearse en cero
  7. DDRB=0xff;
  8. DDRD=0xff;
  9.  
  10.         while(1)
  11.         {
  12.        
  13.         PORTA=0X00;
  14.         PORTB=0X00;
  15.         PORTC=0X00;
  16.         PORTD=0X00;
  17.  
  18.         delay_ms(200);  // en esta libreria no puede sermayor el tiempo que 255
  19.         delay_ms(200);//por eso paraun  retardo de 1 segundo llamo 5 veces a
  20.         delay_ms(200);  // el retardo de 200ms
  21.         delay_ms(200);
  22.         delay_ms(200);
  23.        
  24.         PORTA=0XFF;
  25.         PORTB=0XFF;
  26.         PORTC=0XFF;
  27.         PORTD=0XFF;
  28.  
  29.         delay_ms(200);
  30.         delay_ms(200);
  31.         delay_ms(200);
  32.         delay_ms(200);
  33.         delay_ms(200);
  34.         }
  35.        
  36. }

una vez que han seguido los pasos bien explicados por Beto fijarse en Project ---> Configuration Options y debe de aperecer una ventana como la que muestro en caso de no ser asi rellenar de acuerdoa sus requerimientos (sobre todo en frecuencia que en mi caso es 1000000hz)




Espero la ayuda de quien sepa los avr sobre todo para entender la libreria de retardo de ms que puse en el ejemplo anterior se agradeceria si la pudieran explicar.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #11 en: 03 de Enero de 2009, 09:48:56 »

Hola muchas gracias por su repuesta, pues veo la posibilidad de comprar un atmega8 o atmega88, realmente son muy similares lo que veo es la velocidad, 16MIPS y 20MIPS bueno en concreto, los dos los puedo programar con un ISP? he mirado algunos programadores ISP con un puerto paralelo y son básicamente un 74hc244 ud tiene alguno que le funcione y me pueda facilitar por puerto paralelo, Muchas gracias

El ISP es general  , asi que puedes programar cualquiera.Solo ten cuidado con los bits de configuracion.

Más cosas acerca del programador pasalos al foro de este tipo compa.

Un Saludo!

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #12 en: 04 de Enero de 2009, 06:26:19 »
Continuando aca el manejo de pantalla lcd las librerias estan en la misma hoja, en caso quieran modificar a gusto del cliente
Código: [Seleccionar]
/*----------------------------------------------------------------
-----------------HEADER FILES-------------------------------------
-----------------------------------------------------------------*/
#include<avr/io.h>


/*----------------------------------------------------------------
-------------CONNECTION BETWEEN LCD AND ATMEGA16-----------------
-----------------------------------------------------------------*/
#define DATA_DDR DDRA
#define DATA_PORT PORTA


#define CONTROL_DDR DDRD
#define CONTROL_PORT PORTD
#define Enable_Pin   6
#define RegSelect_Pin     4
#define ReadWrite_Pin     5
#define CONTROL_MASK     0X70


/*----------------------------------------------------------------
-------------CONTROL BITS OF LCD --------------------------------
-----------------------------------------------------------------*/

#define Set_Enable  CONTROL_PORT|=_BV(Enable_Pin)
#define Clear_Enable CONTROL_PORT&=~_BV(Enable_Pin)
#define Write_Lcd     CONTROL_PORT&=~_BV(ReadWrite_Pin)
#define Read_Lcd     CONTROL_PORT|=_BV(ReadWrite_Pin)
#define Select_InstructionRegister CONTROL_PORT&=~_BV(RegSelect_Pin)
#define Select_DataRegister     CONTROL_PORT|=_BV(RegSelect_Pin)
#define Data_Lcd(a) DATA_PORT=a
#define delay(a) delay_ms(a)



/*----------------------------------------------------------------
-----------------FUNCTIONS---------------------------------------
-----------------------------------------------------------------*/
void Init_Ports(void);
void Init_Lcd(void);
void delay_ms(unsigned char time_ms);
void Lcd_Send(unsigned char a);


/*----------------------------------------------------------------
----------------MAIN FUNCTION--------------------------------------
-----------------------------------------------------------------*/
void main()
{
int len,i;
char string[] = {'F','e','r','n','a','n','d','o',' ','R'};
Init_Ports();
Init_Lcd();
len=10;
for (i=0; i< len;i++)
  Lcd_Send(string[i]);

}



/*----------------------------------------------------------------
-----------------SEND A CHARACTER TO LCD-------------------------
-----------------------------------------------------------------*/
void Lcd_Send(unsigned char a)
{
Select_DataRegister;
Write_Lcd;
Data_Lcd(a);
Set_Enable;
delay(1);
Clear_Enable;
delay(1);
}

 




/*----------------------------------------------------------------
-----------------FUNCTIONS TO INITIALIZE PORTS--------------------
-----------------------------------------------------------------*/
void Init_Ports(void)
{
DATA_DDR=0XFF; //Setting data port for output
CONTROL_DDR=CONTROL_MASK;//setting selected pins of control port for output
CONTROL_PORT&=~(_BV(Enable_Pin)|_BV(RegSelect_Pin )|_BV(ReadWrite_Pin)); //setting values to 0 at starting
}




/*----------------------------------------------------------------
------------FUNCTION TO INITIATE LCD -----------------------------
-----------------------------------------------------------------*/
void Init_Lcd(void)
{
char init[10];
 int i;
 init[0] = 0x01;
 init[1] = 0x38;
 init[2] = 0x0c;
 init[3] = 0x06;
 init[4] = 0x80;
Select_InstructionRegister;
Write_Lcd;
for(i=0;i<5;i++)
{
Data_Lcd(init[i]);
Set_Enable;
delay(1);
Clear_Enable;
delay(1);
}
}




/*----------------------------------------------------------------
--------FUNCTION TO GENERATE DELAY IN MILLISECONDS----------------
-----------------------------------------------------------------*/
void delay_ms(unsigned char time_ms)
{
unsigned short delay_count = F_CPU / 400;

unsigned short cnt;
asm volatile ("\n"
                  "L_dl1%=:\n\t"
                  "mov %A0, %A2\n\t"
                  "mov %B0, %B2\n"
                  "L_dl2%=:\n\t"
                  "sbiw %A0, 1\n\t"
                  "brne L_dl2%=\n\t"
                  "dec %1\n\t" "brne L_dl1%=\n\t":"=&w" (cnt)
                  :"r"(time_ms), "r"((unsigned short) (delay_count))
);
}


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #13 en: 04 de Enero de 2009, 13:23:45 »
Hola amigos .


¿De donde puedo bajar los operadores y expresiones???

Le busco en la ayuda y no encuentro!

Saludos1


Yo les dejo este que rota el bit atravez del puerto B.

Código: [Seleccionar]
#include <avr/io.h>

#define F_CPU 4000000UL

#include <util/delay.h>

int main(void)
{
DDRB=0xFF;  //PUerto b como salida
PORTB=1;    //

int x;
while(1){
        for(x=0;x<7;x++){
       
PORTB=PORTB<<1;  //rotar una posicion a la izquierda

_delay_ms(400);

        }

    for(x=7;x>=1;x--){
PORTB=PORTB>>1;  //rotar 1 posicion a la derecha
_delay_ms(400);
            }

}
}

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #14 en: 04 de Enero de 2009, 15:00:12 »
Hola AKENAFAB una sugerencia , trata de no usar el _delay_ms() pues no funciona como debe te lo demuestro en una simulacion que hice modificando el ejemplo que pusistes ; lo he comprobado tanto con el simulator de avr studio y con el proteus esto tb se lo comente a Beto por eso que en mis ejemplos uso otra libreria externa , el que si esta bien elaborado es la libreria _delay_loop_2(40000) en este caso 40000 esta en us ô es 40ms me da exacto , pero tener en cuenta en las unidades pues el _delay_loop_2(entero de 2bytes o menor a 65535) pue si pongo _delay_loop_2(80000) me mandara al compilar unos warning comentando error de truncamiento y logico los tiempos no salen exactos , si queremos analizar bien estas librerias al momento de compilar aparecen en las carpetas External dependencies que aparece en la parte izquierda.

Aca el codigo que modifique:

Código: [Seleccionar]
#include <avr/io.h>

#define F_CPU 4000000UL

#include <util/delay.h>

int main(void)
{
DDRB=0xFF;  //PUerto b como salida
PORTB=1;    //

//int x;
while(1){
        //for(x=0;x<7;x++)
// {
       
// PORTB=PORTB<<1;  //rotar una posicion a la izquierda
PORTB=1;
_delay_loop_2(40000);
//_delay_ms(400);


        // }

    // for(x=7;x>=1;x--)
// {
// PORTB=PORTB>>1;  //rotar 1 posicion a la derecha
PORTB=0;
_delay_loop_2(40000);
//_delay_ms(400);
        // }

}

aca la simulacion en el avr studio:


 

anything