Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Microcontroladores Atmel AVR PDF
Curso Microcontroladores Atmel AVR PDF
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
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
Caracter a
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:
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:
+ Suma
- Resta
* Multiplicacin
/ Divisin
| OR bit a Bit
== 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
if (Var1==10)
Var1=0;
else if (Var1==09)
Var1=1;
else if (Var1==08)
Var1=2;
else
Var1=3;
Estructurawhile
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
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
}
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
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);
Elarchivoenlenguaje
ensambladoresagregadoal
listadodearchivosdelproyecto
ElcomandoBuildensamblaray
compilaralosarchivos
requeridos
Cadaunidadproduceunarchivo
objeto
Solamenteunarchivohexes
producido