Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PROGRAMACIÓN EN
LENGUAJE C
Microcontroladores
Estructura general de presentación:
5
Generalidades de Programación en C para microcontroladores
Ejemplo Código con sangría:
P3OUT |= 0x04;
while(1){
if(!CMBufIsEmpty()){ //polling the command receiver buffer
...
}
}
}
6
Generalidades de Programación en C para microcontroladores
Declaración de variables:
La memoria ocupada por una variable local de una función, será usada por otra
variable en otra función.
7
Generalidades de Programación en C para microcontroladores
8
Generalidades de Programación en C para microcontroladores
extern: Se declara una variable que está definida en otro módulo o archivo
volatile: La variable puede ser modificada fuera del contexto o del flujo normal
del programa, por lo que no debe ser optimizada por el compilador
9
Generalidades de Programación en C para microcontroladores
Optimización de un programa en C para sistema embebido.
La mejor performance de un programa se obtiene cuando:
El Tamaño del código es reducido
El tiempo de ejecución es Mínimo
Se puede lograr definiendo el tipo de dato mas apropiado para cada variable
Los tipos de datos “int” y “long int” deben ser usados solo donde se requieren, considerando el
rango de los datos a representar.
Las operaciones en doble precisión y punto flotante son ineficientes y deben ser evitadas
donde la eficiencia es importante y los recursos son limitados.
Usar tipo de dato unsigned donde sea posible; para el tipo char el signo debe definirse
explícitamente.
Usar variables locales tanto como sea posible (variables Locales usan pila ó registros de CPU,
las variables globales usan RAM);
10
Generalidades de Programación en C para microcontroladores
Operaciones booleanas sobre bits en C estándar
Paraoperar sobre bits individuales, es conveniente expresar los valores constantes en
hexadecimal (0xnn).
Operadores de bits:
AND: & OR: | NOT: ~ XOR: ^
Operan “bit a bit”, no confundir con los operadores lógicos &&, || y !, utilizados para
relacionar las operaciones condicionales
Por ejemplo:
Analizar un bit: if (0x20 & reg) { … }; // considerando a reg como char
Poner en uno los bits 0 y 1: reg |= 0x03; // equivalente a : reg = reg | 0x03
Poner en cero los bits 7 y 6: reg &= 0x3F; // no confundir & con el operador dirección
Cambio de estado de un bit : reg ^= 0x0001; // “Toggling”
Invertir los bits de un registro: ~ reg; o reg = ~ reg;
Desplazamiento de N posiciones (los lugares libres se completan con ceros) : << N o >> N
BDATA
0xFF 0xFF
CODE XDATA 0x1F
0x7F
PDATA IDATA
DATA REG
0x0000 0x0000 0x00 0x00 0x00
Particularidades de C para 8051/52 - IDE Keil uVision
Se puede combinar la directiva de compilación (#pragma) y los modificadores de
lugar de residencia de variables y funciones para personalizar el modelo de
memoria utilizado
Directivas Modificadores de tipo de memoria
#pragma SMALL data
#pragma COMPACT idata
#pragma LARGE code
pdata
xdata
bdata
Particularidades de C para 8051/52 - IDE Keil uVision
El modelo y tipo de memoria elegido influye en la velocidad y tamaño del código.
Por ejemplo, suponiendo la instrucción en C int i=520; al compilarlo, en función del
modelo de memoria elegido, quedaría:
Tipo sfr
Permite declarar un entero positivo en el rango 0…255
Corresponde a una variable en la zona de registros especiales
Se usa igual que un unsigned char
Declaración: sfr nombre_variable = dirección de memoria
Ejemplo:
sfr P0 = 0x80;
sfr P1 = 0x90;
void main (void){
while(1)
P1 = ~P0;
}
Particularidades de C para 8051/52 - IDE Keil uVision
Tipos de datos de Lenguaje C particulares para C51 (continuación)
Tipo bit
Ejemplo:
Rutina de interrupción que cada vez que desborde el Timer0 (vector 0x000b)
incremente una variable tiempo.
volatile long tiempo=0;
void incrementar_tiempo(void) interrupt 1
{
tiempo++;
}
Particularidades de C para 8051/52 - IDE Keil uVision
External
0x0013 2 IE1 (TCON.3) Y EX1 (IE.2) PX1 (IP.2)
Interrupt1 (/INT1)
RI0 (SCON.0)
UART 0 0x0023 4 N ES0 (IE.4) PS0 (IP.4)
TI0 (SCON.1)
TF2H (TMR2CN.7)
Timer 2 OverFlow 0x002B 5 N ET2 (IE.5) PT2 (IP.5)
TF2L (TMR2CN.6)
Particularidades de C para 8051/52 –
Ejemplos de programación
Estructura de Programación en C para 8051
#include <reg51.h> /* Inclusión de archivo de cabecera */
#define …….. /* Definiciones de constantes de compilación */
while (1){
…………………… /*Código de ejecución eterna para sistemas embebidos */
}
}
25
Estructura de Programación en C para 8051
#include <reg51.h>
#define ON 1
void main(void){
unsigned char primero,segundo;
primero =P1;
if(tecla == ON)
segundo = duplicar(primero);
else
segundo = sumoDos(primero);
while(1);
}
26
Timers
Programa 1 Programa 2 Programa 3
27
Comunicación serie
BaudRate Clk SMOD TH1 Error
9600 12 1 F9 7%
4800 12 0 F9 7%
2400 12 0 F3 0,16%
void serialInit(void){
SCON = 0x50; /* setup para 8-bit de datos */ 1200 12 0 E6 0,16%
TMOD = 0x20; /* setup timer1 p/ autocarga*/ 9600 11 0 FD 0
TH1 = 0xF3; /* setup para 2400 baudios*/
4800 11 0 FA 0
TR1 = 1; /* enciende timer 1 */
//TI = 1; /* listo p/ transmitir x interrup*/ 2400 11 0 F4 0
} 1200 11 0 E8 0
Número LED on
1 D4
2 D3,D5
3 D3,D4,D5
4 D1,D2,D6,D7
5 D1,D2,D4,D6,D7
6 D1,D2,D3,D5,D6,D7
30
Ejemplos de Programación en C para 8051 para clases prácticas
#include “reg51.h” for ( ; ; ) { D4 = ON;
if(button == 0){ D6 = ON
#define ON 0 switch (DADO) { D7 = ON;
#define ALL_OFF 0xFF case 1: break;
D4 = ON; case 6:
sbit button = P3^0; break; D1 = ON;
case 2: D2 = ON;
sbit D1 = P1^0; D3 = ON; D3 = ON;
sbit D2 = P1^1; D5 = ON; D5 = ON
sbit D3 = P1^2; break; D6 = ON;
sbit D4 = P1^3; case 3: D7 = ON;
sbit D5 = P1^4; D3 = ON; break;
sbit D6 = P1^6; D4 = ON } //Fin switch
D5 = ON; wait_a_second();
// Función retardo de ~1seg break; wait_a_second();
void wait_a_second ( ) { case 4: P1 = ALL_OFF;
unsigned int x; D1 = ON; } // Fin if
for ( x = 0; x < 33000; x++); D2 = ON; else {
} D6 = ON DADO++;
D7 = ON; if( DADO == 7 )
// Programa principal break; DADO = 1;
main ( ) { case 5: } // Fin else
// Inicializa variable estado D1 = ON; } // Fin for
int DADO = 0; D2 = ON; } // Fin main
31
Ejemplos de Programación en C para 8051 para clases prácticas
Propuesta: se desea codificar de una manera más
eficiente el programa del dado electrónico basado en
el uC 8051.
¿Arreglos?
1 D4 11110111 F7
2 D3,D5 11101011 EB
3 D3,D4,D5 11100011 E3
4 D1,D2,D6,D7 10011100 9C
5 D1,D2,D4,D6,D7 10010100 94
6 D1,D2,D3,D5,D6,D 10001000 88
7
32
Ejemplos de Programación en C para 8051 para clases prácticas
Se desea construir un buzzer electrónico basado en el uC 8051.
Cuando la llave es presionada, el buzzer enciende y apaga 30
veces con un retardo de un segundo entre salidas.
#include “reg51.h” for(;;){
while(button == 1);
#define ON 0 for( i = 1; i <= 30; i++) {
#define OFF 1 Buzzer = ON;
wait_a_second();
sbit button = P3^0; Buzzer = OFF;
sbit Buzzer = P1^7; wait_a_second();
}
// Función retardo de ~1seg }
void wait_a_second ( ) { }
unsigned int x;
for ( x = 0; x < 33000; x++);
}
// Programa principal
main ( ) {
// Inicializa variable estado
int i;
Buzzer = OFF;
33
Ejemplos de Programación en C para 8051 para clases prácticas
Se desea construir un pianito electrónico basado en el uC 8051.
Cuando una llave es presionada, el buzzer enciende a una
frecuencia determinada.
34
Ejemplos de Programación en C para 8051 para clases prácticas
#include “reg51.h” // Programa principal // Programa principal
main ( ) { case 8:
#define ON 0 unsigned char key_pres; tone = 57;
#define OFF 1 count = 0; break;
Speaker = 0; case 16:
sbit Speaker = P3^0; init_timer ( ); tone = 51;
int count, tone; EA = 1; break;
for(;;){ case 32:
void init_timer ( ) { if(P1 != 0xFF){ tone = 45;
TMOD = 0x20; // T1 en M2 TR1 = 1; break;
TH1 = -50; //T1 em 50us key_pres = ~P1; case 64:
ET1 = 1; switch(key_pres){ tone = 40;
TR1 = 0; //Arranca parado case 1: break;
} tone = 76; case 128:
// T1 servicio de interrupción break; tone = 38;
Timer1_ISR( ) interrupt 3 { case 2: break;
count++; tone = 68; }
if( count == tone) { break; }
count = 0; case 4: else{
Speaker = ~Speaker; tone = 60; count = 0;
} break; Speaker = 0;
} TR1= 0;
}
}
}
35
Ejemplos de Programación en C para 8051para clases prácticas
Arreglos
Escribir un programa en C para 8051 que envíe los valores
hexadecimales en ASCII 0, 1, 2, 3, 4, 5, A, B, C, y D por el puerto P1.
Solución:
#include <reg51.h>
void main(void)
{
unsigned char mynum[]=“012345ABCD”;
unsigned char z;
for (z=0;z<=10;z++)
P1=mynum[z]; // o P1 = * (mynum + z)
while(1);
}
36
Ejemplos de Programación en C para 8051para clases prácticas
Arreglos
Escribir un programa en C para 8051 que envíe los valores 0-9 en
código 7-segmentos por el puerto P1.
37
Generalidades de Programación en C para microcontroladores
Operadores Aritméticos:
38
Generalidades de Programación en C para microcontroladores
Operadores Relacionales:
39
Generalidades de Programación en C para microcontroladores
Otros operadores:
Operator Name Syntax
Basic Assignment a=b
Function Call a()
Array Subscript a[b]
Indirection (Dereference) *a
Address-of (Reference) &a
Member by Pointer a->b
Member a.b
Member by Pointer Indirection a->*b
Member Indirection a.*b
Cast (type) a
Comma a,b
Ternary Conditional a?b:c
Scope Resolution a::b
Size-of sizeof a
Size-of sizeof (type)
Type Identification typeid type
Allocate Storage new type
Allocate Storage (Array) new type[n]
Deallocate Storage delete a
Deallocate Storage (Array) delete[] a
40
Generalidades de Programación en C para microcontroladores
Formas compactas:
Compact form Original form
x += y x=x+y
x -= y x=x-y
x *= y x=x*y
x /= y x=x/y
x %= y x=x%y
x &= y x=x&y
x |= y x=x|y
x ^= y x=x^y
x << y x = x << y
x >> y x = x >> y
41
Generalidades de Programación en C para microcontroladores
Prioridad de operadores:
Priority Operator Description
Highest () [] -> Grouping, scope, array/member access
! ~ + - & Size of type cast (most) unary operations, …
* / % Multiplication, division, modulo
+ - Addition, subtraction
<< >> Bitwise shift left and right
< <= > >= Comparisons: less-than, ...
== != Comparisons: equal and not equal
& Bitwise AND
^ Bitwise exclusive OR
| Bitwise inclusive (normal) OR
&& Logical AND
|| Logical OR
? Conditional expression (ternary operator)
= += -= *= /= %= &= |= ^= <<= >>= Assignment operators
Lowest . Concatenation ("comma“)
42
Generalidades de Programación en C para microcontroladores
43
Generalidades de Programación en C para microcontroladores
44