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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #45 en: 03 de Octubre de 2009, 12:16:01 »
Hola.

Pues aqui dejo un avance que he hecho con los AVR o ATMEGA ...

El código lo que hace es enviar un string y una variable cuando el estado del pin A0 sea 1:

Código: C
  1. #include <mega16.h>
  2. #include <stdio.h>
  3. #include <delay.h>
  4.  
  5. #define true    1
  6.  
  7. #define WDE     3
  8. #define WDTOE   4
  9. #define RA0     PINA.0
  10.  
  11. struct BytesUsed
  12. {
  13.     unsigned char Data[13];
  14.     unsigned char Count;
  15. }Var={"Hola Mundo\r\n",0};
  16.  
  17. void main(void)
  18. {
  19.     UCSRA=0x00;
  20.     UCSRB=0x08;
  21.     UCSRC=0x86;
  22.     UBRRH=0x00;
  23.     UBRRL=0x19;
  24.     DDRA.0=0;
  25.    
  26.     while (true)
  27.     {
  28.         if(RA0==1)
  29.         {
  30.             printf("Valor[%u]\r\n %s",Var.Count,Var.Data);
  31.             delay_ms(10);
  32.             Var.Count++;
  33.         }
  34.     }
  35. }

Una imagencilla del esquematico y del sistema funcionando



Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #46 en: 03 de Octubre de 2009, 13:56:26 »
Nada mejor que el uso de interrupciones para la recepción serial  ;-)

Código: C
  1. #include <mega16.h>
  2. #include <stdio.h>
  3. #include <delay.h>
  4.  
  5. #define RXB8 1
  6. #define TXB8 0
  7. #define UPE 2
  8. #define OVR 3
  9. #define FE 4
  10. #define UDRE 5
  11. #define RXC 7
  12.  
  13. #define FRAMING_ERROR (1<<FE)
  14. #define PARITY_ERROR (1<<UPE)
  15. #define DATA_OVERRUN (1<<OVR)
  16. #define DATA_REGISTER_EMPTY (1<<UDRE)
  17. #define RX_COMPLETE (1<<RXC)
  18.  
  19. #define RX_BUFFER_SIZE 20
  20. struct BytesUSART
  21. {
  22.     char Buffer[RX_BUFFER_SIZE];
  23.     unsigned char index;
  24.     char status;
  25.     char data;
  26. }USART;
  27.  
  28.  
  29. // USART Receiver interrupt service routine
  30. interrupt [USART_RXC] void usart_rx_isr(void)
  31. {
  32.     USART.status=UCSRA;
  33.     USART.data=UDR;
  34.     if ((USART.status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  35.         USART.Buffer[USART.index]=USART.data;
  36.     putchar(USART.data);
  37. }
  38.  
  39. void main(void)
  40. {
  41.     UCSRA=0x00;
  42.     UCSRB=0x98;
  43.     UCSRC=0x86;
  44.     UBRRH=0x00;
  45.     UBRRL=0x19;
  46.  
  47.     #asm("sei")
  48.    
  49.     while (1)
  50.     {
  51.     }
  52. }

El código recibe el caracter por vía serial y lo envía nuevamente. Me pareció muy útil la parte del registro UCSRA en donde están varias opciones de detección de errores.

Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #47 en: 05 de Octubre de 2009, 13:37:01 »
Hola.

Aqui otro ejemplillo, ahora con el ADC; el valor [entre 0 y 255] se despliega en 3 siete segmentos los cuales están controlados por la interrupción de un timer

Código: C#
  1. #include <mega16.h>
  2. #include <delay.h>
  3.  
  4. #define ADC_VREF_TYPE   0x60
  5. #define true            1
  6. #define OutUnidades     PORTD.2
  7. #define OutDecenas      PORTD.1
  8. #define OutCentenas     PORTD.0    
  9.  
  10. const unsigned char Numeros[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  11.  
  12. struct BytesADC
  13. {
  14.     unsigned char Value;
  15.     unsigned char SetPoint;
  16. }ADC;
  17.  
  18. struct BytesTimer
  19. {
  20.     unsigned char Ints;
  21.     unsigned char SetPoint;    
  22. }Timer0;
  23.  
  24. struct BytesBCD
  25. {
  26.     unsigned char Unidades;
  27.     unsigned char Decenas;
  28.     unsigned char Centenas;
  29. };
  30.  
  31. union
  32. {
  33.     struct BytesBCD BCD;
  34.     unsigned long int ByteBCD;
  35. }uNumero;
  36.  
  37. void Decimal2BCD(unsigned long int valor);
  38. unsigned char read_adc(unsigned char adc_input);
  39.  
  40. interrupt [TIM0_OVF] void timer0_ovf_isr(void)
  41. {
  42.     uNumero.ByteBCD=0;
  43.     Decimal2BCD(ADC.Value);
  44.    switch(Timer0.Ints++)
  45.    {
  46.        case 0:
  47.         OutCentenas=0;
  48.         PORTC=Numeros[uNumero.BCD.Unidades];
  49.         OutUnidades=1;
  50.         break;
  51.        
  52.        case 1:
  53.         OutUnidades=0;
  54.         PORTC=Numeros[uNumero.BCD.Decenas];
  55.         OutDecenas=1;
  56.         break;
  57.        
  58.        case 2:
  59.         OutDecenas=0;
  60.         PORTC=Numeros[uNumero.BCD.Centenas];
  61.         OutCentenas=1;
  62.         Timer0.Ints=0;
  63.         break;
  64.    }
  65. }
  66.  
  67. void main(void)
  68. {
  69.     PORTA=0x00;
  70.     DDRA=0x00;
  71.    
  72.     DDRD=0xFF;
  73.     PORTD=0x00;
  74.    
  75.     DDRC=0xFF;
  76.     PORTC=0x00;
  77.  
  78.     // ADC initialization
  79.     // ADC Clock frequency: 1000,000 kHz
  80.     // ADC Voltage Reference: AVCC pin
  81.     // ADC Auto Trigger Source: None
  82.     // Only the 8 most significant bits of the AD conversion result are used
  83.     ADMUX=ADC_VREF_TYPE & 0xff;
  84.     ADCSRA=0x82;
  85.    
  86.     TCCR0=0x04;
  87.     TCNT0=0x00;
  88.     TIMSK=0x01;
  89.    
  90.     #asm("sei")
  91.  
  92.     while (true)
  93.     {
  94.         ADC.Value=read_adc(0);
  95.         delay_ms(5);
  96.     }
  97. }

El esquemático:


Saludos
El papel lo aguanta todo

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #48 en: 05 de Octubre de 2009, 23:36:00 »
Estas usando CVAVR es un compilador bastante bueno funciona bien, lo que no me sale bien es en WinAVR se pierde codigo.
 

Desconectado betito_mmf

  • PIC10
  • *
  • Mensajes: 13
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #49 en: 22 de Octubre de 2009, 07:00:24 »
Hola amigos , ya que estan con el Codevision  avr , justo ahora estoy practicando con ese software ,
aqui les mando un ejemplito del timer0  vamos a generar una señal Periodica de 5ms   en estado bajo
y  2ms  en estado alto, cuando se presione el pulsador.

antes que nada un poco de teoria

EL TIMER0

El atmega16 puede trabajar en distintos modos de generacion de formas de onda (4 modos):

1- MODO   NORMAL
2- MODO   PWM, Fase correcta
3- MODO   CTC  (Borrado del  contador en la igualdad de comparación: TCNT0=OCR0 =>  borrar  TCNT0 )
4- MODO   Fast PWM

 Estos modos se configuran en el registro TCCR0 (Resgistro de Control del Timer0)   especificamente
 en los  bits 6 y 5  (ver datasheet)

aqui voy a trabajar con el MODO CTC , en el que se hace una comparacion entre los registros TCNT0 y OCR0 ,
cuando el contador TCNT0 enpiece a contar  1 ,2,3, ......  y llegue al valor que tiene el registro OCR0 (valor
 que lo pone el programador),  entoces TCNT0 es puesto a 0 (borrado) y se activa  el flag OCF0 , y se ejecuta
 la interrupcion por "igualdad de  comparacion" . asi de simple o noo

Eso no es todo , para que veas cuantos recursos tiene este micro , el modo que explique solo es para ver de
que modo vamos a generar la forma de onda.  ahora tambien podemos configurar la patita (el pin OC0) por
donde saldra la señal , para ello existe dos bits de configuracion bits 5 y 4 del registro TCCR0  (ver data sheet ;-))  .  

COM01     COM00

  0                0               No se forma señal en el pin OC0  ,  OC0 desconectado
  0                1               TOGGLE en OC0  en la igualdad de comparacion (Si pin OC0 es "0" ahora sera "1" y viceversa)
  1                0               O  en el pin OC0   en la igualdad de comparcion
  1                1               1   en el pin Oc0    en la igualdad de comparcion

Usare el modo TOGGLE , es decir el pin OC0 sera "0" hasta que el timer llegue a los 5ms y luego el pin sera
 "1"  por 2ms  y asi susecivamente 5ms   2ms ,  5ms 2ms ,  .................         genrando  la señal periodica

para mas detalle aqui les pongo  el programa , donde logicamente veran que use el preescaler del timer0
CLK/1024 para llegar a los 5ms y 2ms .



                                                                                                               _2m__                   _____
                    //programa que genera una onda periodica   ____5ms__|          |_________|         |
                    //clock 8Mhz  , 5ms  en bajo y 2ms el alto , al presionar el pulsador


                    #include <mega16.h>

                    volatile char i;
                    volatile int bajo = (5*8*1000/1024)-1;
                    volatile int alto = (2*8*1000/1024)-1;
              
                    interrupt [EXT_INT0] void ext_int0_isr(void)

                   {   DDRB = 0b11111111;
                        OCR0 = bajo;
                        TCCR0 = 0b00011101;     //modo CTC, toggle OC0, CLKIO/1024
                        TIMSK = 0b00000010;
                   }

                    interrupt [TIM0_COMP] void timer0_comp_isr(void)
      
                   {    i=~i;  
                        if (i==0)
                                 OCR0=bajo;            
                        else      
                                 OCR0=alto;    
                   }

                    void main (void)
                  
                   {   MCUCR = 0b00000010;      //INTE0  Flanco de bajada
                        GICR =  0b01000000;         //habilitamos INTE0
                        #asm("sei")                        //SREG.7 = 1;
                        while(1);
                   }




Aqui la simulacion:



y la salida de la simulacion:



Por cierto esta simulacion esta en Proteus 7.2 Sp6 y la forma de onda es la esperada  ,pero  lo simule en el proteus 7.4  , 7.5  , inclusive en el 7.6 sp0  pero
la forma de onda en estas versiones es incorrecta  , haber mi amigo MLO o alguien me pueda decir si hay este mismo error en estas versiones pues
ya puse de cabeza mi PC y naca la perinaca con estas versiones  en cuanto a la interrupcion de timer0 por igualdad de comparcion . no se
si sera mi PC que es AMD con procesador Athlon XP , por ahi vi que dicen que en otras maquinas si corre bien . pasen la voz please , por lo pronto me quedo
con esta 7.2 sp6  .
 


« Última modificación: 20 de Noviembre de 2009, 15:40:04 por betito_mmf »
:-) :-) :-)  HOY SERE MEJOR QUE AYER  :mrgreen:

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #50 en: 22 de Octubre de 2009, 17:12:51 »
reciba mis saludos y felicitaciones por los temas de este hilo. ya pronto me pondre a cabalgar estos micros.

saludos!!!

PD: quitele el cigarrito al gatito!!!
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

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

Desconectado adam143

  • PIC10
  • *
  • Mensajes: 1
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #51 en: 10 de Mayo de 2010, 16:06:05 »
Hola Petito
soy un technico in electronicas e estoy aprendido el linguage c para usar me atmega8535 in me proyectos electronicos.La cosa e no se como usar la.Puides dar me las etapas para empezar por favor.que necessito como hardware and software.tengo solo el atmega8535 con un solo cable que se connecta a el computador;es sufficiente?
muchas gracias

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #52 en: 17 de Noviembre de 2010, 12:18:15 »
Hola gente, excelentes aportaciones, segun lo que he visto y leido de los ATmega son de mayores prestaciones por sus instrucciones y otras bondades de su arquitectura, y otro plus aparte es su bajo costo, por esto me dicidi a aprenderlos, llevo tiempo programando pics y tambien algo de motorolas en assembler y C, pero para comenzar me gustaria entrar con el assembler, alguien tiene algun ejemplo para el ATmega8 en assembler? Se agradece de antemano las respuestas. Saludos a todos, seguire este hilo.  :mrgreen:
...enrique  :-)

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #53 en: 17 de Noviembre de 2010, 13:00:25 »
Hola Erinquez, para programa en Assembler el Atmega8 te vale cualquier programa para otros Atmega, pero debe tener la hoja de Dato del Atmega8, yo se assembler no se muchos, pero hay un monton de Aplicaciones en la pagina de Atmel.
seria muy interesante que tu mismo abriela un Hilo aqui con tus ejemplos asi todos podiamos aprender contigo.
 :P :P
Saludos

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #54 en: 17 de Noviembre de 2010, 14:36:31 »
Yo comencé con asm pero termine en C pero también lo combino los dos.
Tiene muchas instrucciones pero eso mejora bastante el rendimiento hay ice la prueba de un pic18 y un atmega
Y el atmega le gana 45% a la misa velocidad contando que el pic es clock/4.
Es decir pic18 a 16Mhz y atmega 4MHz.
Pero lo malo que los atmega estan subiendo su precio, ya los ultimos modelos de pic18 cuestan menos y los estan mejorando.
« Última modificación: 17 de Noviembre de 2010, 14:42:56 por cristian_elect »

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #55 en: 17 de Noviembre de 2010, 16:09:00 »
Yo me apunto al hilo estoy escribiendo pequeñas aplicaciones para el ATtiny2313 y pronto  :5] :5] :5] :5] espero que me lleguen los micros ATmega644 y ATmega328P de Ditentec ..que todavía no me responden luego de que les hice el pago  :5] :5]

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #56 en: 17 de Noviembre de 2010, 18:20:33 »
No estaria mal la idea de iniciar un hilo con un tutorial de los ATmega en assembler, acabo de darle una revizada y ya compile mi primer programa, si todos colaboramos se hace algo bueno, por mi parte yo me apunto al assembler, si alguien sigue enhorabuena... En assembler se puede conocer mucho mejor las bondades del micro  :mrgreen: por eso me interesa mas el asssembler, y sus instrucciones se parece mucho a los micros de freescale, lo cual esta muy bueno.
Voy a hacer unos ejemplos mas y si tengo algo mas consistente abro un hilo o si alguien ya tiene algo, contribuyo. Saludos!   8)
...enrique  :-)

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #57 en: 29 de Noviembre de 2010, 17:03:55 »
Para los interesados en programar los ATmega en Assembler con el AVRStudio, led dejo este link:

AVR Assembler User Guide

Saludos.
...enrique  :-)

Desconectado ex-cash

  • PIC10
  • *
  • Mensajes: 1
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #58 en: 01 de Junio de 2012, 21:45:58 »
Bueno amigoa quie les dejo una libreria que hara su retardo (dalay) mas exacto, esto lo pueden utilizar en el AVR Studio 5 en codigo C, no mas tinen que llamar la libreria incluirla y listo espero les sirva para sus proyectos con el Atmega16, excelente microcontrolador!!!!

Desconectado smairand18

  • PIC10
  • *
  • Mensajes: 2
Re: TUTORIAL AVR - ATMEGA16 / 8
« Respuesta #59 en: 05 de Julio de 2012, 22:42:44 »
yo tengo un problema, en mi proyecto estoy tratando con un atmega16 y me pidieron hacer un ensallo con el, en el cual lo convierta en una compuerta logica, cuando la entrada a0=1, la salida b=0 y al contrario, entonces como soy un poco ignorante de la programacion del atmega, mas o menos consegui esto:
IF(PINA.1) //si el pin 1 del puerto A está en 1...
{
//PORTB.1 = 0;
}

IF(!PINA.1) //si el pin 1 del puerto A está en 0...
{
//PORTB.1 = 1;
}
estara bien lo que asumo???