EJEMPLOS OBLIGADOS Y PROYECTOS EN COMPILADOR CCS

En este apartado vamos a presentar algunos ejemplos que ilustran maniobras basicas con un microcontrolador pic.

INTERUPCIONES: Presentamos un circuito de regulacion AC. Para cargas monofasicas que se usa en multiples equipos domesticos e industriales:

licuadora                osc1

BAJAR CODIGO EN CCS Y SIMULACION PROTEUS

El ejemplo anterior se inspiro en una licuadora domestica digital que regula la potencia del motor universal. El primer boton del lado izquierdo de accion toggle enciende o apaga la licuadora, el resto de botones aportan los niveles de potencia. El programa funciona por interupciones y resuelve por software un dimmer, para una carga AC. Monofasica. Ampliamente empleado en aparatos electricos domesticos y herramientas.

DIMMER ELECTRONICO O CONTROL POR FASE:bajar este PDF

Este sistema ampliamente conocido en electronica de potencia, calcula de forma digital a diferencia de un dimmer analogo con un TRIAC. El punto de disparo a enviar a un TRIAC de potencia. El inicio o marco de referencia para el calculo del angulo de disparo, se hace desde el instante en el cual la onda de la red AC comercial pasa por cero, Para ello se requiere de un detector de cruce cero. Que genere un pulso en cada cruce cero, dando como resultado un tren de pulsos cortos del doble de la frecuencia de la red (60Hz-120Hz). Este circuito no requiere ser simulado, si lo emulamos en proteus con una fuente pulsante de 120Hz con un ciclo de trabajo corto(1%).

Figure 2

En la salida del circuito anterior se obtienen pulsos cortos amarillos de cruce cero ZVS, como se ve en el osciloscopio de la simulacion anterior. la entrada debe ser una muestra de la señal senoidal de la red domiciliaria convertida en cuadrada. Con algun circuito. Abajo proponemos un circuito con MOSFET.

                  

Otra forma de conformar la onda cuadrada es abusar del PIC de la siguiente forma. Estos circuitos electronicos estan dotados de un diodo zenner interno, para protegerlo de la estatica y sabemos que son tensiones muy altas, tan altas o mas que los niveles de la tension de la red domestica. Con una resistencia de alto valor se puede instalar verificando que nunca se superen los limites de corriente de entrada. El circuito propuesto es el siguiente. Esta aseveracion esta soportada en una nota de aplicacion de MICROCHIP, que recomienda esta conexion. Se debe verificar con un osciloscopio que la onda en el pin RB0, tenga aspecto de recorte o saturacion. Si esto no se logra no se ejecutara la interupcion.

En esta situacion usted debera lograr interupcion con flanco de subida y bajada, de resto no funcionara..

ESTUDIEMOS EL CODIGO COMPLETO

#include <dimmer.h>   no es necesario comentar ya que esta incluido en el codigo que se debe bajar, contiene basicamente las configuraciones del programa.

Esta es la rutina de interupcion por cambio en el puerto B7. corresponde a una accion toggle para el boton de POWER, el retardo de 5ms es para conformar una accion antirrebote, se vuelve a preguntar por el estado de la tecla power y verificar que el transitorio esta extinguido.


#INT_RB
void RB_isr(void)
{
if(input(PIN_B7)== 0) {
delay_ms(5);
if(input(PIN_B7)== 0) {
output_toggle(pin_B2);//power motor
}
}
}

Esta es la interupcion para detectar los cruces cero (ZVS). La intencion de esta interupcion es reiniciar el temporizador TMR0 y ademas apagar el TRIAC en el instante que se presenta el cruce cero.


#INT_EXT
void EXT_isr(void)
{
set_timer0(0);//reset TMR0 en el cruce cero
output_low(PIN_B1);//apaga triac
}

Rutina principal que configura las interupciones, declara variables, configura puerto B, apagado inicial del triac, habilita pull ups, Habilita reaccion al flanco de subida en la señal de RB0 o ZVS.


void main()
{
output_low(PIN_B2);//apaga relevo
int8 angulo,fire,tiempo;
set_tris_B(0xF1);//entradas rb7,rb6,rb0
output_low(PIN_B1); //apaga triac
port_b_pullups(0xFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); //8,1 ms overflow
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
ext_int_edge( L_TO_H ); // Sets up EXT para RB0
enable_interrupts(GLOBAL);

La parte clave de la configuracion del TMR0 se consigna en la instruccion siguiente.

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); //8,1 ms overflow

Esa instruccion compacta que genero el wizard de inicio, significa que se usa un TMR0 con prescaler de 32 a 8 bits y hay que tener en cuenta que se rebosa en 8.1ms.

Si se noto en el archivo de configuracion bajado. El cristal oscilador seleccionado fue de 4MHZ. como los pics dividen por 4 la frecuencia del cristal, esta freciencia resultante de 1MHZ es la que usa el TMR0 para temporizar. Esa frecuencia de 1MHZ no la podemos ingresar directamente al TMR0 ya que seria tan rapida que en 255 uS llenaria el registro de 8 bits del TMR0 y la temporizacion seria imposible medir la duracion de un semiciclo de 60HZ. Para tener una aproximacion de cuanto seria el valor prescalador, se hace con una cuenta bien facil.  Si la duracion de un semicilo de 60 HZ es de 8.333ms, Esto quiere decir que para medir este tiempo con un pulso de reloj de 1MHZ y llenar el TMR0 seria dividir 8.333ms/255, el valor seria 32.66 mejor dicho si el reloj hace tic tacs cada 32.66 al cabo de 255 de estos tic tacs llenaria el TMR0. Pero ese prescaler no es posible el mas cercano es de 32. Por lo tanto 32uS por 255 daria 8.15mS Oppsss.   se restablecera solo antes de llegar al proximo cruce cero. Problema jodido. pero esta es una buena oportunidad lograr semejante aproximacion una forma de resolver esto, es gastarnos esa diferencia (0.183ms) en disparar el triac y santo remedio. Osea que con solo retardar el disparo del TRIAC esto no va a suceder tambien funciona no disparar por encima de 8.15 ms. Agregando una condicion en el programa o tambien programando interupcion por desbordamiento de TMR0.

lRutina ciclica que en la primera fase, revisa botones y segun el pulsado se establece un algulo de disparo para el control por fase, se programaron tres niveles de disparo; poco medio y alto. (85, 170, 255. Respectivamente)

while(TRUE)
{
if(input(PIN_B6)== 0) {
fire=85;//85,170,255..niveles de potencia motor
}
if(input(PIN_B5)== 0) {
fire=170;//85,170,255..niveles de potencia motor
}
if(input(PIN_B4)== 0) {
fire=255;//85,170,255..niveles de potencia motor
}

Esta rutina calcula el tiempo de espera y a su vez, espera la temporizacion del angulo de disparo, para decidir en que instante del semicilco de 60Hz. Aplica el pulso de disparo que acciona el triac.

angulo=255-fire;
tiempo=get_timer0();
if(tiempo>angulo){
output_high(PIN_B1);//dispara el triac

//TODO: User Code
}

}
}

Este programa se puede aprovechar en el control electronico de un aparatro electrodomestico, como es una licuadora a nivel de ejemplo.

DIMMER CON PULSADORES

La regulacion de potencia se logra por un par de pulsadores de incremento/decremento.

ANALISIS DEL PROGRAMA

#include <dimmer.h>

#INT_RB
void RB_isr(void)
{

}


INTERUPCION EXTERNA DONDE SE BORRA TMR0 Y TRIAC


#INT_EXT
void EXT_isr(void)
{
set_timer0(0);//reset TMR0 en el cruce cero
output_low(PIN_B1);//apaga triac
}

void main()
{
output_low(PIN_B2);//apaga relevo
int8 angulo,fire,tiempo;//  se declaran tres variables
set_tris_B(0xF1);//entradas rb7,rb6,rb5,rb4,rb0
output_low(PIN_B1); //apaga triac
port_b_pullups(0xFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); //8,1 ms overflow aca se configura prescaler para 32 con xtal de 4MHZ
enable_interrupts(INT_EXT);
ext_int_edge( L_TO_H ); // Sets up EXT para RB0  define flanco de la señal ZVS
enable_interrupts(GLOBAL);

while(TRUE)
{

if(input(PIN_B7)== 0) {     //aca se leen los botones a niveles bajos
delay_ms(15);                //15ms de antirebote
if(input(PIN_B7)== 0) {     //se repite el text
++fire;//power motor       //se incrementa la variable fire
if (fire>253)                    //test de que esta en el borde del conteo declarado maximo y seguro
{
fire=253;                       //se le pone techo de 253
}
}
}                                  //lo mismo de arriba pero para el boton de decremento
if(input(PIN_B6)== 0) {
delay_ms(15);
if(input(PIN_B6)== 0) {
--fire;//power motor
if(fire<2){                     //tiene un piso seguro de 1 no cero
fire=1;
}
}
}
angulo=255-fire;            //calculo del angulo de disparo al TRIAC
tiempo=get_timer0();     //lectura del TNR0
if(tiempo>angulo){         //trext de que es hora de disparar
output_high(PIN_B1);//dispara el triac

//TODO: User Code
}


}
}

BAJAR CODIGO EN CCS Y SIMULACION PROTEUS

MODIFICACION DEL PROGRAMA PARA SIMPLIFICAR EL HARDWARE:

Si no queremos hacer un detector de cruce cero. Podemos adoptar esta modificacion donde captamos el flanco de caida y subida por el puerto RB7 y los botones por RB3 y RB2  y TRIAC en RB0 teniendo en cuenta que con este procesador no tiene rsistencias de pull ups internas en RB3 a RB0 y toca ponerlas de forma externa. Tal como muestra el dibujo de abajo.

ANALISIS DEL PROGRAMA CON SU MODIFICACION:  se puede adoptar esta modificacion para los ejemplos anteriores. En amarillo las lineas y archivo moodificados del ejemplo anterior.

#include <dimmer.h>


#INT_RB
void RB_isr(void)
{
set_timer0(0);//reset TMR0 en el cruce cero
output_low(PIN_B0);//apaga triac
}



void main()
{
output_low(PIN_B1);//apaga relevo
int8 angulo,fire,tiempo;
set_tris_B(0x8C);//entradas rb7,rb3,rb2
output_low(PIN_B0); //apaga triac
port_b_pullups(0xFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); //8,1 ms overflow
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

while(TRUE)
{

if(input(PIN_B3)== 0) {
delay_ms(15);
if(input(PIN_B3)== 0) {
++fire;//power motor
if (fire>253)
{
fire=253;
}
}
}
if(input(PIN_B2)== 0) {
delay_ms(15);
if(input(PIN_B2)== 0) {
--fire;//power motor
if(fire<2){
fire=1;
}
}
}
angulo=255-fire;
tiempo=get_timer0();
if(tiempo>angulo){
output_high(PIN_B0);//dispara el triac

//TODO: User Code
}


}
}

BAJAR CODIGO EN CCS Y SIMULACION PROTEUS

LOS CIRCUITOS DE SALIDA COMPLETOS PARA EL TRIAC. incluye circuito snubber para el opto diac y el triac asegurando operacion estable en cargas inductivas.

DIMMER TRIFASICO

REGULADOR DE VOLTAJE TRIFÁSICO CON UN PROCESADOR DE BAJO COSTO Y UN SOLO RELOJ DE TIEMPO REAL.

Los reguladores de voltaje AC de frecuencia fija son ampliamente empleados en procesos industriales por su robustex y simplicidad ademas presentan ventajas al ser incorporados en regulacion de cargas de AC o DC de potencia. En el caso de sistemas de ahorro de energia han sido implemetados con éxito ya que se han incorporado a los sistemas FPC (controladores de factor de potencia) logran ahoros de energia en motores electricos con cargas leves. Tradicionalmente estos sistemas se han implementado con bases de tiempo analogicas como la rampa lineal o rampa coseno para lograr rspuesta lineal estoas caracteristicas se puede lograr muy facil con la ayuda de un microcontrolador. Intuitivamente se puede ponsar que como se hace en computo analogo se implementan tres bases de tiempo independientes en el esquema que aca se propone se demustra que hace eso no es necesario con el esquema de con mutacion descrito con un solo reloj de tiempo real se logra regular el angulo de fase entre 0 y 180 grados

Aplicaciones mas comunes:

·        Regular potencia en equipos de soldadura de punto,

·        Sistemas de galvanoplastia

·        Arrancadores suaves

·        Controladores FPC para ahorro de energia

·        Regulacion de cargas resistivas como hornos y muflas

Los sistemas tradicionales analogos se generaba el punto de disparo atraves de la comparacon de una rampa inversa con un nivel fijo de tension. Esos circuitos implicaban una gran cantidad de circuitos analogos que pueden verse afectados durante su vida util ya que las rampas de tension dependen de la integridad de condensadores polares que pueden verse alterados por cambios en la ESR y la linealidad de la rampa verse alterad adicionalmente si el sistema requiere una rampa coseno la electronica de la base de tiempo se torna mas compleja. Con el uso de un procesador digital muchas funciones analogas se resueven por software.

ESQUEMA DE CONMUTACION

A continuacion se va a describir un metodo de conmutacion de un grupo rectificadores controlados o en otro caso TRIAC para logra una regulacion AC o DC limpia y segura con el uso de un solo reloj de tiempo real. Inicialmente estudiemos las zonas que se presentan en un esquema de conmutacion trifasico según la secuencia de los voltajes de la red aplicados. Supondremos la secuencia aplicadas conforme se ilustra en el dibujo siguiente.

·         VAB

·         VCA

·         VBC

Cada Fuente de voltaje presenta porcion positiva y negativa. Si se visualiza solo la señal de voltaje VAB se ve que esa porcion del voltaje trifasico se puede subdividir en seis zonas en un ciclo completo. Que los delimitan en porciones de tiempo iguales con los puntos de cruce cero de la señal trifasica. Si se observa el voltaje VAB los cruces de cero producen durante a aparicion de este voltaje. Seis zonas de un sexto de la onda seno completa por fase. Si el sistema trifasico esta en regimen equilibrado se cumplen las afirmaciones que aca se tendran en cuenta. Si se genera una tabla logica de los niveles de tension si pensamos que las señales de voltaje al ser digitalizadas tienen dos estados positivo se le asigna estado logico uno y negarivo se le asigna estado logico cero.

Al recorer la tension VAB en un ciclo completo se observa lo siguiente por regiones. 

 

1

2

3

4

5

6

VAB

POS

POS

POS

NEG

NEG

NEG

VCA

NEG

NEG

POS

POS

POS

NEG

VBC

POS

NEG

NEG

NEG

POS

POS

 SI SE REALIZA UN  MUESTREO DIGITAL DE LAS SEÑALES DE TENSION DE LA RED AC APLICADA AL SISTEMA LA TABLA ANTERIOR SE TRANSFORMA EN LA TABLA SIGUIENTE

 

ZONA 1

ZONA 2

ZONA 3

ZONA 4

ZONA 5

ZONA 6

VAB

1

1

1

0

0

0

VCA

0

0

1

1

1

0

VBC

1

0

0

0

1

1

UNA LECTURA DIGITAL DE LA SEÑAL TRIFASICA CUADRADA IDENTIFICA LAS SEIS ZONAS. LA IDENTIFICACION DE ESAS ZONAS SE HACE LUEGO DE EJECUTARSE UNA INTERUPCION EXTERNA POR FLANCO DE LA SEÑAL DE TENSION DIGITAL. LAS SEÑAL TRIFASICA ANTERIOR APLICADA A UNA CONFIGURACION DE LA FIGURA DOS NOS PERMITE CREAR UNA TABLA LOGICA QUE INDICA QUE RECTIFICADORES DEBEN PONERSE EN CONDUCCION Y CUALES NO. PARA UNA MEJOR INTERPRETACION DE LOS MODOS DE CONDUCCION ASUMIREMOS LA SIGUIENTE REFERENCIA EN EL CASO DE UN VOLTAJE POSITIVO NOMBRAMOS VAB COMO PORCION POSITIVA Y VOLTAJE VBA COMO PORCION NEGATIVA. ASUMIMOS QUE EL RECTIFICADOR CONTROLADO SE DISPARA CON UN PULSO.

                   

 

ESQUEMA DE REGULACIÓN CON SCR

 

Zona 1

Zona 2

Zona 3

Zona 4

Zona 5

Zona 6

Vab-Vbc-Vac

Vab-Vcb-Vac

Vab- Vcb-Vca

Vba-Vcb-Vca

Vba-Vbc-Vca

Vba-Vbc-Vac

Fabc=110

Fabc=100

Fabc=101

Fabc=001

Fabc=011

Fabc=010

RANGOS DE DISPARO

Rango Alto Vin= 171-255

 

G1

G2

G3

G4

G5

G6

Zona 1

1

0

1

1

0

1

Zona 2

1

0

0

1

1

1

Zona 3

1

1

0

1

1

0

Zona 4

0

1

1

1

1

0

Zona 5

0

1

1

0

1

1

Zona 6

1

1

1

0

0

1

 Rango Medio Vin= 86-170

 

G1

G2

G3

G4

G5

G6

Zona 1

1

0

1

0

0

1

Zona 2

1

0

0

1

0

1

Zona 3

1

0

0

1

1

0

Zona 4

0

1

0

1

1

0

Zona 5

0

1

1

0

1

0

Zona 6

0

1

1

0

0

1

Rango Bajo Vin= 0-85

 

G1

G2

G3

G4

G5

G6

Zona 1

0

0

1

0

0

1

Zona 2

1

0

0

0

0

1

Zona 3

1

0

0

1

0

0

Zona 4

0

0

0

1

1

0

Zona 5

0

1

0

0

1

0

Zona 6

0

1

1

0

0

0

  BAJAR CODIGO EN CCS Y SIMULACION PROTEUS

 

LECTURA DE ENCODERS ROTATORIOS, utiles para ingresar datos

        

usamos un motor encoder para emular un encoder, opera por interupciones, requiere dos canales de lectura de pulsos, usamos RB0 o la INT y el puerto A0, el programa valida flanco con nivel y decide si incrementa o decrementa la variable.Segun el sentido de rotacion la variable cambia de positivo a negativo.

 

ANALISIS DEL PROGRAMA

#include <encoder.h>
#Byte PortA = 0x05 // Dirección del puerto A
#Byte PortB = 0x06 // Dirección del puerto B
signed int16 i=0;  //fundamental declararla y asignarle un valor de lo contrario no funciona

Inicio de la interupcion en RB= o INT


#INT_EXT
void EXT_isr(void) {


If (bit_test(Portb, 0)) // Si RB0 se ha puesto a 1 (flanco de subida),
{
ext_int_edge(H_TO_L); // entonces activar la siguiente interrupción por flanco de bajada.
If (bit_test(Porta, 0)) // Si RB1 está a 1,
{
output_low(PIN_A1);
i++; // entonces incrementar una unidad el valor de X.
}
}
Else // Si RB0 se ha puesto a 0 (flanco de bajada),
{
ext_int_edge(L_TO_H); // entonces activar la siguiente interrupción por flanco de subida.
If (bit_test(Porta, 0)) // Si RB1 está 1,
{
output_high(PIN_A1);
i--; // entonces decrementar una unidad el valor de X.
}
}

}


DEFINICIONES DEL LCD


#define LCD_ENABLE_PIN PIN_B1
#define LCD_RS_PIN PIN_B2
#define LCD_RW_PIN PIN_B3
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#include <lcd.c>

 

PROGRAMA PRINCIPAL

void main()
{

port_b_pullups(0xFF);

enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
Set_Tris_A(0b11111101); // Puerto A todo entradas (en este caso no usamos el Puerto A).
Set_Tris_B(0b00000001); // Puerto B todo entradas (sólo usamos las entradas RB0 y RB1).

lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"pulsos=");
while(TRUE)
{
lcd_gotoxy(8,1);
printf(lcd_putc,"%Ld",i );// ESTA PARTE ES MUY IMPORTANTE SOLO ASI SE IMPRIMEN VARIABLES GRANDES
//printf(lcd_putc,"Pulsos=%d",i);

//TODO: User Code
}

}

DESCARGAR PROGRAMA Y SIMULACION PROTEUS

EJEMPLOS BASICOS CON EL PUERTO SERIE

Los siguientes ejemplos tiene como objetivo que usted este en capacidad de enviar y recibir tanto caracteres como cadenas cortas utiles en controles, atraves dispositivos de comunicaciones telefonos celulares y mas adelante incorporar dispositivos de comunicaciones bluetooth a sus proyectos la unica forma de hacer que una aplicacion telefono celular o tableta se comunique con hardware externo se reduce a Conexion web, Red de celulares GSM/GPRS, Enlace bluetooth, Enlace USB. Todos los anteriores exigen que usted tenga habilidades minimas en el tema de conformar detectar y transmitir y recibir tanto cadenas como caracteres. Sin estas habilidades minimas usted nunca podra abordar este tipo de retos.

COMPARAR CADENAS: este programa valida una cadena de seis caracteres y la compara, dependiendo de su validez envia mensaje atraves de una consola serial. esta version usa la consola de proteus igual se puede adaptar atraves de un compin virtual de proteus a otro tipo de conexion virtual o real.

ANALISIS DEL PROGRAMA

#include <16F876.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#include <string.h>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=DATOS)
#use standard_io(C)
#use standard_io(B)

#include <string.h>

char clave[7];
char claveEEPROM[7];
char validar;
int a;

FUNCIONES PARA LEER Y ESCRIBIR

void modPassword()
{
char caracter;
int cont = 0;
printf(" Ingrese el password y presione ENTER (6 caracteres): ");
caracter = fgetc(DATOS);
write_eeprom(cont, caracter);
cont++;
while(caracter!=13)
{
caracter = fgetc(DATOS);
write_eeprom(cont, caracter);
cont++;
if(cont==7)
{
write_eeprom(cont, 13);
caracter = 13;
}
}
}

void leePassword()
{
int cont = 0;
char leerEEPROM;
char pswdTMP[2];

leerEEPROM = read_eeprom(20);
if(leerEEPROM!=0)
write_eeprom(20,0);

leerEEPROM = read_eeprom(cont);
while(leerEEPROM!=13)
{
sprintf(pswdTMP, "%c", leerEEPROM);
strcat(claveEEPROM, pswdTMP);
cont++;
leerEEPROM = read_eeprom(cont);
}
}

Programa principal:


void main()
{

validar = read_eeprom(20);
if(validar==0)
{
leePassword();
}
else
{
modPassword();
leePassword();
}

while(TRUE)
{

printf("Password? ");
fgets(clave, DATOS);
a = strncmp(clave, claveEEPROM, 6);
if(a==0)
printf("Palabra clave CORRECTA!\r");
else
printf("Clave ingresada INCORRECTA!\r");


}

}

BAJAR CODIGO Y SIMULACION

IDENTIFICAR COMANDOS: comandos son cadenas cortas que al ser transmitidas y recibidas son validadas por un procesador y este las lee las identifica y las compara con cadenas fijas y segun su coincidencia se ejecutan ordenes en el procesador se usan en conexiones tipo bluetooth para celulares y tablets.

Este ejemplo enciende o paga tres leds segun reciba por puerto serie las siguientes seis cadenas. Esto se puede generalizar a mas cadenas para esto no hay limite.

UNO,DOS,TRES,CUATRO,CINCO,SEIS...para encender o apagar los tres leds..

ANALISIS DEL PROGRAMA:

#include <16F628a.h>
#device adc=16
#FUSES NOWDT
#FUSES XT
#FUSES NOBROWNOUT
#FUSES NOLVP
#use delay(clock=4000000)
#use STANDARD_IO(B)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=DATOS)

//Se debe incluir el archivo string.h para el manejo de cadenas en C.
#include <string.h>

char rxString[6];
int c;

void main()
{
printf("Cmd:>");
while(TRUE)
{
if(kbhit(DATOS))
{

//string.h es necesario para usar la función fgets().
fgets(rxString, DATOS);

aca con switch se seleccionan y validan oedenes, para accionar puerto las seis cadenas

switch(&rxString)
{
case "uno": output_high(PIN_B7);
printf(" PIN B0 encendido \r");
break;
case "dos": output_high(PIN_B6);
printf(" PIN B1 encendido \r");
break;
case "tres": output_high(PIN_B5);
printf(" PIN B2 encendido \r");
break;
case "cuatro": output_low(PIN_B7);
printf(" PIN B0 apagado \r");
break;
case "cinco": output_low(PIN_B6);
printf(" PIN B1 apagado \r");
break;
case "seis": output_low(PIN_B5);
printf(" PIN B2 apagado \r");
break;
default: printf(" Comando incorrecto \r");
for(c=0;c<6;c++) //Aquí se limpia rxString[].
rxString[c]="";
break;
}
printf("Cmd:>");
}
}

}

BAJAR CODIGO Y SIMULACION PROTEUS

LEER VALORES ANALOGICOS DEL CONVERSOR A/D Y ENVIARLOS DE SALIDA AL PUERTO SERIE DEL PROCESADOR:

la intencion de este programa es llevar valores analogicos a una aplicacion realizada en plataforma android tipo AppInventor, esta exige que le lleguen los datos en dos paquetes de 16 bits.

ANALISIS DEL PROGRAMA:

#include <appanalogo.h>
int16 q;
int j,k;

void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_2);

while(TRUE)
{
delay_ms(5);
q=read_adc();

if(q<256){ //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)
fputc(q, PORT1);
fputc(0, PORT1);

delay_ms(500);
}
if(q>255){ //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma
j=q/256; //calculo la cifra mas significativa
k=q-j*256; //calculo la cifra menos significativa
fputc(k, PORT1);
fputc(j, PORT1);

delay_ms(500);

}

}


}

BAJAR CODIGO Y SIMULACION PROTEUS.

curso de programacion de microcontroladores pic BASICO

CLASE 1 CLASE 2 CLASE 3 CLASE 4 CLASE5
CLASE 6 CLASE 7 CLASE8 CLASE 9 CLASE 10
CLASE 11 CLASE 12 CLASE 13 CLASE 14 CLASE 15
CLASE 16 CLASE 17 CLASE 18 CLASE 19 CLASE 20
CLASE 21 CLASE 22

curso de programacion de microcontroladores PIC AVANZADO

CLASE 1 CLASE 2 CLASE 3 CLASE 4 CLASE 5
CLASE 6 CLASE 7 CLASE 8 CLASE 9 CLASE 10
         
         
         

PROGRAMAS UTILES EN CONEXIONES SERIALES

DOCLIGHT: envia secuencias de comandos o cadenas fundamentales en depurar sistemas de comunicaciones o procesadores de cadenas

VIRTUAL SERIAL PORT EMULADOR:  emula puertos y conexiones seriales. Video de como usarlo