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

m168

ATmega169

m169

ATmega2560 (**)

m2560

ATmega2561 (**)

m2561

ATmega32

m32

ATmega324

m324

Atmega325

m325x

ATmega329

m329

ATmega3250

m3250x

ATmega3290

m3290

ATmega48

m48

ATmega64

m64

ATmega640

m640

ATmega645

m645x

ATmega644

m644

ATmega649

m649

ATmega6450

m6450x

ATmega6490

m6490

ATmega8

m8

ATmega8515

m8515

ATmega8535

m8535

ATmega88

m88

ATtiny11

t11

ATtiny12

t12

ATtiny13

t13

ATtiny15

t15

ATtiny2313

t2313

ATtiny24

t24x

ATtiny25

t25

ATtiny26

t26

ATtiny261

t61

ATtiny44

t44x

ATtiny45

t45

ATtiny461

t461

ATtiny84

t84x

ATtiny85

t85

ATtiny861

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

Tamao en bits

Rango

Char

127

Unsigned char

255

signed char

127

Int

16

32767

short int

16

32767

Unsigned int

16

65535

signed int

16

32767

long int

32

2147483647

Unsigned long int

32

4294967295

signed long int

32

2147483647

Float

32

1.75 e 3.402 e 38

Double

32

1.75 e 3.402 e 38

TiposdeDatos
Variable o constante

Formato

Decimal

Nmero

Hexadecimal

0x nmero hexadecimal

Binario

0b nmero binario

Octal

0 nmero octal

Caracter

Cadena

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

void func(char x){


PORTB = x;
}

func_by_val(a);

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);

// 4 MHz

Maxretardo:768us/F_CPUenMHz

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

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

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

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

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"

//otherfile.h
#ifndef otherfile_h
#define otherfile_h
char tc(char);

int main(void){
char x;
x = tc('B');
PORTB = x;
return 0;
}

#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