Sie sind auf Seite 1von 3

/home/trindade/rea de Trabalho/dataloguer/PIC/Serial/DataLogger.

c
Pgina 1 de 3
Ter 20 Mar 2012 09:01:49 BRT
1
2
3
4

// data logger pela porta serial


// le entradas AN0 a AN12
// conversao A/D de 10bits
// envia continuamente saidas no formato ANxx:nnnn (de 0000 a 102
3)
//
// RST - 05/06/2010
//
//
#include <18f4550.h>
#DEVICE ADC=10
#use delay(clock=4000000, RESTART_WDT)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)

5
6
7
8
9
10
11
12
13
14 #fuses XT, WDT, NOPUT, NOMCLR, NOBROWNOUT, NOLVP,NODEBUG,PLL1,CPU
DIV1,VREGEN
15
16 #include <string.h>
17 #include <stdlib.h>
18
19
20 #use
fast_io(a)
21 #use
fast_io(b)
22
23 #byte
porta = 0xf80
24 #byte
portb = 0xf81
25
26 #byte
tris_porta = 0xf92
27 #byte
tris_portb = 0xf93
28
29
30
31 #bit led_heart = portb.7 // bit7 do port
sinal para monitoramen
to heart beat
32 #bit tris_led_heart= tris_portb.7 // bit5 do port
33
34 const int MAX = 21; // mximo de caracteres na string
35
36 int16 T;
37
38 void le_transmite(n){
39
40
int16 valor;
41
42
set_adc_channel(n);
43
delay_us(20);
44
valor = read_adc();
45
printf("C%02d:%04lu",n,valor);
46 }
47
48 #int_timer1
- 1 -

/home/trindade/rea de Trabalho/dataloguer/PIC/Serial/DataLogger.c
Pgina 2 de 3
Ter 20 Mar 2012 09:01:49 BRT
49 void trata_t1() // utiliza a interrupcao do timer1 para gerar eve
ntos a cada 10ms
50 {
51
static int tempo_heart = 0;
52
int i;
53
54
set_timer1(T+get_timer1()); // T para 10ms
55
tempo_heart++;
56
if (tempo_heart == 50){ // 50*10ms-> 500ms
57
tempo_heart = 0;
58
led_heart = !led_heart;
59
for (i=0; i<6; i++){
60
le_transmite(i);
61
}
62
printf("\r\n");
63
}
64
65 }
66
67 void trata_st(char *st)
68
{
69
char ch;
70
71
ch = st[0];
72
if (ch == 'F') // fora start com PWM mximo ou stop zerando
variveis
73
{
74
75
76
}
77
else if (ch == 'T') // valor de set do timer1
78
{
79
printf("T=%04lu, ",T);
80
}
81
else if (ch == '?') // lista os parmetros internos
82
{
83
printf("Parmetros: \n\r T=%04lu, ",T);
84
}
85
}
86
87 void main()
88 {
89
char st[MAX];
90
91
delay_ms(100); // para estabilizar
92
93
tris_led_heart = 0;
94
95
led_heart = 1;
96
97
// setup_wdt(WDT_2304MS);
- 2 -

/home/trindade/rea de Trabalho/dataloguer/PIC/Serial/DataLogger.c
Pgina 3 de 3
Ter 20 Mar 2012 09:01:49 BRT
98
99

setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); // timer 1 com presc


aler de 1:2 e clock de 4000000Hz (T1_internal, divide por 4)
100
// frequencia -> 4000000/4/2=500000hz;
T = 2us; para 10ms, 10000us/2us=5000 contagens;
101
// Inicio do contador em 65536-5000= 6
0536; contador de 16 bits (timer1) -> 65536
102
103
104 // carrega contextos salvos anteriormente
105 //
VV1 = busca_contexto(0);
106
107
T= 65536-5000;
108
set_timer1(T);
109
110
111
enable_interrupts(global);
112
enable_interrupts(int_timer1);
113
114
115
delay_ms(100);
116
117
printf("RESET\r\n");
118
119 //
setup_port_a( ALL_ANALOG );
120
setup_adc_ports( ALL_ANALOG ); // AN0 at AN11 ports A, B, E
121
setup_adc( ADC_CLOCK_INTERNAL );
122
123
124
while (true)
125
{
126
restart_wdt();
127
if (kbhit()) // se existe dado na serial, efetua leitura
128
{
129
gets(st);
130
trata_st(st);
131
}
132
133
}
134 }
135

- 3 -

Das könnte Ihnen auch gefallen