MLO, micro23, como les dije anteriormente mi propósito es introducirme en C debido
a las ventajas que ofrece este lenguaje.
mi metodología de aprendizaje es resolver con C las aplicaciones básicas del PIC
llevo una semana trabajanco con C y creo que ya he avanzado algo.
les comparto el siguiente codigo de un conversor AD con paramteros programables
de setpoint y un visualizador de 4 digitos. lo hesimulado eh proteus y funciona perfecto.
hasta pronto.
#include <16c73A.h>
#device adc=10
#use delay(clock=4000000)
#fuses XT,PUT,BROWNOUT,NOWDT
#byte porta=5 //Definicion de variables del pic
#byte portb=6
#byte portc=7
#byte t1con=0x10
#byte adcon0=0x1f
#byte adcon1=0x9f
#byte adresl=0x9e
#byte adresh=0x1e
#define q1 porta,1 //Definicion de bits
#define q2 porta,2
#define q3 porta,3
#define q4 porta,4
#define salida porta,5
#define ad_ini adcon0,2
int unid,dece,cent,u_mil; //Definicion de variables
int respaldo; //Variable de 8 bit
int16 set_point; //Variable de 16 bit
int16 valor_ad;
int16 respaldo16;
int32 respaldo32; //Variable de 32 bit
short int ban_osc; //Variables de 1 bit
Short int ban_hab;
Short int ban_05seg;
short int ban_tec1;
short int ban_tec2;
short int ban_tec3;
short int ban_tec4;
short int ban_tec5;
short int ban_tec6;
short int ban_tec7;
short int ban_tec8;
short int ban_tec9;
short int ban_tec10;
short int ban_tec11;
short int ban_tec12;
short int ban_tec13;
short int ban_tec14;
short int ban_tec15;
short int ban_tec16;
byte const segmentos[11]={0b00111111, //Definicion de variables constantes
0b00000110, //o tablas por medio de una matriz
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00100111,
0b01111111,
0b01101111,
0b01000000};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#int_timer1 //Vector de interrupcion por desbordamiento del
void interrupcion_tmr1() //timer 1
{
set_timer1(3036); //Se carga el timer 1 con valor
///////////////////////////////////////
ban_05seg=1;
}
///////////////////////////////////////////////////////////////////////////////
void bcd_bin() //Rutina de conversión bcd a binario de 16 bit
{
respaldo16=0; //Cuando una operación genere carry se recomienda anteponer
//la sentencia (int16)
respaldo16=(int16)u_mil*1000+(int16)cent*100+(int16)dece*10+unid;
set_point=respaldo16;
}
///////////////////////////////////////////////////////////////////////////////
void bin_bcd() //Rutina de conversión binario 16 bit a decima 4 digitos
{
u_mil=0;
cent=0;
dece=0;
unid=0;
if(ban_hab==1)
{
respaldo16=set_point;
}
else
{
respaldo16=valor_ad;
}
u_mil=respaldo16/1000;
respaldo16=respaldo16%1000; //El símbolo % se utiliza para que deje en la
//variable el residuo de la operacion
cent=respaldo16/100; //respaldo16/1000
respaldo16=respaldo16%100;
dece=respaldo16/10;
respaldo16=respaldo16%10;
unid=respaldo16;
}
///////////////////////////////////////////////////////////////////////////////
void rotar() //Rutina que desplaza los dígitos en el display
{ //cuando se presiona una tecla
u_mil=cent;
cent=dece;
dece=unid;
unid=respaldo;
bcd_bin();
}
///////////////////////////////////////////////////////////////////////////////
void display() //Rutina general del display
{
bin_bcd();
portc=(segmentos[unid]);
if(ban_osc!=1)
{bit_set(q4);}
delay_ms(1);
bit_clear(q4);
portc=(segmentos[dece]);
if(ban_osc!=1)
{bit_set(q3);}
delay_ms(1);
bit_clear(q3);
portc=(segmentos[cent]);
if(ban_osc!=1)
{bit_set(q2);}
delay_ms(1);
bit_clear(q2);
portc=(segmentos[u_mil]);
if(ban_osc!=1)
{bit_set(q1);}
delay_ms(1);
bit_clear(q1);
}
///////////////////////////////////////////////////////////////////////////////
void teclado() //Rutina general de teclado
{
portb=(0x0f);
bit_clear(portb,0);
delay_us(100);
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,7)==0)&&(ban_tec1==0))
{
ban_tec1=1;
respaldo = 1;
rotar();
}
if(bit_test(portb,7)==1)
{
ban_tec1=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,6)==0)&&(ban_tec2==0))
{
ban_tec2=1;
respaldo = 2;
rotar();
}
if(bit_test(portb,6)==1)
{
ban_tec2=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,5)==0)&&(ban_tec3==0))
{
ban_tec3=1;
respaldo = 3;
rotar();
}
if(bit_test(portb,5)==1)
{
ban_tec3=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,4)==0)&&(ban_tec4==0))
{
ban_tec4=1;
respaldo = 4;
rotar();
}
if(bit_test(portb,4)==1)
{
ban_tec4=0;
}
}
bit_set(portb,0);
bit_clear(portb,1);
delay_us(100);
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,7)==0)&&(ban_tec5==0))
{
ban_tec5=1;
respaldo = 5;
rotar();
}
if(bit_test(portb,7)==1)
{
ban_tec5=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,6)==0)&&(ban_tec6==0))
{
ban_tec6=1;
respaldo = 6;
rotar();
}
if(bit_test(portb,6)==1)
{
ban_tec6=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,5)==0)&&(ban_tec7==0))
{
ban_tec7=1;
respaldo = 7;
rotar();
}
if(bit_test(portb,5)==1)
{
ban_tec7=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,4)==0)&&(ban_tec8==0))
{
ban_tec8=1;
respaldo = 8;
rotar();
}
if(bit_test(portb,4)==1)
{
ban_tec8=0;
}
}
bit_set(portb,1);
bit_clear(portb,2);
delay_us(100);
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,7)==0)&&(ban_tec9==0))
{
ban_tec9=1;
respaldo = 9;
rotar();
}
if(bit_test(portb,7)==1)
{
ban_tec9=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,6)==0)&&(ban_tec10==0))
{
ban_tec10=1;
respaldo = 0;
rotar();
}
if(bit_test(portb,6)==1)
{
ban_tec10=0;
}
}
//////////////////
if(ban_hab==1)
{
if((bit_test(portb,5)==0)&&(ban_tec11==0))
{
set_point=0;
}
if(bit_test(portb,5)==1)
{
ban_tec11=0;
}
}
//////////////////
if((bit_test(portb,4)==0)&&(ban_tec12==0))
{
ban_tec12=1;
if(ban_hab==1)
{
ban_hab=0;
ban_osc=0;
}
else
{
ban_hab=1;
ban_osc=1;
}
}
if(bit_test(portb,4)==1)
{
ban_tec12=0;
}
bit_set(portb,2);
}
///////////////////////////////////////////////////////////////////////////////
void osc_display() //Rutina que alterna la bandera que hace oscilar
{ //el display
if(ban_hab==1)
{
if(ban_osc==1)
{
ban_osc=0;
}
else
{
ban_osc=1;
}
}
}
///////////////////////////////////////////////////////////////////////////////
void conversion_ad()
{
//set_adc_channel(0);
//delay_us(10);
//valor_ad = read_adc();
bit_set(ad_ini); //Se da inicio a la conversion
while(ad_ini==1); //Se espera a que finalice la conversion
valor_ad=((int16)adresh*256)+adresl; //Se suma los productos de los registos
//adresh y adresl en una sola variable
respaldo32=((int32)valor_ad*100)/1023; //Se entrega el valor en porcentaje
valor_ad=respaldo32;
///////////////////////////////////////
if(valor_ad>=set_point) //Si valor_ad es mayor que set ponit activa la salida
{bit_set(salida);}
else
{bit_clear(salida);}//De lo contrario la apaga
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram
main() //Rutina principal
{
set_tris_a(0b000001); //Configuracion de entradas y salidas del puerto A
set_tris_b(0b11110000); //Configuracion de entradas y salidas del puerto B
set_tris_c(0b00000000); //Configuracion de entradas y salidas del puerto C
port_b_pullups(true); //Habilitación de las resistencias pull-ups
t1con=(0b00110101); //Configuracion del tmr1
adcon0=0x01;
adcon1=0x8e;
enable_interrupts(global); //Habilitación de todas las interrupciones
enable_interrupts(int_timer1); //Habilitación de la interrupción del Tmr1
porta=0; //Porta inicia en 0
portb=0; //Portb inicia en 0
portc=0; //Portc inicia en 0
set_point=25;
while(true) //Rutina general
{
teclado();
display();
conversion_ad();
if(ban_05seg==1)
{
ban_05seg=0;
osc_display();
}
}
}
///////////////////////////////////////////////////////////////////////////////