Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El alumno disea dispositivos electrnicos basados en sistemas embebidos ca resolver problemas de baja y mediana complejidad haciendo uso para esto de lenguaje ANSI C con suma destreza.
1. Diseo de hardware basado en el uso del lenguaje ANSI C. 2. Trabajo en equipo. 3. Responsabilidad en el cumplimiento de las tareas y evaluac 4. Honestidad. 5. Motivacin. Recomendaciones para cumplir con las competencias: 1. Asistir a clases puntualmente. NO FALTE, tome en cuenta q temas del curso carecen de bibliografa completa en la we 2. Estudiar constantemente del material de clases. Resolver ejercicios propuestos. 3. Use su placa de desarrollo en casa para practicar diferente No olvide llevarla a todas las clases. 4. Mostrar respeto a sus compaeros y al curso. 5. Participacin activa en clases, HAGA PREGUNTAS.
Sistema de calificacin
PF = LB1+LB2+LB3+LB4+LB5+LB6+LB7+LB8 min(LB) 7
Donde PF = Promedio final del curso. LBx = Laboratorio calificado N x LB1 : Semana 4 (Evaluacin terica de programacin) LB2 : Semana 5 y 6 (Presentacin del mdulo de desarrollo-Trabajo prctico LC LB3 : Semana 7 (Trabajo prctico Teclado, LCD) LB4 : Semana 10 (Trabajo prctico TIMER 1) LB5 : Semana 12 (Trabajo prctico ADC) LB6 : Semana 14 (Trabajo prctico Puerto SERIE) LB7 : Semana 17 (Trabajo prctico PWM) LB8 : Semana 19 (Trabajo prctico Input Capture)
1. Mdulo de desarrollo basado en el dsPIC30F3014. 2. Cable USB tipo A-B. 3. Software MPLAB IDE. 4. Compilador MPLAB C30. 5. Informacin del curso dada en clase.
El lenguaje ANSI C
El lenguaje C fue diseado en el ao 1972 en los laboratorios Bell. La intencin principal fue la de reescribir el sistema operativo Unix de una forma portable, ya que el Unix fue escrito en lenguaje ensamblador y tena que ser
FLASH y requiere un mayor consumo de memoria RAM. Los buenos compiladores tienen un precio, los ensambladores son gratuitos. Los compiladores son programas que pueden tener algunos inconvenientes. Los compiladores generan cdigo redundante e innecesario que muchas veces no es necesario ejecutar.
Mag. Ing. Sergio Salas
Estructura de un programa en C
#include "p30fxxxx.h //Macros para la configuracin de los fusibles _FOSC(CSW_FSCM_OFF & XT_PLL4); _FWDT(WDT_OFF); _FBORPOR(PBOR_OFF & PWRT_16 & MCLR_EN); _FGS(CODE_PROT_OFF); int main() { El programa principal se ingresa dentro de las llaves de la funcin primaria main(). }
Comentarios en ANSI C
Los comentarios pueden ser de dos tipos: 1. Comentarios de una sola lnea. Haciendo uso del operador // 2. Comentarios que abarcan varias lneas. Haciendo uso del operador /* (inicio del comentario) y */ (fin del comentario) Por ejemplo:
a = 5; //Esto es un comentario al lado de una instruccin. /*Esta es una forma de realizar un comentario compuesto por dos o ms lneas.*/
As mismo, puede haber mas de una instruccin en una sola lnea: a = 4; b = 3; c++; De la misma manera, los espacios en blanco son ignorados por el compilador: a = 5 +2; // Forma correcta
a=5
+ 2; //Tambin es correcto, pero genera desorden en el programa.
Maysculas y minsuculas
En ANSI C las variables escritas con minsculas son diferentes de las escritas con Letras maysculas. Por ejemplo: Variable variable VARIABLE VARIable variablE Los nombres de las variables jams pueden comenzar con un dgito o llevar espacios en blanco. Por ejemplo:
int 7seg; // incorrecto char num entero; // incorrecto La forma adecuada sera: int sevenseg; char num_entero;
Tipos de variables
Tamao (bits)
1 8 8 16 16 16 16 32 32 32 32
Tipo
bit signed char unsigned char int unsigned int short unsigned short signed long unsigned long float double
Rango
0a1 -128 a 127 0 a 255 -32768 a 32767 0 a 65535 -32768 a 32767 0 a 65535 2 147 483 648 a +2 147 483 647 0 to 4 294 967 295 1.17549E-38 a 6.80565E38 1.17549E-38 a 6.80565E38
Declaracin de variables
Las variables por defecto se almacenan en la memoria SRAM. Por esta razn, es recomendable no crear ms variables de las que realmente se necesitan para no malgastar los recursos de memoria.
unsigned char a = 5; //Variable global (puede ser usada en todo el programa float pi = 3.1415; //por las diferentes funciones. void main( ) { char b = -8; //Variable local (solo puede ser usada en el mbito de la // funcin main() unsigned int k = 12000; } void sumar( ) { unsigned char var; var = a +10; //Correcto. a es una variable global. var = b +90; //Error b no existe para esta funcin }
El Complemento a 2
El nmero 8 en binario es: 0000 1000 Si lo invertimos obtenemos: 1111 0111 Si le sumamos 1 tenemos: 1111 1000 = -8 complemento a 2
De la misma manera si tenemos -8: 1111 1000 Y luego lo invertimos: 0000 0111 Y finalmente le sumamos 1: 0000 1000 Suponga que quiere sumar 5 8. Entonces: 0000 0101 -> 5 1111 1000 ->-8 -------------1111 1101 -> -3 Suponga que quiere sumar -8 y -3. Entonces: 1111 1000 -> -8 1111 1101 -> -3 ------------1111 0101 -> -11
Constantes
Muchas veces, es necesario crear variables cuyo contenido se mantenga esttico. Por ejemplo, puede recordar las tablas en lenguaje ensamblador en donde se fijaba un mensaje que se poda presentar en la pantalla LCD o el los Displays 7 segmentos. Dicho mensaje se almacenaba en la memoria FLASH. Las variables constantes se almacenan en FLASH y por tanto su contenido no se puede actualizar. Para declarar una variable constante se hace uso del operador const.
const unsigned char data = 10; const temp = 36.5; const char curso[ ] = {A,r,q,u,i,t,e,c,t,u,r,a}; void main () { TRISB = 0x00; TRISD = 0x00 PORTB = data; PORTD = curso[4]; }
El comando del pre procesador #define es una macro que define un valor constante que puede ser reemplazado por un Alias en todo el programa. El abuso de este tipo de comando no genera ningn gasto en memoria del sistema embebido. La ventaja del uso del #define es que permite mejorar la legibilidad del programa. Ejemplo: #define ES_PAR 0 #define ES_IMPAR 1 unsigned char residuo; void main( ) { TRISB = 0xFF; TRISD = 0x00; residuo = PORTB%2; if(residuo == 0) PORTD = ES_PAR; else PORTD = ES_IMPAR; }
//PORTD = 0 //PORTD = 1
Operadores aritmticos en C
Operador
+ * / % ++ --
Operacin Suma
Resta Multiplicacin Divisin
Residuo
Autoincremento Autodecremento
& | ^ ~ <<
>>
AND
OR XOR NOT Corrimiento izquierda Corrimiento derecha
char a=0b1111 0000, b=0b00110011; char c; void main( ) { c = a & b; // c = 00110000 (AND) c = a | b; // c = 11110011 (OR) c = a ^ b; // c = 11000011 (XOR) c = ~ b; // c = 11001100 (NOT) a = 0b10101100; c = a << 2; // c = 1011 0000 a = 0b10101100; c = a >> 3; // c = 0001 0101 } Mag. Ing. Sergio Sala
O
Negacin
Sentencias de seleccin if
if ( Expresin) Instruccin 1; else Instruccin 2; Condicin verdadera porque el argumento es mayor a 0.
Se utiliza la apertura y cierre de la llave cada vez que hay ms de una sentencia dentro del condicional
//Si a es igual a b
unsigned char a = 5, b = 7, c; void main() { if ( a = b) { c = 10; } while(1); } unsigned char a = 5, b=7,c; void main() { if( a > 4 & b > 6) { c = 10; } while(1); }
Error a = b, es decir a = 7 y como es una asignacin vlida el argumento de if es 1 y por tanto la condicin es considerada verdad por lo cual c = 10.
No afecta el resultado ya que a>4 = 1 y b>6 La operacin AND entre ambos valores da 1 por tanto la condicin es considerada verdad y c = 10. Sin embargo, es importante tener e cuenta que se est realizando la operacin A y no la operacin lgica. Mag. Ing. Sergio Salas
unsigned char k = 0; void main() { TRISB = 0xFF; while(1) { if(PORTB <10) k = 10; else if(PORTB >=10 && PORTB <=50) k = 50; else if(PORTB >50 && PORTB < 150) k = 100; else if(PORTB >=150 && PORTB < 200) k =150; else k = 200;
} }
El problema de este anidamiento if-else if es que se deben evaluar todas las condiciones vlida. Una vez hallada la condicin vlida se sale de la sentencias if. Si existen muchas evaluar, el anidamiento if-else if puede resultar ineficiente. Mag. Ing. Sergio Salas
Para resolver el problema de ineficiencia debido a mltiples condiciones posibles para una variable se puede hacer uso de la sentencia switch() que nicamente evala la opcin correcta y ejecuta las instrucciones especificadas para dicha condicin. La sentencia tiene la siguiente estructura: switch (condicin) { case condicin 1: Instrucciones; break; case condicin 2: Instrucciones; break; case condicin N: Instrucciones; break; default: Instrucciones; Mag. Ing. Sergio Salas
unsigned char resul; void main() { TRISB = 0xFF; switch(PORTB) { case 0: resul = 10; break; case 1: resul = 11; break; .. .. case 200: resul = 245; break; default: resul = 0; }
Ejemplo:
Aqu al menos las intrucciones se ejecutan una sola vez si es que la condicin dentro del while() es falsa desde un inicio.
Muy similar a la sentencia goto en lenguaje ensamblador. De la misma manera, r etiquetas. Cierta literatura sobre el lenguaje ANSI C recomienda no abusar de es sentencia dado que podra ocasionar problemas al compilador. En el caso de AN embebidos esto no aplica ya que la sentencia goto tiene relacin directa con la m lenguaje ensamblador.
La sentencia break
Esta sentencia se utiliza para finalizar la iteracin cuando ocurre cierta condici en su interior. Ejemplo: Calcular el factorial de 5. unsigned char fact = 1; void main() { for(i = 1; i<10; i++) { if(i<6) fact = fact*i; else break; } while(1); }
La sentencia continue
continue es una sentencia que se utiliza dentro de los bucles iterativos para controlar e Esta instruccin normalmente se utiliza dentro de un condicional if para generar la sigu
Ejemplo: Hacer un programa que sume los nmeros pares del 1 al 10.
unsigned char suma; void main() { unsigned char i = 0; for( i = 0; i<=10; i++) { if(i%2 != 0) continue; suma+ = i; } while(1); }