Minha Ideia--->> Como o PIC realizava a leitura do canal AD e enviava os dados dentro do loop main eu estava interessado em saber quanto tempo era transcorrido entre o inicio e o fim de uma parte da rotina com todos os seus printf e delays. Utilizei um TIMER, mas quando a comunicação CDC é iniciada acredito que o compilador desabilita as interrupções pois ele diz que irá fazer (warnin 216 : interrupts disableb during call to prevent re-entrancy) lo meu método tem uma falha. Alguém conhece alguma forma menos tupiniquim para realizar essa tarefa?(se é que existe)
- Código: Selecionar todos
#int_timer0
void Timer0_interrupt (void){
if(flag==1){
++tempo;
}
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit); //21,3 us overflow
setup_timer_2(T2_DIV_BY_4,0,15); //0,3 us overflow, 5,0 us interrupt
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel( 0 );
delay_ms(1);
Disable_interrupts(GLOBAL);
lcd_init();
enable_interrupts(INT_TIMER0);
enable_interrupts(Global);
usb_cdc_init();
usb_init();
usb_task();
do{
if(dado_lido==0){
Printf(lcd_putc,"\nAguardando Conexao");
}
while (!usb_enumerated()){} // Espera a que o dispositivo seja enumerado
while(!usb_cdc_connected()) {} //Espera conectar
//Contar o tempo da leitura e transmissão dos dados utilizando o timer0
tempo=0;//zera o contador de overflow
flag=1;//libera o contador
set_timer0(0); // zera o timer
leitura_ADC=read_adc();
temperatura=leitura_ADC*0.4887585;
++dado_lido;
if (usb_cdc_putready())printf(usb_cdc_putc,"\rADC=%Lu",leitura_ADC);
if (usb_cdc_putready())printf(usb_cdc_putc,"\r\nDado Lido=%Lu",dado_lido);
if (usb_cdc_putready())printf(usb_cdc_putc,"\r\nTEMP:%2.1f°C ", temperatura); //0.488 = 5.00*temperatura * (100.00/1023.00)
printf(lcd_putc,"\nTemperatura=%Lu",leitura_ADC);
delay_ms(10);
flag=0; // para o contador
//para determinar o tempo total multiplicar a variável tempo pelo overflow (21,3ms)
if (usb_cdc_putready())printf(usb_cdc_putc,"\rTempo=%Lu",tempo);
tempo=0;
}while (TRUE);