Está en la página 1de 66

CursoMicrocontroladores AtmelAVR

Tecnologico deMorelia Departamento Electronica talfaro2000@yahoo.com

FamiliaAVR
TINYAVR 8 32pin,microcontroladoresdeproposito general 16miembrosdelafamilia MEGAAVR 32 100pin,microcontroladoresdeproposito general 23miembrosdelafamilia ASSPAVRs USB,CANyLCD ControlMotoreiluminacion Automotriz AdministraciondeBaterias 8miembrosdelafamilia

Dispositivosconrangodesde1a256KB Rangodelnumerodeterminalesdesde8a100 Compatibilidadtotaldecodigo Caracteristica/Pincompatiblesentrefamilias Unconjuntodeherramientasdedesarrollo

ArquitecturaAVR
ArquitecturaRISCconconjuntode instruccionesCISC ConjuntodeInstruccionespoderosoparaCy ensamblador Escalables MismoNucleopoderosoentodoslos dispositivosAVR Execucionenunsolociclo Unainstruccionporrelojexterno Consumodepotenciabaja 32registrosdetrabajo TodosconectadosdirectamentealaALU! Nucleo(core)muyeficiente 20MIPS@20MHz Altoniveldeintegracion Costodelsistematotalbajo

Lasoperacionesconregistros TomanunSOLOpulsodereloj Enlaentradaexternadereloj

Tamano Codigo ytiempo deejecucion

Solucionenunsolocircuito integrado

ATMEGA48

Caracteristicas

Encapsulados
PDIP

Diagrama de Bloques

Variantes

PROGRAMACION DEL MICROCONTROLADOR

ProgramacionusandoAVRDUDE
En una ventana de MSDOS introducir la siguiente linea de comando:

avrdude p cdigodemicro c usbasp e u U flash:w:nombrearchivo.hex

Donde codigodemicro es una identificacion para el microcontrolador Que se quiere programar. nombrearchivo.hex es el archivo (generado por winnAVR o Codevision u otro compilador) que se quiere programar en el microcontrolador. usbasp es el nombre del programador. flash y w es para indicarle que se quiere escribir (w) en la memoria flash. Para mas informacion consultar el manual de AVRDUDE.

CodigosdelosMicros
Microcontrolador AT90CAN128 AT90PWM2 AT90PWM3 AT90S1200 AT90S2313 AT90S2333 AT90S2343 (*) AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90S8535 AT90USB646 AT90USB647 AT90USB1286 AT90USB1287 ATmega103 ATmega128 ATmega1280 ATmega1281 ATmega16 ATmega161 ATmega162 ATmega163 ATmega164 cdigodemicro c128 pwm2 pwm3 1200 2313 2333 2343 4414 4433 4434 8515 8535 usb646x usb647x usb1286x usb1287x m103 m128 m1280 m1281 m16 m161 m162 m163 m164

ATmega168 ATmega169 ATmega2560 (**) ATmega2561 (**) ATmega32 ATmega324 Atmega325 ATmega329 ATmega3250 ATmega3290 ATmega48 ATmega64 ATmega640 ATmega645 ATmega644 ATmega649 ATmega6450 ATmega6490 ATmega8 ATmega8515 ATmega8535

m168 m169 m2560 m2561 m32 m324 m325x m329 m3250x m3290 m48 m64 m640 m645x m644 m649 m6450x m6490 m8 m8515 m8535

ATmega88 ATtiny11 ATtiny12 ATtiny13 ATtiny15 ATtiny2313 ATtiny24 ATtiny25 ATtiny26 ATtiny261 ATtiny44 ATtiny45 ATtiny461 ATtiny84 ATtiny85 ATtiny861

m88 t11 t12 t13 t15 t2313 t24x t25 t26 t61 t44x t45 t461 t84x t85 t861

LENGUAJE C

HerramientasdeProgramacion
Editor Compilador(Compiler) Enlazador(Linker) Cargador(Loader) Depurador(Debugger) AmbientedeDesarrollo Integrado(IDE)
Interfaceparalos comandosbasicos

WinAVR
WinAVResunasuitedeherramientas ejecutables,(opensourcesoftware)parael desarrrollodeprogramacionde microprocesadoresAtmelAVRpormediodela plataformaWindows.Incluyeuncompilador GNUGCCparaCyC++.
http://winavr.sourceforge.net/

ComentariosenC
/*Multi Linea Comentarios*/ //comentariosalfinaldelinea

Includes
Incluyeunarchivo tipicamenteunarchivode cabecera(headerfile)conteniendodeclaracionesde simbolos. #include<avr/io.h>
Esteesunarchivoestandardelsistema
Elcompiladorestandardsabeenquecarpetasbuscarestearchivo

#include"mystuff.h"
Esteesunarchivoespecificodelproyecto
Elcompiladorbuscaenlacarpetadelproyectoestearchivo

Definiciones
#definesymbolloquesedesea Esteesllamadounmacro
defineunsimbolocomounacadenadetexto

Cadaocurrenciadelsimboloesreemplazado porlacadenadespuesdelsimbolo EstoeshechoporelpreprocesadordeC

Variables
Especificanuntipo,ambiente,tiempodevida,y nombre
Tipoeschar,int,float,etc
EnAVRtiposespecialescomouint8_t,int16_t,etc

Ambientees
Local(block) declaradasdentrodefunciones Global(file) declaradasfueradefunciones Program(external) Usedascomoenlacesentrevariosarchivos

Tiempodevidaes
Automatico(defaultparavariableslocales)(enlapila) Estatico(defaultparavariablesglobalesydeprograma)(enram) Dinamico(localidaddealmacenajecontroladoporprograma)(en heap)

DeclaraciondeVariables
Las declaraciones de las variables se hacen de la siguiente forma: Con signo o sin signo tipo nombre; //Comentarios Ejemplos unsigned char x,y,temperatura; unsigned int var1; llamamos var1

// Es una variable entera sin signo que

TiposdeVariables
Tipo Char Unsigned char signed char Int short int Unsigned int signed int long int Unsigned long int signed long int Float Double Tamao en bits 8 8 8 16 16 16 16 32 32 32 32 32 Rango 127 255 127 32767 32767 65535 32767 2147483647 4294967295 2147483647 1.75 e 3.402 e 38 1.75 e 3.402 e 38

TiposdeDatos
Variable o constante Decimal Hexadecimal Binario Octal Caracter Cadena Formato Nmero 0x nmero hexadecimal 0b nmero binario 0 nmero octal a esta es una cadena

x=20; x=0x14; x=0b00010100; x=024;

// x es 20 decimal //x es 14 hexadecimal que convertido a decimal es 20 decimal //x se manejado en binario que es equivalente a 20 decimal //x se maneja en octal que es 20 decimal

Arreglos
Un arreglo es un conjunto de datos que pueden ser accesado a travs de un ndice. Su declaracin se hace as: nombre del arreglo [nmero de elementos]={elemento1, elemento2,.. elemento n }

Ejemplo char arreglo1 [3]={0x0a,0x38,0x23};

El primer elemento es el 0, en la declaracin anterior del arreglo ste se defini de tres elementos, siendo el primer elemento el 0 y el ltimo elemento el nmero 2, vea el siguiente ejemplo: x=arreglo1[0]; // x vale 0x0a ya que acces al primer elemento del arreglo

ArreglosMultidimensionales
Se puede declarar un arreglo de dos dimensiones que se interpretara como fila y columna ejemplo:

char arreglo_multi_dim [2,3]= {1,2,3}, {,4,5,6};

// Es un arreglo de dos //filas y tres columnas

Operadoresaritmeticos
Smbolo + * / % Operacin Suma Resta Multiplicacin Divisin Divisin Mdulo, y el resultado es el residuo

Operadoresparaelmanejodebits
Smbolo & | ^ << >> ~ Descripcin And Bit a Bit OR bit a Bit Or exclusivo Bit a Bit Corrimiento a la Izquierda Corrimiento a la derecha Complemento a unos (inversin de bits)

Operadoresderelacion
Operador > >= < <= == != && || Descripcin Mayor que Mayor o igual que Menor que Menor Igual que Igual que Distinto de Y tambin si O si

Estructuraif else
La estructura if else es: si se cumple el if se hace lo que est abajo del if y sino se cumple se hace lo que est debajo del else if (Var1==10) { Var1=0; Var2=20; x=14; } else { Var1=++; x=20; }

Estructuraelse if
Donde se cumpla la condicin rompe las siguientes comparaciones, no evala todas, pero si se cumple hasta abajo habr evaluado todas las comparaciones.

if (Var1==10) Var1=0; else if (Var1==09) Var1=1; else if (Var1==08) Var1=2; else Var1=3;

Estructurawhile
El while evala lo que hay entre los parntesis y mientras se cumpla ejecuta lo que est debajo del while.

while ((porta==0x01) &&(var1==0)) { portb++ ; //Si porta=0 y Var1=0, se incrementa en uno el portb }

Estructuradowhile
A diferencia del while, esta instruccin ejecuta por lo menos una vez lo que est abajo del do, despus evala el while y si es vlido ejecuta nuevamente lo que est abajo del do.

do { Portb++ ; //Si porta=0 y Var1=0, se incrementa en uno el portb } While ((porta==0x01) &&(Var1==0))

Estructurafor
La estructura del for es (inicio; condicin de paro; incremento del ndice)

for (i=0;i<=10000,i++) { var1++; //i tendra que ser declarado como int para que cumpla con el rango }

RupturadeCiclosconBreak

Se puede terminar un ciclo for, while y do while mediante el break sin necesidad de terminar las iteraciones o de que se vuelva falsa la condicin. for (i=0;i<=10000,i++) { var1++; if (var2==0) //Si var2=0 se rompe ciclo, quedando el i en donde se haya cumplido el var2 break; } var3=i;

Ciclosinfinitos
for(;;) { Se ejecuta infinitamente las instrucciones aqu colocadas }

Otra forma de generar ciclos infinitos: while(1) { Se ejecuta infinitamente las instrucciones aqu colocadas }

Prototiposdefunciones (encabezados)
Lasfuncionesdebensererdeclaradasantesdesuuso
Unadeclaracionessolamenteelencabezadodelafuncion noelcuerpo
Lasdeclaracionesdefunciones(encabezados)normalmenteson colocadasenarchivosinclude

Unadefiniciondeunafuncionincluyeelcuerpodela funcion

voidfunction_name(int,float);//encabezado
Serequieretipodedatoderetorno;voidsignificaque nadaesregresado Tiposdelosargumentos

Main
CadaprogramaenCnesecitaunafuncionllamada main
int main(void){ int x; //local var x = add(3, 9); //llamada a una funcion return 0; }

Elcuerpodelprogramavadentrodelosbraques Estafuncionnormalmenteregresa0comocodigo quesignificaquetodoestabien

Otrasfunciones
Lasdefinicionesdeotrasfuncionesson colocadasdebajodemain(aunquesepueden ponerarriba)oenunarchivoseparado
int add(int a, int b){ return a+b; Loas argumentos son } pasados por valor a los
parametros

OperacionesconBits

Interrupciones
sei()ycli()habilitaranodeshabilitaranlas interrupciones Parapreservarelestadoactual,usar
uint8_t sreg = SREG; cli(); SREG = sreg;

Apuntadores
Apuntadoressonvariablesquecontienenla direcciondeundato
uint8_t num = 5; //variableuint8 uint8_t * numPtr; //apuntadoralvaloruint8

OperadordeDireccion
numPtr = &num; //direcciondeunavariable

OperadordeDereferencia
PORTD = *numPtr; //datodeladireccionennumPtr

ArreglosyApuntadores
Losnomresdelosarreglossonapuntadoresa constantes
Estoes,representanladireccionbasedelarreglo, perosolamentecomounvalor
int16_t numbers[4] = {5, 7, -2, 6}; int16_t * aPtr; aPtr = numeros; aPtr = &numeros; Losultimos2sonidenticos

ParametrosporReferencia
LasfuncionesenCusan solamentelallamadapor valor
func_by_val(a);
void func(char x){ PORTB = x; }

Sepuedepasaryrecibirla direcciondeldato,dandopor resultadolallamadapor referencia


char a; func_by_ref(&a);

void func(char * x){ *x = '$'; }

Cadenas
Lascadenassonimplementadasenarreglosde caracteres
char p[6]; //noinicializada p ?? ?? ?? ?? ?? ?? char q[6] = "Joe"; q //Usa4delos6bytes 4A 6F 65 00 ?? ??

Losarreglospuedenserimplicitamentecreadosy simplementeapuntadosa 4A 6F 65 00 char * n = "Joe"; n

DatosenFlash
#include <avr/pgmspace.h> prog_uint16_t myData[] = {874, 299, 14987, 37}; prog_char someText[] = "Hello World";

Estocreadatosenlamemoriadeprograma(flash)
Debenperteneceralaclasedealojamientoestatico (static)

Ladesventaja,esquesetienequeaccederaellosen unaformaespecial
Haymacrosyrutinasespecialesdecaracteresparaacceder alosdatosalmacenadosdeestaforma

ProgramDataMacros
uint16_t x = pgm_read_word(myData+2); for (i=0; i<3; i++)
char y = pgm_read_byte(&someText[i]);

Estosmacrosrequierenladirecciondeldato queseraaccesado
Elnombredeunarregloesunadireccion
myData+2eslomismoque&myData[2] &someText[i]eslomismoquesomeText+i

Funcionesdecadenasenmemoriade programa
Agregar_Palasfuncionesestandarsparausarlas cadenasenmemoriadeprograma
int n = strlen_P(someText);

Lascadenasdedestinodebenestarenram
strcpy_P(ramStr, someText);

UsePGM_Pparadeclararunapuntadorauna cadenaenmemoriadeprograma
PGM_P pptr = someText; char c; while (c = pgm_read_byte(pptr++)){...

Retardos(Delays)
#define F_CPU 4000000UL #include <avr/delay.h> _delay_us(93);
Maxretardo:768us/F_CPUenMHz

// 4 MHz
Numero de interacciones de lazo (para implementar el retardo) esta basado en la velocidad del procesador

_delay_ms(10);
Maxretardo:262.14ms/F_CPUinMHz.

_delay_loop_1(24);
Usaconteode8bits,3ciclosporinteracion Pasa0parainteracionesmaximas(256)

_delay_loop_2(1039);
Usaconteode16bits,4ciclosporiteracion Pasa0paraiteracionesmaximas(65536)

math.h
Incluyetodaslasfuncionesmatematicas necesarias fabs,sqrt,sin,asin,ceil,floor,
Notarqueestostrabajanendatospuntoflotante,asi queserequiere,porlamayoriadelosprogramasen AVR,conversiondeyhaciaformatodeenteros

Funcionesdeatenciona interrupciones
#include <avr/interrupt.h> ISR(interrupt name){
//Elcodigodelarutinademanejovaaqui //Noserequiereguardaryrestaurarestado esautomatico //RETItambienesagregadaautomaticamente

} Ademasdedefinirlarutinademanejo,serequiere habilitar/deshabilitarlasinterrupciones
GICR |= (1<<INT0); //por ejemplo sei();

ProyectosMultiarchivos
Agregarcadaarchivofuentealalistadel proyecto Cadaarchivoseracompilado/ensambladopor separado
Usearchivosdecabeceraparacompartir declaraciones

Losresultadossonenlazadosenunsolo archivohexparaejecucion.

DosarchivosenC
//mainfile.c #include <avr/io.h> #include "otherfile.h" int main(void){ char x; x = tc('B'); PORTB = x; return 0; } //otherfile.h #ifndef otherfile_h #define otherfile_h char tc(char); #endif

DosArchivosenC
//otherfile.c #include <avr/io.h> #include "otherfile.h" //toggle case char tc(char x){ return x ^ _BV(5); }

Elarchivodecabeceraes incluidodondesea declarado,yydondesea definido


Elcompiladorpuedechecarel usoydeclaracionpara consistencia

MezclandoCyEnsamblador
Lenguajeensambladorenlinea
Tieneunasintasisespecialparapermitiraccesoalas variablesenCytambienevitarproblemasconresgistros usadosporcodigoenC.
asm("in%0,%1":"=r"(localvar):"I(_SFR_IO_ADDR(PIND))); in r24,0x10 ;0x10esladirecciondePIND std Y+9,r24 ;Y+9esladirecciondelocalvar

Llamandounafuncionenunlenguajedesdeotro lenguaje

CyEnsamblador
//asmfile.S #include <avr/io.h> ;void show (uint16_t * port, uint8_t data) .global show ;args: portaddr R25:R24 ; data R22 show: ;tc needs its argument in R24 push r25 ;save port address push r24 mov r24, r22 rcall tc ;toggle case ;r24 is case-toggled char pop r30 ;get port address pop r31 st Z, r24 ;out! ret

Losarchivosenensamblador requierenlaextension.S Usaelestilodearchivosde cabeceraenC Declaraelpuntode entrada(nombredelafuncion) comoglobaldemeneraqueel programaenCpuedaverla

CyEnsamblador
//mainfile.c #include<avr/io.h> #include"otherfile.h" voidshow(volatileuint8_t*port, char); intmain(void){ charx='Z'; show(&PORTB,x); show(&PORTC,'a'); return0; }

Elprototipoesagregadoa mainparalacompilacion

Macros
-Uso de Macros (I<<n) puede ser reemplazado por: #define BIT(n) (I<<n); uso: (I<<5) =>BIT(5) -Utiles para calculos de reloj: #define set_counter_from_seconds(t) ((CF/CKDIV I)*(t)) Esta macro permite convertir facilmente numero de ciclos de reloj a segundos.

Building
Elarchivoenlenguaje ensambladoresagregadoal listadodearchivosdelproyecto ElcomandoBuildensamblaray compilaralosarchivos requeridos
Cadaunidadproduceunarchivo objeto Solamenteunarchivohexes producido

También podría gustarte