por eletroinf » 04 Abr 2007 17:17
Aqui vai um pedaço de um programa que fiz para mostrar a temperatura medida com um sensor tmp122. A biblioteca do tmp122 não está incluída, apenas a parte que lida com os displays. A multiplexação utiliza a interrupção do timer 0. Fiz esse código quando estava aprendendo C, já faz um bom tempo, portanto... sem detalhes! heheheh bom proveito!
A sim, o código é para o (arghhh!) CCS, com muitas das suas "mãnhas".
/*Termômetro com sensor TMP122 (TI).
Processador: PIC 16F628.
Comunicação serial com o sensor (SPI 16bit).
*/
#include <16f628.h> //Includes do pic usado.
#include <tmp122pic.c>
#fuses NOWDT,NOBROWNOUT,NOMCLR,NOPROTECT,INTRC_IO, PUT, NOLVP
#use delay(clock = 4000000)
#use fast_io(A)
#use fast_io(B)
#bit t0if = 0x0b.2
#byte status = 0x03
#byte porta = 0x05
#byte portb = 0x06
#byte cmcon = 0x1F
#byte intcon = 0x0B
#byte option_reg = 0x81
#byte tmr0 = 0x01
#define d_und pin_a0 //Acionamento dos dígitos dos displays.
#define d_dez pin_a7
#define d_cent pin_a6
#define d_mil pin_b7
int flags = 0;
int mux_disp = 0;
int displays[4] = {0,0,0,0}; //Armazena os dígitos: xxx.x.
int disp_tmp[5];
int temp = 0;
float temperatura;
#bit tmp_lido = flags.0
#bit bit_sig = celsius.12 //Bit de sinal da temperatura.
#bit sinal = flags.1
byte const tab_display[]={
0b10111111, // 0
0b10000110, // 1
0b11011011, // 2
0b11001111, // 3
0b11100110, // 4
0b11101101, // 5
0b11111101, // 6
0b10000111, // 7
0b11111111, // 8
0b11101111, // 9
0b10000000, //
0b11000000, // -
0b11110111, // A
0b11111100, // b
0b10111001, // C
0b11011110, // D
0b11111001, // E
0b11110001, // F
0b10111000, // L
0b11110110}; // H
#int_timer0
void trata_int()
{
int temp;
if (tmp_lido)
{
if (disp_tmp[3] == '.')
{
displays[3] = (disp_tmp[4]) - 0x30;
displays[2] = (disp_tmp[2]) - 0x30;
displays[1] = (disp_tmp[1]) - 0x30;
displays[0] = (disp_tmp[0]) - 0x30;
}
if (disp_tmp[2] == '.')
{
displays[3] = (disp_tmp[3]) - 0x30;
displays[2] = (disp_tmp[1]) - 0x30;
displays[1] = (disp_tmp[0]) - 0x30;
if (sinal)
{
displays[0] = 11; //Sinal negativo "-".
}else
{
displays[0] = 10; //Dígito apagado.
}
}
if (disp_tmp[1] == '.')
{
displays[3] = (disp_tmp[2]) - 0x30;
displays[2] = (disp_tmp[0]) - 0x30;
if (sinal)
{
displays[1] = 11;
}else
{
displays[1] = 10;
}
displays[0] = 10;
}
if (disp_tmp[0] == '.')
{
displays[3] = (disp_tmp[1]) - 0x30;
displays[2] = 0;
if (sinal)
{
displays[1] = 11;
}else
{
displays[1] = 10;
}
displays[0] = 10;
}
tmp_lido = 0;
}
switch (mux_disp)
{
case 0: output_high(d_mil); //Desliga o display "milhar".
temp = displays[3];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_und); //Liga o dígito das unidades.
mux_disp++;
break;
case 1: output_high(d_und); //Desliga o dígito das unidades.
temp = displays[2];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_dez); //Liga o dígito das dezenas.
mux_disp++;
break;
case 2:
output_high(d_dez); //Desliga dígito das dezenas.
temp = displays[1];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_cent); //Liga dígito das centenas.
mux_disp++;
break;
case 3: output_high(d_cent);
temp = displays[0];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_mil);
mux_disp = 0;
break;
default: mux_disp = 0;
break;
}
tmr0 = 0;
}
void inicia_pinos(void)
{
set_tris_a(0b00110010); //Inicialmente RA0 é entrada. RA3 é somente entrada.
set_tris_b(0b00000000); //Todo portb é saída.
delay_cycles(1);
output_high(cs);
delay_cycles(1);
output_high(sck);
delay_cycles(1);
output_high(d_und); //Desliga os displays.
delay_cycles(1);
output_high(d_dez);
delay_cycles(1);
output_high(d_cent);
delay_cycles(1);
output_high(d_mil);
}
void main ()
{
option_reg = 0b10000001; // setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_4);
intcon = 0b11100000;
cmcon= 0b111;
inicia_pinos();
valor_config = config12bit;
config_tmp122();
delay_ms (2000); //Tempo na inicialização (2 segundos).
while(true)
{
if (tmp_lido == 0)
{
ler_tmp122();
output_high(cs);
if (bit_sig) //Se a temperatura for negativa...
{
celsius = ~celsius; //Complementa os bits.
celsius ++; //Incremento unitário.
celsius &= 0xFFF; //Zera os 4 MSB.
sinal = 1; //Indica temperatura negativa.
}else
{
sinal = 0;
}
temperatura = (float) celsius/16; // celsius * 0.0625.
sprintf(disp_tmp, "%03.1f", temperatura);
celsius = 0;
tmp_lido = 1;
}
}
}