martes, 16 de abril de 2013

Programa PIC básico vs Programa Atmel básico

Hola!, hace mucho que no escribía por acá. Me anoté en la facultad para hacer el proyecto final de ingeniería así que estuve ocupado haciendo bastantes cosas. Lo más probable es que haga algún proyecto de robótica o simulación :)

Aparte, comencé a ir al Club de Robótica FIUBA http://www.clubderobotica.com.ar/ , del cual aprovecho para agradecerles a los organizadores por haberme permitido que me uniera. La didáctica es bastante sencilla: hay distintos proyectos, ya sea para principiantes y o avanzados, los cuales están dirigidos por un coordinador. (También es posible proponer un tema propio). Una vez que nos decidimos por un proyecto, comenzamos a llevarlo adelante.

Algunos de los proyectos son autitos seguidores de líneas, brazos robóticos, robots mini sumo, robots que encuentran salidas a laberintos, cubo de leds, etc.

Como plataforma principal de trabajo utilizan micros de la marca Atmel programados mediante un programador USB.

Para probar qué tan fácil es programar los ATMEL les voy a mostrar el mismo código que generé en mis primeros tutoriales para encender un LED tanto con el PIC16F88 como con el Atmega48 (Quise comprar el Atmega88 pero no lo tenían en los locales del centro). Me salió $19,72 en sycelectronica.

Los Atmega48, 88 y 168 son micros de 8bits, de 28 pins y con similares características. Lo que los diferencia son los tamaños de memoria flash. El atmega48 tiene 4k de memoria mientras que el 88 y el 168 tienen 8 y 16k respectivamente.

Atmega48/88/168


Veamos algunas comparaciones simples entre el PIC16F88 y los atmel anteriores:

PIC16F88


Al igual que el PIC16F88 tienen un oscilador interno de hasta 8Mhz y soportan hasta 20 Mhz con un xtal externo.

Los bits de configuración en la arquitectura Avr (atmel) se les llaman FUSES y se especifican por fuera del código en C.

En cantidad de pins, el pic tiene 18 mientras que los atmel tienen 28.

El voltaje de operación en el pic va de los 2.0V a los 5.5V mientras que en el atmel va de 2.7V a 5.5V.

Ambos productos tienen soporte para grabación "in circuit", es decir, cambiar el firmware del micro estando en un circuito que hayamos diseñado.

Ambos tienen soporte para comunicación serial mediante USART.

Microchip tiene su entorno de desarrollo MPLABX basado en Netbeans (Windows/Linux) mientras que Atmel tiene a AtmelStudio basado en Visual Studio 2010 (Windows). Igualmente hay varios IDEs distintos y Open Source disponibles para Windows/Linux.

Después tienen otros pines que todavía no utilicé como el PWM y entradas analógicas.

Ejemplo que permite prender y apagar un led:

PIC16F88 (XC8):

#define _XTAL_FREQ       8000000
#include <xc.h>
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

__CONFIG(MCLRE_ON & CP_OFF & CPD_OFF & LVP_OFF & BOREN_OFF &
         WDTE_OFF & FOSC_INTOSCIO & PWRTE_OFF);
__CONFIG(IESO_OFF & FCMEN_OFF);

#define posLED  _PORTB_RB0_POSITION // Posición en la que se encuentra el Led
#define PORTLED PORTB 
 
/**
 * Programa principal
 */
void main(void) {

    // Configura el Oscilador interno a 8Mhz
    OSCCONbits.IRCF = 0b111;
     
    // Configura un 0 en la posición que le corresponde al LED
    // y un 1 a todas las demás.
    // 0 = Salida, 1 = entrada
    TRISB = ~(1 << posLED);
    // La línea anterior es equivalente a
    // TRISB = 0b11111110;
 
    // Bucle principal
    while(true) {
 
        PORTLED |= (1 << posLED);    // Setea en estado alto (High) el LED
         
        __delay_ms(500); // Se queda esperando 500 milisegundos
         
        PORTLED &= ~(1 << posLED);    // Setea en estado bajo (Low) el LED
         
        __delay_ms(500);
 
    }
}

Atmega48, 88, 168 (avr-gcc)
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

#define posLED PORTD0 // Posición en la que se encuentra el Led
#define PORTLED PORTD

int main( void) {
       
        // Configura un 1 en la posición que le corresponde al LED
        // y un 0 a todas las demás.
        // 1 = Salida, 0 = entrada
        DDRD = (1 << posLED);
        // La línea anterior es equivalente a
        // DDRD = 0b00000001;
       
        // Bucle principal
        while(1) {
              
               PORTLED |= (1 << posLED);     // Setea en estado alto (High) el LED
              
               _delay_ms(500);         // delay 500 ms
              
               PORTLED &= ~(1 << posLED);    // Setea en estado bajo (Low) el LED
              
               _delay_ms(500);         // delay 500 ms
        }
}




El ejemplo con PIC está distinto que el de los posts anteriores para que se parezca más al código del Atmel.

En cuanto tenga tiempo veo si puedo comparar los códigos para utilizar el USART. Hasta la próxima!
Related Posts Plugin for WordPress, Blogger...