jueves, 5 de junio de 2014

Arduino - AVR LIB C vs Librerias Arduino

Bueno me lleve una sorpresa compilando codigo con la librerias de avr en C con respecto a las librerias que utiliza arduino ide y es alarmante el tamaño del codigo generado por las librerias de arduino admito que estan buenas esta todo hecho la descargas y sale andando aca esta el viejo ejemplo del blink que hace parpadear el led e el pin D13 un segundo ambos codigos hacen lo mismo la diferencia esta en el tamaño y las librarias usadas.

Esta es la cadena de compilacion o compilerchain o toolchain como se ve podemos generar nuestro codigo en asembler y ensamblarlo con AVR-AS o hacerlo en C y compilarlo con AVR-GCC y generar el OBJ enlazarlo a librerias y bootloaders generar el .hex y cargarlo...




esta cadena es usadas por las librerias de arduino IDE el cual nos evitan mucho trabajo de programacion de registros binario y hexadecimal pero generan codigo basura aumentando el tamaño y rendimiento.



Libreria de arduino IDE - (1.084bytes)




Librerias de AVR C o AVR-LIBC (214 bytes)



O sea imaginense todo el espacio ocupado en nuestro arduino o micro atmega328p (ATMEL AVR) con codigo mas complejo :O

ahora usar avr-lib es toda una batalla a medida que bajamos de nivel aumentamos rendimiento, reducimos tamaño pero se hace mas dificil entender el codigo estas intrucciones o macros en C nos permiten configurar los registros del (uP) atmega328p

DDRx  --> Registro de Direccion de Datos "X corresponde al puerto  B - C - D entrada o salida"
PORTx -->Sirve para poner en alto o bajo un pin o varios pines digitales.
PINx -->Sirve para leer un pin o varios pines digitales

Atmega328p

PB7      PB6   PB5  PB4  PB3  PB2  PB1 PB0 (8 bits - 1 byte - PORT B)
(xtal1) (xtal1)  D13  D12  D11  D10  D9   D8
0             0         1      0         0     0        0     0   ej. binario


PD7  PD6  PD5  PD4  PD3  PD2  PD1       PD0    (8 bits - 1 byte - PORT D)
D7     D6    D5    D4    D3     D2   D1(tx)    D0(rx)

entonces primero le decimos al micro uP que vamos a usar los puertos como entradas o salidas digitales
en binario o hex los ponemos a uno como salida o a cero como entrada.

DDRB=0B00100000   //solo pusimos a PB5 como salida corresponde al pin D13
o
DDRB=0x20 // lo mis mismo en hex prefiero el binario

ahora lo ponemos a alto

PORTB=0B00100000 //pusimos el bit PB5 en alto
o
PORTB=0x20 //lo mismo en hex pone a alto el pin PB5 o pin D13


ahora lo ponemos en bajo
PORTB=0B00000000 //pusimos el bit PB5 en bajo
PORTB=0x0


y los podemos combinar :)


DDRB=0B00111111   //decimos que del pin D8 al D13 son salidas
o
DDRB=0x3F //en hex

PORTB=0B00100001 //pusimos a alto solo el pin D8 y el D3
o
PORTB=0x21 //en hex




#include <avr/io.h>
#define F_CPU 16000000UL //este el clock externo 16MHZ al compilar se especifica..
                                                //en delay.h figura a 1MHZ no me queda claro es como default.
                                             
                                               //el clock es el tiempo por intruccion 1/16E6 =6.3E-8 segundos
#include <util/delay.h>          //deberian ser 16MHZ ??? investigare un poco este tema...

int main(void)
{
  DDRB=0B00100000;

 //ponemos el pin D13 como salida


 while(1) //este es el bucle loop :) infinito
  {
 
    PORTB=0B00100000;
   //ponemos en alto el pin D13 del PORT B
    _delay_ms(1000);
  //es el delay el mismo usado delay(1000)
    PORTB=0B00000000;
//ponemos en bajo el pin D13 del PORT B    
 _delay_ms(1000);
  }

  return 0;
}



Sldos..

No hay comentarios.:

Publicar un comentario