Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Microcontroladores
Curso Microcontroladores
FamiliaAVR
TINYAVR 8 32pin,microcontroladoresdeproposito general 16miembrosdelafamilia MEGAAVR 32 100pin,microcontroladoresdeproposito general 23miembrosdelafamilia ASSPAVRs USB,CANyLCD ControlMotoreiluminacion Automotriz AdministraciondeBaterias 8miembrosdelafamilia
ArquitecturaAVR
ArquitecturaRISCconconjuntode instruccionesCISC ConjuntodeInstruccionespoderosoparaCy ensamblador Escalables MismoNucleopoderosoentodoslos dispositivosAVR Execucionenunsolociclo Unainstruccionporrelojexterno Consumodepotenciabaja 32registrosdetrabajo TodosconectadosdirectamentealaALU! Nucleo(core)muyeficiente 20MIPS@20MHz Altoniveldeintegracion Costodelsistematotalbajo
Solucionenunsolocircuito integrado
ATMEGA48
Caracteristicas
Encapsulados
PDIP
Diagrama de Bloques
Variantes
ProgramacionusandoAVRDUDE
En una ventana de MSDOS introducir la siguiente linea de comando:
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
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
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 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 }
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:
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; }
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 = # //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; }
Cadenas
Lascadenassonimplementadasenarreglosde caracteres
char p[6]; //noinicializada p ?? ?? ?? ?? ?? ?? char q[6] = "Joe"; q //Usa4delos6bytes 4A 6F 65 00 ?? ??
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); }
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
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