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..