Autor Tema: conversion a/d, usb, timer0 ayuda novato  (Leído 1521 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado don_petaka

  • PIC10
  • *
  • Mensajes: 4
conversion a/d, usb, timer0 ayuda novato
« en: 15 de Noviembre de 2010, 17:41:30 »
Soy nuevo en el foro y en el tema de pics, estoy haciendo un adquisidora que debe andar a 200 Hz (poca frecuencia y ni asi consigo que ande). Al codigo lo hice en ccs y lo simulo en proteus.

El problema por lo que veo es que la interrupcion se cuelga y encima me ocupa el tiempo total que necesito (5 ms= 1/200) en hacer la transmicion usb y la conversion cad por lo que pude ver en lo que se me va la mayoria del tiempo es en la transmicion usb (raro, la tengo a 19200 baudios), pero si lo hago ejecutar fuera de la interrupcion me hace lo que quiere con los tiempos, es como que tiene una frecuencia de adquisicion variable.
Experimente hacerlo con el timer0 pero me daba demasiado tiempo entre interrupcion e interrupcion (no se porque porque teoricamente lo programaba con el tiempo como para que dé hasta me puse a variar los preescaler y seguia haciendo cualquiera)

Luego prove con el timer1 y hace cuatro ciclos y queda en alto la bandera que puse para controlar el tiempo y ademas deja de transmitir datos por el hiperterminal, ha otra cosa sino hago correr el hiperterminal es como que no entra en la interrucion (es porque no lo enumera hasta que lo intento leer con un programa porque sino no entiendo que hace).

Bueno espero no haberlos mareado y que me puedan guiar un poco.

Código: [Seleccionar]
#include <18f2550.h>

#device adc=10
#use delay(clock=48000000)
#fuses hspll,nowdt,noprotect,nolvp,nodebug,usbdiv,PLL5,CPUDIV1,VREGEN
short estado_usb;// es importante que esta variable sea creada aca debido
#include <usb_cdc.h>
//#use standard_io(c)                                no se si ponerlo por el tema de usar los puertos

void mostrar_estado_usb(int1 estado_usb);
float p,f,co;
int16 pd,fd,cod;

#int_timer1
void temp1s() {

output_high(PIN_c0);                          //bandera para controlar los tiempos de ejecucion en el proteus

set_adc_channel(0);
delay_us(16);
pd=read_adc();
set_adc_channel(1);
delay_us(16);
fd=read_adc();
set_adc_channel(2);
delay_us(16);
cod=read_adc();

p=(5.0*pd/1024.0);
f=(5.0*fd/1024.0)+5.0;
co=(5.0*cod/1024.0)+10.0;                             //conversion asi nomas de unidades

if (usb_enumerated()){
usb_task();
printf( usb_cdc_putc,"%g\n\r",p );
printf( usb_cdc_putc,"%g\n\r",f );
printf( usb_cdc_putc,"%g\n\r",co );                     // por lo que medi esta parte es la que consume todo el tiempo haciendo que esta interrupcion lleve mas de 5 ms                                                  //                                                                    // prove poner numeros mas chicos para darle tiempo de que pase la interrupcion y nada
output_low(PIN_c0);
set_timer1(61786);
}
}

//-------------------------------------------------------

void main(){
//disable_interrupts(global);
//estado_usb = 0;
//mostrar_estado_usb(estado_usb);
setup_adc_ports (an0_to_an2_analog);
setup_adc(ADC_CLOCK_DIV_64);                                                      //|| ADC_ACQT_2TAD );
#asm
movlw 0b10001110 ;                                                                         //justificacion_derecha,2Tad,Fosc/64
iorwf 0xFC0,1 ;                                                                                // direccion de ADCON2
#endasm
delay_us(3);

usb_cdc_init();
usb_init();
//usb_task();                                                           
setup_timer_1(t1_internal|t1_div_by_8);
set_timer1(61786);
while (!usb_cdc_connected()) {}                                                 
enable_interrupts(int_timer1);
enable_interrupts(global);
while(true){};
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: conversion a/d, usb, timer0 ayuda novato
« Respuesta #1 en: 15 de Noviembre de 2010, 17:44:30 »
Como trabajas las interrupciones no es lo adecuado. Las rutinas deben ser cortas y rápidas, no realizar bucles o enviar datos mediante printf  :shock: En una interrupción puedes realizar la captura de los valores analógicos, y activar una bandera para ser tratada como corresponde en el bucle principal.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado don_petaka

  • PIC10
  • *
  • Mensajes: 4
Re: conversion a/d, usb, timer0 ayuda novato
« Respuesta #2 en: 15 de Noviembre de 2010, 19:04:06 »
Como trabajas las interrupciones no es lo adecuado. Las rutinas deben ser cortas y rápidas, no realizar bucles o enviar datos mediante printf  :shock: En una interrupción puedes realizar la captura de los valores analógicos, y activar una bandera para ser tratada como corresponde en el bucle principal.


Saludos!

sos un groso te deberia invitar una cerveza, anduvo de diez solo con ese cambio, o sea saque el codigo de transmicion usb, lo puse en dentro del while infito que esta a lo ultimo y le puse una bandera con un if que dentro de el cambia a otro valor como para que se ejecute una sola vez y que en la interrupcion tome el valor necesario para el if y listo, anda re bien.

espero que a alguien le sirva.