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 cdigodemicro
AT90CAN128 c128
AT90PWM2 pwm2
AT90PWM3 pwm3
AT90S1200 1200
AT90S2313 2313
AT90S2333 2333
AT90S2343 (*) 2343
AT90S4414 4414
AT90S4433 4433
AT90S4434 4434
AT90S8515 8515
AT90S8535 8535
AT90USB646 usb646x
AT90USB647 usb647x
AT90USB1286 usb1286x
AT90USB1287 usb1287x
ATmega103 m103
ATmega128 m128
ATmega1280 m1280
ATmega1281 m1281
ATmega16 m16
ATmega161 m161
ATmega162 m162
ATmega163 m163
ATmega164 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 AmbientedeDesarrollo
Compilador(Compiler) Integrado(IDE)
Enlazador(Linker) Interfaceparalos
comandosbasicos
Cargador(Loader)
Depurador(Debugger)
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; // Es una variable entera sin signo que
llamamos var1
TiposdeVariables
Tipo Tamao en bits Rango
Char 8 127
Unsigned char 8 255
signed char 8 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 a

Cadena esta es una cadena

x=20; // x es 20 decimal
x=0x14; //x es 14 hexadecimal que convertido a decimal es 20 decimal
x=0b00010100; //x se manejado en binario que es equivalente a 20 decimal
x=024; //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 void func(char x){
PORTB = x;
valor }
func_by_val(a);
Sepuedepasaryrecibirla
direcciondeldato,dandopor
resultadolallamadapor void func(char * x){
*x = '$';
referencia }
char a;
func_by_ref(&a);
Cadenas
Lascadenassonimplementadasenarreglosde
caracteres
char p[6]; //noinicializada p ?? ?? ?? ?? ?? ??
char q[6] = "Joe";
//Usa4delos6bytes q
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 // 4 MHz
#include <avr/delay.h>
_delay_us(93); Numero de interacciones
Maxretardo:768us/F_CPUenMHz de lazo (para implementar
_delay_ms(10); el retardo) esta basado en
Maxretardo:262.14ms/F_CPUinMHz. la velocidad del
procesador
_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 //otherfile.h
#include <avr/io.h> #ifndef otherfile_h
#include #define otherfile_h
"otherfile.h"
char tc(char);
int main(void){
char x; #endif
x = tc('B');
PORTB = x;
return 0;
}
DosArchivosenC
//otherfile.c Elarchivodecabeceraes
#include <avr/io.h> incluidodondesea
#include "otherfile.h" declarado,yydondesea
definido
//toggle case Elcompiladorpuedechecarel
char tc(char x){ usoydeclaracionpara
return x ^ _BV(5); 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, Losarchivosenensamblador
uint8_t data) requierenlaextension.S
.global show Usaelestilodearchivosde
;args: portaddr R25:R24 cabeceraenC
; data R22
Declaraelpuntode
show:
entrada(nombredelafuncion)
;tc needs its argument in R24
comoglobaldemeneraqueel
push r25 ;save port address
programaenCpuedaverla
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
CyEnsamblador
//mainfile.c
Elprototipoesagregadoa
#include<avr/io.h> mainparalacompilacion
#include"otherfile.h"
voidshow(volatileuint8_t*port,
char);

intmain(void){
charx='Z';
show(&PORTB,x);
show(&PORTC,'a');
return0;
}
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