Sei sulla pagina 1di 42

SISTEMAS EMBEBIDOS COLABORATIVO 2

1
TRABAJO COLABORATIVO 2
SISTEMAS EMBEBIDOS
GRUPO: 208006_3
TUTOR:
OSCAR IVAN VALDERRAMA
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
NOVIEMBRE 2013
SISTEMAS EMBEBIDOS COLABORATIVO 2
2
INTRODUCCIN
Este trabajo nos permiti implementar los conocimientos adquiridos en la unidad
2, teniendo en cuenta que para la creacin de programa en lenguaje de bajo
nivel se requiere seguir cinco pasos: Diseo del algoritmo, codificacin del mismo,
su traduccin a lenguaje mquina, la prueba del programa y la depuracin. En la
etapa de diseo se plantea el problema a resolver y se propone la mejor solucin,
creando diagramas esquemticos utilizados para el mejor planteamiento de la
solucin.
La codificacin del programa consiste en escribir el programa en algn lenguaje
de programacin (en este caso en ensamblador 8086), tomando como base la
solucin propuesta en el paso anterior. La traduccin al lenguaje mquina es la
creacin del programa objeto, esto es, el programa escrito como una secuencia
de ceros y unos que pueda ser interpretado por el procesador. La prueba del
programa consiste en verificar que el programa funcione sin errores, o sea, que
haga lo que tiene que hacer. La ltima etapa es la eliminacin de las fallas
detectadas en el programa durante la fase de prueba. La correccin de una falla
normalmente requiere la repeticin de los pasos comenzando desde el primero o
el segundo.
El lenguaje C es denominado como un lenguaje de nivel medio, ya que combina
elementos de lenguajes de alto nivel (Fortran, Pascal, Basic...) los ms conocidos
con el funcionalismo del lenguaje ensamblador
SISTEMAS EMBEBIDOS COLABORATIVO 2
3
INDICE
FASE 1 ASEMBLER
COMO PROGRAMAR MICROCONTROLADORES..3
LOS REGISTROS..6
FASE 2. SOFTWARE CODEWARROR
PLANTEAMIENTO DE PRCTICA. 10
FASE 3. PROGRAMACN EN C
CMO PROGRAMAR MICROCONTROLADORES MICROPROCESADORES EN
C..12
CREACIN DE PROECTOS EN C.2!
CONCLUSIONES..32
BIBLIOGRA"IA..32
SISTEMAS EMBEBIDOS COLABORATIVO 2
4
Fase 1. Assembler
COMO PROGRAMAR MICROCONTROLADORES
Usaremos el microcontrolador pic 16f84 Hay diversas formas de programar el PC,
- usando BASC, C, o Lenguaje Ensamblador. Trabajaremos sobre el Lenguaje
Ensamblador
1. Revisar los pines del 16f84
dentificacin de pines
RA0 # RA$
RA es un puerto bidireccional. Eso quiere decir que puede ser configurado
como entrada o como salida. El nmero que hay despus de RA indica el
nmero de bit (0 a 4). Por tanto, tenemos un puerto bidireccional de 5 bits
donde cada bit puede ser configurado como entrada o como salida.
RB0 # RB!
RB es un segundo puerto bidireccional. Se comporta exactamente de la
misma manera que RA, excepto que este tiene 8 bits
SISTEMAS EMBEBIDOS COLABORATIVO 2
5
VSS % VDD
Estos son los pins de alimentacin. VDD es la alimentacin positiva, y VSS es el
negativo de la alimentacin, o 0 Voltios. La tensin mxima de alimentacin que
puedes utilizar son 6 Voltios, y el mnimo son 2 Voltios.
OSC1&CL' IN % OSC2&CL'OUT
Estos pines son donde conectaremos el reloj externo, para que el microcontrolador
disponga de algn tipo de temporizacin.
MCLR
Este pin se utiliza para borrar las posiciones de memoria dentro del PC (p.ej.
cuando quiero reprogramarlo). Durante el funcionamiento normal est conectado a
la alimentacin positiva.
INT
Este es un pin de entrada que puede ser monitorizado. Si el pin se pone a nivel
alto, podemos hacer que el programa se reinicie, se pare o cualquier otra funcin
de deseemos. No lo utilizaremos mucho.
TOC'1
Esta es otra entrada de reloj, que opera con un temporizador interno. Opera
aisladamente del reloj principal. De nuevo, este tampoco lo utilizaremos mucho.
2. Hay que tener el programador, el cual se conecta al computador, el pic
16f84 , el software MPLAB que convertir el programa que escribas en un
formato que el PC comprende
SISTEMAS EMBEBIDOS COLABORATIVO 2
6
Esquema de conexin de voltage
La lnea de alimentacin est puesta a 6 Voltios, que es el mximo voltaje para el
PC. Puedes utilizar cualquier voltaje inferior, hasta un mnimo de 2 Voltios. C3 es
conocido como un condensador de 'bypass'. Todo lo que se hace C3 es reducir el
SISTEMAS EMBEBIDOS COLABORATIVO 2
7
ruido de la lnea de alimentacin. X1 es un cristal de 4 MHz. Puedes utilizar un
circuito RC (resistencia y condensador) (Nota de edicin: crear enlace aqu), pero
el precio del cristal es insignificante, y es ms estable. C1 y C2 ayudan a reducir
cualquier desviacin en la oscilacin cristal, y a eliminar cualquier ruido no
deseado antes de que la seal llegue al PC.
Tcnicas para programar bien.
Si escribes un; (punto y coma) en cualquier punto de tu programa, el
compilador ignorar cualquier cosa que haya detrs de l, hasta llegar al
retorno de carro. Esto significa que podemos aadir comentarios a nuestro
programa que nos recuerden que estbamos haciendo en ese punto.
Puedes asignar nombres a las constantes va los registros ya que puedes
entender lo que ests haciendo, utiliza nombres como CONTADOR
colocndolo en maysculas que indica que es una constante
Aade algn tipo de cabecera en tus programas utilizando el punto y la
coma. Un ejemplo sera algo as:
Usa o bien diagramas de flujo o bien algoritmos, Esto ayuda a escribir tu
programa paso a paso.
LOS REGISTROS
Un registro es un lugar dentro del PC que puede ser escrito, ledo o ambas
cosas. La figura de ms abajo muestra el mapa de registros del interior del
PC16F84. Este muestra donde estn los diferentes bits y piezas dentro del
PC, y nos ayudar a explicar unos cuantos comandos.
SISTEMAS EMBEBIDOS COLABORATIVO 2
8
MAPA DE REGSTROS
SISTEMAS EMBEBIDOS COLABORATIVO 2
9
magen bajada de:
!!":##$%&%.$eb'ear'e.()m#%*'e+."",
!%!le-Ar(%.):/IC10F123Ma"a'eRe4%s!r)s.5"4
Este est dividido en dos - Banco 0 y Banco 1. El Banco 1 es utilizado para
controlar las propias operaciones del PC, por ejemplo para decirle al PC cuales
bits del Puerto A son entradas y cuales son salidas. El Banco 0 se utiliza para
SISTEMAS EMBEBIDOS COLABORATIVO 2
10
manipular los datos. Un ejemplo es el siguiente: Digamos que queremos poner un
bit del puerto A, a nivel alto. Lo primero que necesitamos hacer es ir al Banco 1
para poner ese bit o pin en particular en el puerto A como salida. Despus
volvemos al Banco 0 y enviamos un 1 lgico a ese pin.
Los registros que vamos a usar ms comunes en el Banco 1 son STATUS, TRSA
y TRSB. El primero permite volver al Banco 0, TRSA nos permite establecer los
pines que sern entradas y los que sern salidas del Puerto A, TRSB nos permite
establecer los pines que sern entradas y los que sern salidas del puerto B.
STATUS
Para cambiar del Banco 0 al Banco 1 utilizamos el registro STATUS. Hacemos
esto poniendo el bit 5 del registro STATUS a 1. Para cambiar de nuevo al Banco 0,
ponemos el bit 5 del registro STATUS a 0. El registro STATUS se localiza en la
direccin 03h (la 'h' significa que el nmero es hexadecimal).
TRISA y TRISB
Estn localizados en las direcciones 85h y 86h respectivamente. Para programar
que un pin sea una salida o una entrada, simplemente enviamos un 0 o un 1 al bit
en cuestin en el registro. Ahora, podemos hacer esto ya sea en binario o en
hexadecimal. Personalmente uso ambos, ya que la binaria ayuda mucho a
visualizar el puerto. Si no ests familiarizado con el paso de binario a hexadecimal
y viceversa, utiliza una calculadora cientfica.
Entonces en el puerto A tenemos 5 pines, por tanto 5 bits. Si deseamos poner uno
de los pines como entrada, enviamos un 1 al bit en cuestin. Si deseamos poner
uno de los pines como salida, ponemos un 0 en ese bit. Los bits estn definidos de
manera correspondiente con los pines, en otras palabras el bit 0 es el RA0, el bit 1
es el RA1, el bit 2 es el RA2, y as sucesivamente. Vamos a tomar un ejemplo. Si
queremos poner RA0, RA3 y RA4 como salidas, y RA1 y RA2 como entradas,
enviamos esto: 00110 (06h). Date cuenta de que el bit cero est a la derecha,
como se muestra aqu:
Pin del Puerto A RA4 RA3 RA2 RA1 RA0
Numero de bit 4 3 2 1 0
SISTEMAS EMBEBIDOS COLABORATIVO 2
11
Valor Binario 0 0 1 1 0
Lo mismo se aplica para TRSB.
PORTA % PORTB
Para poner uno de nuestros pines de salida a nivel alto, simplemente ponemos un
1 el bit correspondiente en nuestro registro PORTA o PORTB. El formato es el
mismo que para los registros TRSA y TRSB. Para leer si un pin est a nivel alto o
nivel bajo en los pines de nuestro puerto, podemos ejecutar un chequeo para ver
si el bit en particular correspondiente esta puesto a nivel alto (1) o est puesto a
nivel bajo (0).
Antes de dar un ejemplo de cdigo, tenemos que explicar dos registros ms
- ( y ".
(
El registro ( es un registro de propsito general al cual le puedes asignar
cualquier valor que desees. Una vez que has asignado un valor a ese registro,
puedes sumarle cualquier otro valor, o moverlo. Si le asignas otro valor a W, su
contenido es sobrescrito.
U) *+*,-./ 0* 12034/
Vamos a darte un ejemplo de cdigo sobre lo que acabamos de aprender. No
intentes compilar esto todava, lo haremos cuando hagamos nuestro primer
programa. Simplemente estamos intentado mostrar como se hace la programacin
de lo anterior y de paso presentando un par de instrucciones. Vamos a poner el
Puerto A como en el ejemplo anterior.
Lo primero, necesitamos cambiar del banco 0 al banco 1. Hacemos esto
modificando el registro STATUS, que est en la direccin 03h, poniendo el bit 5 a
1.
BSF 03h,5
La instruccin BSF significa en ingles "Bit Set F" (Poner a 1 un bit de la Memoria).
La letra " significa que vamos a utilizar una posicin de memoria, o un registro en
memoria. Vamos a utilizar dos nmeros despus de esta instruccin - 03h, el cual
SISTEMAS EMBEBIDOS COLABORATIVO 2
12
se refiere a la direccin del registro STATUS, y el nmero 5 que corresponde al
nmero de bit. Por tanto, lo que estamos diciendo es "pon a 1 el bit 5 de la
direccin de memoria 03h".
Ahora ya estamos en el banco 1.
MOVLW b'00110'
Estamos poniendo el valor binario 00110 (la letra 'b' significa que el nmero est
en binario) en nuestro registro de propsito general W. Podramos haber hecho
esto en hexadecimal, en cuyo caso nuestra instruccin hubiese sido:
MOVLW 06h
Cualquiera de las dos funcionar. La instruccin MOVLW significa en ingles "Move
Literal Value into W", en castellano, mover un valor literal directamente al registro
W.
Ahora necesitamos poner este valor en el registro TRSA para configurar el puerto:
MOVWF 85h
Esta instruccin significa "poner los contenidos de W en el registro cuya direccin
viene a continuacin", en este caso la direccin 85h, que apunta a TRSA.
Nuestro registro TRSA ahora tiene el valor 00110 o mostrado grficamente :
Pin del Puerto A RA4 RA3 RA2 RA1 RA0
Valor Binario 0 0 1 1 0
Entrada/Salida S S E E S
Ahora tenemos que configurar los pines del Puerto A, y para ello necesitamos
volver al banco 0 para manipular cualquier dato.
BCF 03h,5
Esta instruccin hace lo contrario a BSF. Significa en ingles "Bit Clear F" (en
castellano, poner a 0 un bit de la memoria). Los dos nmeros que le siguen son la
SISTEMAS EMBEBIDOS COLABORATIVO 2
13
direccin del registro, en este caso del registro STATUS, y el nmero de bit, es
este caso el 5. As que lo que hemos hecho ahora es poner a 0 el bit 5 del registro
STATUS.
Ya estamos de vuelta en el Banco 0.
Aqu est el cdigo en un solo bloque:
BSF 03h,5 ; Ve al banco 1
MOVLW 06h ; Pon 00110 en W
MOVWF 85h ; Mueve 00110 a TRIS
B!F 03h,5 ; Vuelve al Banco 0
C/,/ *5163736 *) ./5 -8*69/5
B81.*5 0* 6*9#60/
El principio para retardo es el de contar hacia atrs desde un nmero previamente
establecido y cuando llegue a cero, paramos de contar. El valor cero indica el fin
del retardo y continuamos nuestro camino a travs del programa.
S876893)#5
Una subrutina es una seccin de cdigo o programa, que puede ser llamada como
y cuando la necesites. Las subrutinas se usan si vas a ejecutar la misma funcin
funcin ms de una vez, por ejemplo para crear un retardo. Las ventajas de utilizar
una subrutina son que har ms sencillo modificar el valor una vez dentro de la
subrutina antes que, digamos, hacerlo diez veces a travs de tu programa. Y
tambin te ayudar a reducir el total de memoria que ocupa tu programa dentro
del PC.
C/,/ .**6 -8*69/5 0* *)96#0# % 5#30# E&S
Esto es para que podamos conectar un circuito externo y actuar sobre cualquier
salida que este nos d.
SISTEMAS EMBEBIDOS COLABORATIVO 2
14
para configurar los puertos de E/S, tenemos que cambiarnos del Banco 0 al Banco
1. Hagamos eso primero:
STATUS equ 03h ; Direccin del registro STATUS
TRSA equ 85h ; Direccin del registro tri-estado para el Puerto A.
PORTA equ 05h ; Direccin del Puerto A.
bsf STATUS,5 ; Cambia al Banco 1.
Ahora, para configurar el pin de un puerto para que sea una salida, enviamos un 0
al registro TRSA. Para poner el pin como entrada, ponemos un 1 en el registro
TRSA.
movlw 01h ; Para configurar el pin 0 del Puerto A...
movwf TRSA ; ... como entrada.
bcf STATUS,5 ; Vuelve al Banco 0.
Ahora hemos puesto el bit 0 del puerto A como entrada. Lo que necesitamos hacer
ahora es comprobar si el pin est a nivel alto o a nivel bajo. Para ello, podemos
usar una de estas dos instrucciones: BTFSC y BTFSS.
La instruccin BTFSC significa "Haz una comprobacin de bit en el registro y bit
que especificamos. Si es un 0, entonces sltate la siguiente instruccin".
La instruccin BTFSS significa "Haz una comprobacin de bit en el registro y bit
que especificamos. Si es un 1, entonces sltate la siguiente instruccin".
La que usemos depender de como queramos que nuestro programa reaccione
cuando lea la entrada. Por ejemplo, si simplemente estamos esperando que la
entrada sea 1, entonces podramos utilizar la instruccin BTFSS de este modo:
;Aqu el cdigo
:
BTFSS PortA,0
Goto nicio
;Continua por aqu
:
:
SISTEMAS EMBEBIDOS COLABORATIVO 2
15
El programa solo se mover hacia 'Continua por aqu' si el bit 0 del puerto A se
pone a 1.
Vamos ahora a escribir un programa con el que el LED parpadear a una
velocidad, pero si un conmutador[Nota de la traduccin: en ingles el trmino
original es "switch"] se cierra, parpadear a la mitad de velocidad. Seguramente
puedas hacer el programa por ti mismo, pero hemos incluido el listado de todos
modos. Podras probar a escribir el programa completo, solo para ver si has
comprendido los conceptos. Estamos usando el mismo circuito que antes, con un
conmutador aadido al pin RA0 del PC y a la linea de alimentacin positiva.
;***** Establecimiento constantes ****
STATUS equ 03h ; Direccin del registro STATUS
TRSA equ 85h ; Direccin del registro tri-estado para el Puerto A.
PORTA equ 05h ; Direccin del Puerto A.
CONTADOR1 equ 08h ; Primer contador para nuestros bucles de
retardo.
CONTADOR2 equ 09h ; Segundo contador para nuestros bucles de
retardo.
;
;**** Configuracin del Puerto ****
bsf STATUS,5 ; Cambiamos al Banco 1
movlw 01h ; Ponemos los pines del puerto A ...
movwf TRSA ; ...el bit 1 como salida, el bit 0 como entrada.
bcf STATUS,5 ; Volvemos al Banco 0.
;
;**** Encendemos del LED ****
nicio movlw 02h ; Encendemos el LED poniendo primero el valor...
movwf PORTA ; ... en el registro w y despus al puerto
;
;**** Comprobamos si el conmutador est cerrado ****
btfsc PORTA,0 ; Tomamos el valor del bit 0 del puerto A y
comprobamos si es 0.
; Si es 0, sltate la siguiente instruccin y continua
normalmente.
call Retardo ; Si es 1, ejecuta esta instruccin aadiendo un
retardo extra.
;
;**** Aade un retardo
SISTEMAS EMBEBIDOS COLABORATIVO 2
16
call Retardo
;
;**** Retardo terminado, ahora apagamos el LED ****
movlw 00h ; Apaga el LED poniendo primero el valor ...
movwf PORTA ; ... en el registro w y despus al puerto
;
;**** Comprobamos si el conmutador est todava cerrado ****
btfsc PORTA,0 ; Tomamos el valor del bit 0 del puerto A y
comprobamos si es 0.
; Si es 0, saltate la siguiente instruccin y continua
normalmente.
call Retardo ; Si es 1, ejecuta esta instruccin aadiendo un
retardo extra.
;
;**** Aadimos otro retardo ****
call Retardo
;
;**** Ahora volvemos al inicio del programa
goto nicio ; Vuelve al principio y enciende el LED...
; ...de nuevo.
;
;**** Aqu est nuestra Subrutina
Retardo
Bucle1 decfsz CONTADOR1,1 ; Este segundo bucle mantiene el LED...
goto Bucle1 ; ...apagado el tiempo suficiente...
decfsz CONTADOR2,1 ; ...para que lo veamos
goto Bucle1 ;
return
;
;**** Fin del Programa****
end ; Algunos compiladores necesitan esta instruccin,
; y tambin por si acaso olvidamos poner...
; ... la instruccin 'goto'.
Lo que hemos hecho aqu es encender el LED. Despus comprobar si el
conmutador est cerrado. Si est cerrado, entonces hacemos una llamada a
nuestra subrutina de retardo. Esto nos da el mismo retardo que anteriormente,
pero ahora la estamos llamando dos veces. Lo mismo pasa cuando el LED est
SISTEMAS EMBEBIDOS COLABORATIVO 2
17
apagado. Si el conmutador no est cerrado, entonces tenemos nuestros tiempos
de encendido y apagado como antes.
Puedes compilar y ejecutar este programa. Sin embargo, una nota de advertencia:
El circuito final y el cdigo puede resultar irrelevante para alguien que no le
interese programar microcontroladores. Por tanto, no te enfades si cuando
ensees el circuito a tu familia y amigos sobre como puedes cambiar la velocidad
de parpadeo de un LED, ves que no muestran ni el mas mnimo inters
Hablamos desde nuestra experiencia personal !
Si has ido siguiendo estos captulos desde el comienzo, puede que te interese
saber que ahora llevas aprendidas 10 de 35 instrucciones para el PC 16F84 ! Y
todas ellas las has aprendido simplemente con el encendiendo y apagando de un
LED.
Hasta ahora hemos hecho que el PC haga parpadear un LED. Despus fuimos
capaces de interactuar con nuestro PC aadiendo un conmutador, para modificar
el ritmo de parpadeo. El nico problema es que el programa es muy largo y
desperdicia mucha memoria. Era aceptable ya que introducamos comandos por
primera vez, pero debe existir una manera mejor de hacerlo. Bueno, la hay (sabias
que la haba, verdad? ).
Vamos a examinar como estbamos haciendo el parpadeo del LED realmente.
movlw 02h
movwf PORTA
movlw 00h
movlw PORTA
Primero cargamos nuestro registro w con 02h, despus lo pusimos en nuestro
registro del puerto A para encender el LED. Para apagarlo, cargamos w con 00h y
despus lo pusimos en nuestro registro del puerto A. Entremedias de estas rutinas
tenamos que llamar a una subrutina para que pudiramos ver el LED parpadear.
As que hemos tenido que mover dos conjuntos de datos dos veces (una vez al
registro w y despus al PORTA) y llamar a la subrutina dos veces (una vez para el
encendido y otra para el apagado).
As que, cmo podemos hacer esto de una manera mas eficiente ? Sencillo.
Utilizamos otra instruccin llamada XORWF.
SISTEMAS EMBEBIDOS COLABORATIVO 2
18
La instruccin XORWF ejecuta una funcin OR Exclusiva entre el registro w y el
registro que le pasamos como dato. Ser mejor que expliquemos que narices es
una OR Exclusiva antes de continuar. [Nota de la traduccin: Tambin llamada
funcin XOR simplemente]
Si tenemos dos entradas, y una salida, la salida solo ser 1 si, y solo si, las dos
entradas son diferentes. Si son iguales, la salida ser 0. Aqu est la tabla de
verdad, para aquellos que prefieran verlo en una tabla:
A B Salida
0 0 0
0 1 1
1 0 1
1 1 0
Vamos a ver que ocurre si hacemos que B tome el valor de salida anterior, y
simplemente cambiamos el valor de A:
A B Salida
0 0 0
1 0 1
1 1 0
1 0 1
Si mantenemos el valor de A igual a 1, y hacemos OR exclusiva entre l y el valor
de la salida anterior, la salida resultante conmuta. Para los que no lo vean de este
modo en la tabla de verdad, aqu est utilizando binario:
Valor de salida actual => 0
OR-Ex con l y con 1 => 1 ; 1 es el nuevo valor de salida.
OR-EX con l y con 1 => 0 ; 0 es el nuevo valor de salida.
OR-Ex con l y con 1 => 1 ; 1 es el nuevo valor de salida.
.... as sucesivamente.
Espero que puedas entender que haciendo OR exclusiva de una salida con un 1,
lo que estamos haciendo ahora es conmutar de 0 a 1 a 0, etc...
SISTEMAS EMBEBIDOS COLABORATIVO 2
19
As que ahora, para encender y apagar nuestro LED, necesitamos solo dos lineas:
MOVLW 02h
XORWF PORTA,1
Lo que estamos haciendo aqu es cargar nuestro registro w con 02h. Despus le
hacemos una OR exclusiva a este nmero que hay en w con lo que quiera que
est en nuestro registro del puerto A. Si el bit 1 es 1, cambiar a 0. Si el bit 1 es 0,
cambiar a 1.

SISTEMAS EMBEBIDOS COLABORATIVO 2
20
"#5* 2. S/:9;#6* C/0*(#663/6
1. Abrimos el programa
2. Nos muestra la siguiente ventana en la cual seleccionamos crear nuevo
proyecto.
3. Seleccionamos el microcontrolador a emplear, y luego damos clic en
siguiente
4. Seleccionamos en la siguiente ventana el lenguaje de programacin a
emplear y el directorio en el cual vamos a guardar el programa.
SISTEMAS EMBEBIDOS COLABORATIVO 2
21
5. Luego damos clic en finalizar y nos mostrara la ventana principal del
programa CodeWarrior en la cual vamos a desarrollar nuestro programa
6. Escribimos nuestro programa en la etiqueta mainLoop
SISTEMAS EMBEBIDOS COLABORATIVO 2
22
7. Luego de escribir el programa damos clic en make y luego en debug si no
tenemos errores en el programa nos mostrara la ventana de simulacin.
Fase 3. Programacin en C
SISTEMAS EMBEBIDOS COLABORATIVO 2
23
P6/46#,#132) *) C
C es un lenguaje de alto nivel, ciertamente es como aprender a hablar de un nuevo
idioma, para este tipo de lenguaje, si en un cdigo de 100 lneas olvidamos una sola
coma, al momento de realizar la compilacin el sistema me arrojara errores
Estructura de un programa en C
A continuacin tomaremos el siguiente ejemplo con un compilador AVR AR C & AVR
GCC (WinAVR
/************************************************************************
* FileName: main.c
* Purpose: LED parpadeantwe
* Processor: ATmel AVR
* Compiler: AVR AR C & AVR GCC (WinAVR)
* Author: Shawn Johnson. http://www.cursomicros.com.
************************************************************************
#include "avr_compiler.h"
//****************************************************************************
// delay_ms
//****************************************************************************
void delay_ms(unsigned int t)
{
while(t--)
delay_us(1000);
}
//****************************************************************************
// Funcin principal
//****************************************************************************
int main(void)
{
DDRB = 0x01; // Configurar pin PB0 como salida

for( ;; )
{
PORTB |= 0x01; // Poner 1 en pin PB0
delay_ms(400); //
PORTB &= 0xFE; // Poner 0 en pin PB0
delay_ms(300);
}
}
SISTEMAS EMBEBIDOS COLABORATIVO 2
24
Este programa configura un PN PB0 de nuestro microcontrolador de salida y luego lo
limpia la informacin suministrada, y continua realizando esta operacin ciclicamente
A continuacin veremos lo que en C es ms notable para comenzar a programar:
COMENTARIOS:
Son los encargados de documentar es todo lo que escribimos despus de // y todo lo que
est entre /* y */, generalmente se encuentran de color verde.
A continuacin veremos un ejemplo:
// Comentario simpl
/* si queremos comentar algo que ocupe varias lneas lo que podemos hacer es
comentarlas de esta forma */
LAS SENTENCIAS
En C, una sentencia podramos llamarlo asi, es una Mama, hace lo que varias
instrucciones hacen en un ensamblador, una sentencia debe finalizar con un (;), que
tambin nos sirven para separar sentencias, estas a su vez se pueden clasificar en varios
tipos de sentencias como: sentencias de asignacin, sentencias selectivas, iterativas
A continuacin veremos un ejemplo:
//***********************************************************************
nt main (void) { DDRB= 0X01; FOR(;;) PORT = 0X01; DELAY MS(400);}}
BLOQUES
Delimita el cuerpo y las funsiones de algunas sentencias ({}), como lo pudimos observar
en el ejemplo de arriba
DIRECTIVAS:
Son evaluadas antes de compilar el programa, suelen ser indicaciones de cmo se
compilara el programa
"UNSIONES:
En C pueden existir las funciones que sean posibles, pero hay funciones que son mucho
ms potentes que otras, una de ellas es (main)
VARIABLES TIPOS
SISTEMAS EMBEBIDOS COLABORATIVO 2
25
En el esamblador todas las variables de porgrama suelen ser registros de RAM crudos,
es decir datos de 8 bits sin formato. Forman parte de los signos de datos bsicos.
Pueden almacenar incluso matrices de datos del mismo tipo llamadas estructuras
A continuacin veremos los principales tipos de datos en lenguaje C
DECLARACIN DE VARIABLES
Compara las variables del ensamblador con la directiva .def no se puede usar una
variable si antes esta no ha sido declarada
Esta se realiza de la siguiente forma:
Data type myvar;
Donde data type es un tipo de dato basico o complejo, del compilador o definido por el usuario myvar es un
identificador cualquiera.
A continuacin veremos algunos ejemplos:
Tabla 'e .ar%ables 6 !%")s 'e 'a!)s 'el le*47a5e C
T%") 'e 'a!)
Tama8) e*
b%!s
Ra*4) 'e .al)res 97e
"7e'e a')"!ar
cha 8 0 a 255 ! "128 a 127
#$%&'( cha 8 "128 a 127
)&#$%&'( cha 8 0 a 255
*#$%&'(+ $&, 16 "32-768 a 32-767
)&#$%&'( $&, 16 0 a 65-536
*#$%&'(+ #h!, 16 "32-768 a 32-767
)&#$%&'( #h!, 16 0 a 65-536
*#$%&'(+ .!&% 32
"2-147-483-648 a
2-147-483-647
)&#$%&'( .!&% 32 0 a 4-294-967-295
*#$%&'(+ .!&% .!&%
*$&,+
64 "2
63
a 2
63
" 1
)&#$%&'( .!&% .!&%
*$&,+
64 0 a 2
64
" 1
/.!a, 32 01118E"38 a 03139E238
(!)3.' 32 01118E"38 a 03139E238
SISTEMAS EMBEBIDOS COLABORATIVO 2
26

Unsigned char d; // variables para 8 enteros de
bits sin signo
LA SENTENCIA I"
La sentencia if (si condicional, en ingls) hace que un programa ejecute una sentencia o
un grupo de ellas si una expresin es cierta. Esta lgica se describe en el siguiente
esquema.
Diagrama de flujo de la sentencia if.
La forma codificada sera as:
sentenciaA;
if ( expression ) // Si expression es verdadera,
// ejecutar el siguiente bloque
{ // apertura de bloque
sentenciaB;
sentenciaC;
// algunas otras sentencias
} // cierre de bloque
sentenciaX;
Despus de ejecutar sentencia el programa evala expression. Si resulta ser verdadera,
se ejecutan todas las sentencias de su bloque y luego se ejecutar la sentenciaX.
En cambio, si expression es falsa, el programa se saltear el bloque de if y ejecutar
sentenciaX.
LA SENTENCIA I" < ELSE
SISTEMAS EMBEBIDOS COLABORATIVO 2
27
La sentencia if brinda una rama que se ejecuta cuando una condicin lgica es verdadera.
Cuando el programa requiera dos ramas, una que se ejecute si cierta expression es cierta
y otra si es falsa, entonces se debe utilizar la sentecia if else. Tiene el siguiente
esquema.
D3#46#,# 0* :.8+/ 0* .# 5*)9*)13# 3: *.5*.
Expresando lo descrito en cdigo C, tenemos: (Se lee como indican los comentarios.)
SentenciaA;
if ( expression ) // Si expression es verdadera, ejecutar
{ // este bloque
sentenciaB;
sentenciaC;
// ...
}
else // En caso contrario, ejecutar este bloque
{
sentenciaM;
sentenciaN;
// ...
}
sentenciaX;
// ...
Como ves, es bastante fcil, dependiendo del resultado se ejecutar uno de los dos
bloques de la sentencia if else, pero nunca los dos a la vez.
La sentencia if else if escalonada
Es la versin ampliada de la sentencia if else.
En el siguiente boceto se comprueban tres condiciones lgicas, aunque podra haber
ms. Del mismo modo, se han puesto dos sentencias por bloque solo para simplificar el
esquema.
S'&,'&c$aN
#'&,'&c$aM
SENTENCIA B
SENTENCIA C
SISTEMAS EMBEBIDOS COLABORATIVO 2
28
if ( expression_1 ) // Si expression_1 es verdadera ejecutar
{ // este bloque
sentencia1;
sentencia2;
}
else if ( expression_2 ) // En caso contrario y si expression_2 es
{ // verdadera, ejecutar este bloque
sentencia3;
sentencia4;
}
else if ( expression_3 ) // En caso contrario y si expression_3 es
{ // verdadera, ejecutar este bloque
sentencia5;
sentencia6;
}
else // En caso contrario, ejecutar este bloque
{
sentencia7;
sentencia8;
}; // ; opcional
// todo...
Las "expresiones se evalan de arriba abajo. Cuando alguna de ellas sea verdadera, se
ejecutar su bloque correspondiente y los dems bloques sern salteados. El bloque final
(de else) se ejecuta si ninguna de las expresiones es verdadera. Adems, si dicho bloque
est vaco, puede ser omitido junto con su else.
LA SENTENCIA S(ITC=
La sentencia switch brinda una forma ms elegante de bifurcacin mltiple. Podemos
considerarla como una forma ms estructurada de la sentencia if else if escalonada,
aunque tiene algunas restricciones en las condiciones lgicas a evaluar, las cuales son
comparaciones de
donde constante1, constante2 y constante3 deben ser constantes enteras, por ejemplo, 2,
0x45, 'a', etc. ('a' tiene cdigo ASC 165, que es, a fin de cuentas, un entero.)
Sentencias iterativas
Las sentencias de control iterativas sirven para que el programa ejecute una sentencia o
un grupo de ellas un nmero determinado o indeterminado de veces. As es, esta seccin
no habla de otra cosa que de los bucles en C.
LA SENTENCIA (=ILE
El cuerpo o bloque de este bucle se ejecutar una y otra vez mientras (while, en ingls)
una expresin sea verdadera.
SISTEMAS EMBEBIDOS COLABORATIVO 2
29
DIAGRAMA DE "LUJO DE LAS SENTENCIA (=ILE.
El bucle while en C tiene la siguiente sintaxis y se lee as: mientras (while) expression sea
verdadera, ejecutar el siguiente bloque.
sentenciaA;
while ( expression ) // Mientras expression sea verdadera, ejecutar el
// siguiente bloque
{
sentenciaB;
sentenciaC;
// ...
}; // Este ; es opcional
sentenciaX;
// ...
Nota que en este caso primero se evala expression. Por lo tanto, si desde el principio
expression es falsa, el bloque de while no se ejecutar nunca. Por otro lado, si expression
no deja de ser verdadera, el programa se quedar dando vueltas "para siempre.
L# 5*)9*)13# 0/ > ;?3.*
Como dije antes, es una variacin de la sentencia while simple. La principal diferencia es
que la condicin lgica (expression) de este bucle se presenta al final. Como se ve en la
siguiente figura, esto implica que el cuerpo o bloque de este bucle se ejecutar al menos
una vez.
SISTEMAS EMBEBIDOS COLABORATIVO 2
30
Diagrama de flujo de las sentencia do while.
La sintaxis para la sentencia do while es la siguiente y se lee: Ejecutar (do) el siguiente
bloque, mientras (while) expression sea verdadera.
sentenciaA;
do
{
sentenciaB;
sentenciaC;
// ...
} while ( expression ); // Este ; es mandatorio
sentenciaX;
// ...
LA SENTENCIA "OR
Las dos sentencias anteriores, while y do while, se suelen emplear cuando no se sabe
de antemano la cantidad de veces que se va a ejecutar el bucle. En los casos donde el
bucle involucra alguna forma de conteo finito es preferible emplear la sentencia for.
(nversamente, al ver un for en un programa, debemos suponer que estamos frente a
algn bucle de ese tipo.)
sta es la sintaxis general de la sentencia for en C:
for ( expression_1 ; expression_2 ; expression_3 )
{
sentencia1;
sentencia2;
// ...
}; // Este ; es opcional
Ahora veamos por partes cmo funciona:
SISTEMAS EMBEBIDOS COLABORATIVO 2
31
expression_1 suele ser una sentencia de inicializacin.
expression_2 se evala como condicin lgica para que se ejecute el bloque.
expression_3 es una sentencia que debera poner coto a expression_2.
Por la forma y orden en que se ejecutan estas expresiones, el bucle for es equivalente a
la siguiente construccin, utilizando la sentencia while. Primero se ejecuta expression_1 y
luego se ejecuta el bloque indicado tantas veces mientras expression_2 sea verdadera.
expression_1;
while ( expression_2 )
{
sentencia1;
sentencia2;
// ...

expression_3;
}
No obstante, de esa forma se ve ms rara an; as que, mejor, veamos estos ejemplos,
que son sus presentaciones ms clsicas. (i es una variable y a y b son constantes o
variables):
for ( i = 0 ; i < 10 ; i++ )
{
sentencias;
}
Se lee: para (for) i igual a 0 hasta que sea menor que 10 ejecutar sentencias. La
sentencia i++ indica que i se incrementa tras cada ciclo. As, el bloque de for se ejecutar
10 veces, desde que i valga 0 hasta que valga 9.
En este otro ejemplo las sentencias se ejecutan desde que i valga 10 hasta que valga 20.
Es decir, el bucle dar 11 vueltas en total.
for ( i = 10 ; i <= 20 ; i++ )
{
sentencias;
}
El siguiente bucle for empieza con i inicializado a 100 y su bloque se ejecutar mientras i
sea mayor o igual a 0. Por supuesto, en este caso i se decrementa tras cada ciclo.
for ( i = 100 ; i >= 0 ; i-- )
{
sentencias;
}
Se pueden hacer muchas ms construcciones, todas coincidentes con la primera plantilla,
pero tambin son menos frecuentes.
SISTEMAS EMBEBIDOS COLABORATIVO 2
32
Sentencias con bloques simples
Cuando las sentencias selectivas (como if) o de bucles (como while o for) tienen cuerpos
o bloques que constan de solo una sentencia, se pueden omitir las llaves. Aun as, es
aconsejable seguir manteniendo las tabulaciones para evitarnos confusiones.
Por ejemplo, las siguientes sentencias:
if(a > b)
{
a = 0;
}

if(a == b)
{
a++;
}
else
{
b--;
}

while( a >= b)
{
a = a + b;
}

for(i=0; i<=10; i++)
{
a = a*2;
}
bien se pueden escribir de la siguiente forma:
if(a > b)
a = 0;

if(a == b)
a++;
else
b--;

while( a >= b)
a = a + b;

for(i=0; i<=10; i++)
a = a*2;
LOS OPERADORES
SISTEMAS EMBEBIDOS COLABORATIVO 2
33
Sirven para realizar operaciones aritmticas, lgicas, comparativas, etc. Segn esa
funcin se clasifican en los siguientes grupos.
Operadores aritmticos
Adems de los tpicos operadores de suma, resta, multiplicacin y divisin, estn los
operadores de mdulo, incremento y decremento.
Tabla de Operadores aritmticos
Operador Accin
+ Suma
- Resta
* Multiplicacin
/ Divisin
%
Mdulo. Retorna el residuo de una divisin entera. Solo se debe usar con
nmeros enteros.
++ ncrementar en uno
-- Decrementar en uno
Ejemplos:
int a, b, c; // Declarar variables a, b y c
a = b + c; // Sumar a y b. Almacenar resultado en c
b = b * c; // Multiplicar b por c. Resultado en b
b = a / c; // Dividir a entre c. Colocar resultado en b
a = a + c b; // Sumar a y c y restarle b. Resultado en a
c = (a + b) / c; // Dividir a+b entre c. Resultado en c
b = a + b / c + b * b; // Sumar a ms b/c ms bb. Resultado en b
c = a % b; // Residuo de dividir ab a c
a++; // ncrementar a en 1
b--; // Decrementar b en 1
++c; // ncrementar c en 1
--b; // Decrementar b en 1
OPERADORES DE BITS
Se aplican a operaciones lgicas con variables a nivel binario. Aqu tenemos las clsicas
operaciones AND, OR inclusiva, OR exclusiva y la NEGACN. Adicionalmente, he
incluido en esta categora los operaciones de desplazamiento a la derecha y la izquierda.
Si bien son operaciones que producen resultados anlogos a los de las instrucciones de
ensamblador los operadores lgicos del C pueden operar sobre variables de distintos
tamaos, ya sean de 1, 8, 16 o 32 bits.
Tabla de operadores de bits
Operador Accin
& AND a nivel de bits
SISTEMAS EMBEBIDOS COLABORATIVO 2
34
Tabla de operadores de bits
Operador Accin
| OR inclusiva a nivel de bits
^ OR exclusiva a nivel de bits
~ Complemento a uno a nivel de bits
<< Desplazamiento a la izquierda
>> Desplazamiento a la derecha
Ejemplos:
char m; // variable de 8 bits
int
Fjate en la semejanza entre las operaciones de desplazamiento con >> y << y las
operaciones del rotacin del ensamblador. Cuando una variable se desplaza hacia un
lado, los bits que salen por all se pierden y los bits que entran por el otro lado son
siempre ceros. Es por esto que en la ltima sentencia, m = m << 8, el resultado es 0x00.
Por cierto, en el lenguaje C no existen operadores de rotacin. Hay formas alternativas de
realizarlas.
Desplazamientos producidos por los operadores << y >>.
OPERADORES RELACIONALES
Se emplean para construir las condiciones lgicas de las sentencias de control selectivas
e iterativas, como ya hemos podido apreciar en las secciones anteriores. La siguiente
tabla muestra los operadores relacionales disponibles.
Tabla de Operadores relacionales
O-*6#0/6 A1132)
== gual
!= No igual
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
O-*6#0/6*5 .2431/5
SISTEMAS EMBEBIDOS COLABORATIVO 2
35
Generalmente se utilizan para enlazar dos o ms condiciones lgicas simples. Por suerte,
estos operadores solo son tres y sern explicados en las prcticas del curso.
Tabla de Operadores lgicos
O-*6#0/6 A1132)
&& AND lgica
|| OR lgica
! Negacin lgica
Ejemplos:
if( !(a==0) ) // Si a igual 0 sea falso
{
// sentencias
}
if( (a<b) && (a>c) ) // Si a<b y a>c son verdaderas
{
// sentencias
}
while( (a==0) || (b==0) ) // Mientras a sea 0 o b sea 0
{
// sentencias
}
C/,-/53132) 0* /-*6#0/6*5
Se utiliza en las operaciones de asignacin y nos permite escribir cdigo ms abreviado.
La forma general de escribir una sentencia de asignacin mediante los operadores
compuestos es:
obtect op= expression;
que es equivalente a la sentencia
object = object op expression;
op puede ser cualquiera de los operadores aritmticos o de bit estudiados arriba. O sea,
op puede ser +, - , *, /, %, &, | , ^, ~, << o >>. Nota: no debe haber ningn espacio entre el
operador y el signo igual.
Ejemplos:
int a; // Declarar a
SISTEMAS EMBEBIDOS COLABORATIVO 2
36
a += 50; // Es lo mismo que a = a + 50;
a += 20; // Tambin significa sumarle 20 a a
a *= 2; // Es lo mismo que a = a * 2;
a &= 0xF0; // Es lo mismo que a = a & 0xF0;
a <<= 1; // Es lo mismo que a = a << 1;
P6*1*0*)13# 0* /-*6#0/6*5
Una expresin puede contener varios operadores, de esta forma:
b = a * b + c / b; // a, b y c son variables
A diferencia del lenguaje Basic, donde la expresin se evala de izquierda a derecha, en
esta sentencia no queda claro en qu orden se ejecutarn las operaciones indicadas. Hay
ciertas reglas que establecen dichas prioridades; por ejemplo, las multiplicaciones y
divisiones siempre se ejecutan antes que las sumas y restas. Pero es ms prctico
emplear los parntesis, los cuales ordenan que primero se ejecuten las operaciones de
los parntesis ms internos. Eso es como en el lgebra elemental de la escuela, as que
no profundizar.
Por ejemplo, las tres siguientes sentencias son diferentes.
b = (a * b) + (c / b);
b = a * (b + (c / b));
b = ((a * b) + c)/ b);
Tambin se pueden construir expresiones condicionales, as:
if ( (a > b) && ( b < c) ) // Si a>b y b<c, ...
{
// ...
}
L#5 :8)13/)*5
Son bloques de sentencias identificadas por un nombre y variables locales y variables
globales
PROGRAMACIN DE UN MICROCONTROLADOR EN LENGUAJE C.
SISTEMAS EMBEBIDOS COLABORATIVO 2
37
CREACIN DE PROECTOS EN C
A continuacin, son listados los pasos mnimos para crear un proyecto en el
software CodeWarrior 6.2.
P#5/ 1. V*63:31#132) 0*. 5359*,#
Es necesario verificar los siguientes requerimientos mnimos para la ejecucin del
!oftware CodeWarrior 6.2:
Hardware: PC con 1GHz de velocidad y procesador Pentium o compatible. Se
recomienda 1GB de RAM, CD-ROM y dependiendo del sistema de desarrollo,
deber tener puerto serial DB9 o puerto paralelo o USB.
S359*,# O-*6#93@/: Microsoft Windows 2000, Windows XP o
WindowsVista.
E5-#13/ *) D351/: 2GB con 400MB en el disco del sistema Windows.
SISTEMAS EMBEBIDOS COLABORATIVO 2
38
P#5/ 2. I)59#.#132) 0*. C/0*(#663/6A 6.2
nstalar el CD del CodeWarrior 6.2 "e#elopment !tudio en el compartimiento del
CDROM del PC.
El software se ejecuta automticamente y se deben seguir las instrucciones de
instalacin.
El CodeWarrior 6.2 "e#elopment !tudio libera hasta 32K de licencia para
proyectos con la familia HC(S) 08/RS08 y hasta 64 para la familia CodFire V1.
P#5/ 3. E+*18132) 0*. C/0*(#663/6A 6.2
Para lanzar el programa es necesario seguir la ruta del WindowsA: S9#69 B
P6/46#,5 B "6**51#.* C/0*(#663/6 B C/0*(#663/6 IDE. El programa
comenzar a ejecutarse y la ventana de la Figura 8.21 aparecer.
P#5/ $. C6*#132) 0* 8) )8*@/ -6/%*19/
Pulsar sobre el botn C6*#9* N*; P6/+*19.
P#5/ C. S*.*1132) 0*. MCU % .# 1/)*D32)
La nueva ventana que aparece seleccionar el microcontrolador a trabajar y la
opcin de conexin disponible.
El microcontrolador a trabajar ser el MCE08JM60 con la opcin de conexin PFE
M8.93.3)G&C%1./)* P6/. Presionar el botn de N*D9, para pasar a la siguiente
ventana.
P#5/ 6. S*.*1132) 0* -#6H,*96/5 0*. -6/%*19/
En la ventana se detallan: la seleccin de los tipos de lenguaje a desarrollar, el
nombre del proyecto y la ruta de almacenamiento del mismo.
Para este ejercicio en particular, seleccionar como lenguaje el C. Finalmente
presionar el botn de N*D9.
P#5/ !. O-132) 0* #03132) 0* #61?3@/5
SISTEMAS EMBEBIDOS COLABORATIVO 2
39
Esta opcin de ventana no es de inters para el ejercicio, por este motivo se
sobrepasa. Presionar el botn de N*D9.
P#5/ 8. O-132) 0* P6/1*55/6 ED-*69
Esta opcin de ventana no es de inters para el ejercicio, por este motivo se
sobrepasa. Seleccionar la opcin )/)* y presionar el botn de N*D9.
P#5/ E. O-13/)*5 0* 1/):3486#132) -#6# *. C&CII
En esta opcin verificar la seleccin y presionar el botn de "3)35?.
Finalmente, aparece la ventana del men principal del CodeWarrior 6.2
"e#elopment !tudio y la ventana de navegacin del proyecto.
Haciendo doble pulsacin sobre el programa ,#3).1 aparece el cuerpo inicial de
cualquier proyecto, que se inicie desde cero y cuyo cdigo es mostrado.
Este cuerpo slo incluye:
=30*:.?: Macro para el proceso de interrupciones.
D*63@#93@*.?: Declaracin de los perifricos de MCU.
"8)132) ,#3): Programa principal del cuerpo en C. Aqu es ejecutado el macro
*)#7.* 3)9*668-95, que consiste en poner la mscara I en ceros, con el propsito
de habilitar de manera global las interrupciones del sistema. Dentro de la funcin
,#3), se espera que el programador incluya su cdigo. Tambin es ejecutada una
instruccin de :/6 infinito, que puede ser utilizada como iteracin principal del
proceso y que es necesaria desde el punto de vista de la accin cclica que
ejecuta un proceso desarrollado con un MCU. Dentro del :/6 se ejecuta un macro
llamado_RESET_(ATC=DOG, con el objetivo de eliminar la accin del COP y
aislar la MCU de un evento de RESET por sobre flujo del temporizador del COP.
En el siguiente aparte realizaremos un primer programa en C, donde se incluye:
Trabajo sobre el editor DE.
Proceso de compilacin.
Simulacin del proyecto.
Bajar el programa al DEMOJM.
SISTEMAS EMBEBIDOS COLABORATIVO 2
40
Migrar el proyecto.
El primer programa en C.
El primer programa en lenguaje C ha sido llamado Ejemplo1 y coincide con la
creacin del proyecto del aparte anterior. El programa es desarrollado sobre el
microcontrolador de 8 bits MC9S08JM60, para luego ser migrado al
microcontrolador de 32 bits MCF51JM128. Este ejemplo tambin se encuentra en
el sitio WEB referido en el libro.
Para el ejercicio es importante verificar que la JM DAUGHTER CARD corresponda
con la mquina de 8 bits MC9S08JM60.
El sistema enciende y apaga un LED conectado al pin PTE7 del DEMOJM. Este
ejemplo es realizado con la menor complejidad posible, con el objetivo de que el
lector de poca experiencia se vaya adaptando a la filosofa de programacin de
este texto.
CONCLUSIONES
SISTEMAS EMBEBIDOS COLABORATIVO 2
41
comprender las limitaciones que se imponen sobre el lenguaje C con el que se
programan las aplicaciones, para tratar de ajustarse a los recursos que tiene un
microcontrolador
C bastante bsico pero mucho ms sencillo de utilizar que el ensamblador normal.
Tambin se utilizan elementos perifricos bsicos para mostrar informacin a
travs de la barra de 4 displays de 7 segmentos.
Los microcontroladores que utilizan la arquitectura von- Neumann disponen de un
solo bloque de memoria y de un bus de datos de 8 bits.
El hecho de que un programa (la ROM) y los datos temporales (la RAM) estn
separados, permite a la CPU poder ejecutar dos instrucciones simultneamente.
Dicho de manera sencilla, mientras que se realiza la lectura o escritura de la RAM
(que marca el fin de una instruccin), la siguiente instruccin se lee por medio de
otro bus.
SISTEMAS EMBEBIDOS COLABORATIVO 2
42
BIBLIOGRA"IA
Assembler. Todo topic (2010). Sistemas Embebidos. Recuperado de
http://www.todopic.com.ar/foros/index.php?topic=8563.0
Microontroladores Pic (2013) Microcontroladores. Recuperado de
http://www.mikroe.com/chapters/view/82/
Cursos Micros. (2013) Lenguaje c. Recuperado de:
http://www.cursomicros.com/avr/lenguaje-c/variables-locales-y-globales.html

Potrebbero piacerti anche