TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 19 de Agosto de 2008, 12:34:21
-
Hola a todos, tengo una preguntica... El modo sleep afecta de alguna manera la TRasmisión EUSART??... Lo pregunto porque, tengo al 4550 trabajandolo en modo Sleep con un conversor analogico digital... Basicamente lo que hace el programa es toma el dato del canal del conversor, lo muestra en el hyperterminal y se duerme... y así ando el programa... Pero la cuestión está en que cuando a mostrar en la pc, pues se ven las letras que mando a mostrar pero la cifrá que está viendo el conversor pues se ven como caracteres grises en la pantalla del hyperterminal... Ahora cuando le quito el modo sleep me doy cuenta de que en el hyperterminal si se denota la cantidad que está midiendo el conversor....
Alguién me poría decir que estará pasando?? No se será por la tasa de transferencia? o por que el pic se está durmiendo antes de enviar el dato al hyperterminal... Esto no creo que sea, puesto que lo mando a la LCD y si se muestra bien... No se pienso que es con el bus rs232 que es muy lento y se solapna los valores, o no se!!! :?
Atte: Enigma... La llanerita de Guayana :-)
-
Yo creo que no deberías enviar al micro a la cama hasta que termine la transmisión USART. Hay un bit que te indica que la comunicación ha terminado; quizás puedas hacer un bucle hasta que el bit cambie de signo antes de meter SLEEP.
-
Por otros motivos pero aquí (http://www.todopic.com.ar/foros/index.php?topic=22785.msg181793#msg181793) termino hablando del SLEEP y de la USART. Y la razón es exactamente la que tú apuntas en tu última frase, la USART es muy, muy, muy lenta y el SLEEP la alcanza antes de terminar de transmitir.
-
Umm... Entiendo... Entonces una solución razonable seria colocar el bus a mayor velocidad?? o se me ocurre colocar un delay antes de que entre a dormir...??? :?
Atte: Enigma... La llanerita de Guayana :-)
-
Mejor explora el bit que te digo en un bucle hasta que cambie de estado.
-
O.k... Voy a probar tu sugerencia nocturno!!! Gracias... Luego publico como me fue!! :mrgreen:
Atte: Enigma... La llanerita de Guayana :-)
-
Hola que tal... He aquí mis respuestas con el experimiento!!! He tratado de transmitir y pues nada... Como el modula USART es muy lento, pues probe con la sugerencia de Nocturno, chequee el bit que me indica si el buffer está vacio o no... y pues nada, no envia naita de nada... Ni siquiera letras... Nada! probe on un retardito y tampoco... la puse en Autowakeup, y pues ni siquiera transmite un mal caracter, puse en micro en modo IDLE y tampoco!! ya ando loca, no encuntro más nada que hacer... Si alguien pudiera echarme una mano pos le agradeceria...
Aquí dejo el código...
#include <18f4550.h>
#DEVICE ADC=8
#fuses NOPROTECT,NOCPD,NOLVP,WDT64,XT,NOMCLR
#use fast_io (A)
#use fast_io (B)
#use fast_io (D)
#use delay(clock=4000000)
#include "lcd.c" // Libreria de la LCD por el purto B
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Habilita las funciones RS232, velocidad a 9600 baudios
#byte portd= 0xF83
#byte PIR1=0xF9E
#bit TXIF=PIR1.4
#byte BAUDCON=0xFB8
#bit WUE=BAUDCON.1
#byte OSCCON = 0xFD3
#bit IDLEN=OSCCON.7
#bit SCS0=OSCCON.0
#bit SCS1=OSCCON.1
//::::::::::::::::::::::::::Declaración de variables:::::::::::::::::::::::::::::::::::::
float dato,value,valord,value1,valord1,dato1;
int x=0;
//:::::::::::::::::::::::::::Programa Principal:::::::::::::::::::::::::::::::::::::::::::
void main(void)
{
set_tris_a(0xe7); // Puerto A, como b'11100111
set_tris_b(0x00); // Puerto B, como b'00000000 (salida)
set_tris_d(0x00); // Puerto D, como b'11111111 (salida)
output_a(0); // Limpio el puerto A
output_c(0); // Limpio el puerto C
output_b(0); // Limpio el puerto B
setup_wdt(WDT_ON); // Watchdog Encedido
setup_port_a(AN0_ANALOG ); // RA0 son analógicos y los demás son digitales
//WUE=1;
lcd_init(); // para inicializar el LCD
restart_wdt(); // Inicio el perro Guardian
while(true)
{
restart_wdt(); // Inicio el perro Guardian
IDLEN=1;
SCS1=0;
SCS0=0;
SLEEP(); // Modo sleep
// Se desborda Watchdog y sale del modo Sleep
if (restart_cause()==WDT_FROM_SLEEP) // Si el pic despierta por watchdog, entonces...
{
if(x==0) // Pregunto por bandera
{
setup_adc(ADC_CLOCK_INTERNAL ); // Tomará el dato contando el tiempo con el reloj interno
set_adc_channel(0); // El canal de adquisición del dato es el RA0
delay_ms(10); // Un retardo para capturar bien el dato
value=read_adc(); // Leo el dato
valord=(value*0.4); // Multiplico el valor por 0.4 para hacer la equivalencia a 2V
portd=valord; // Lo mando al puerto D
dato=(valord*5)/255; // Convierto el valor a decimal y lo guardo
set_adc_channel(1); // El canal de adquisición del dato es el RA0
delay_us(10); // Un retardo para capturar bien el dato
value1=read_adc(); // Leo el dato del An1 (Realimentación)
valord1=(value1*0.4); // Multiplico el valor por 0.4 para hacer la equivalencia a 2V
dato1=(valord1*5)/255; // Convierto el valor a decimal y lo guardo
setup_adc (ADC_OFF); // Apago el conversor A/D
x=1; // Seteo la bandera
}
else if (x==1) // Si x es igual a 1
{
printf(lcd_putc,"\f"); // Borro la pantalla LCD
dato=(value*5)/255; // Convierto el valor a decimal y lo guardo
printf(lcd_putc,"Voltaje= %2.2g",dato); // Mando a mostrar el valor del conversor en la LCD
printf("\f"); // Limpio pantalla del hyperterminal
printf(" Voltaje= %2.2g V",dato); // Mando a mostrar el valor del conversor
delay_ms(500);
band: if(txif==0)
{ goto band;
}
x=0; // Reseteo la bandera
}
}
}
}
Atte Enigma... La llanerita de Guayana :-)
-
Una preguntica... La trasmisión a través del modulo EUSART, aumenta coniderablemente el consumo de corriente del microcontrolador cierto???, Así el pic este en modo Sleep o IDLE????
Atte: Enigma... LA llanerita de Guayana :-)
-
Hola... Bueno hasta que al fin logre transmitir vía USART con el Sleep puesto!!! :D despues de mover, aquí, mover allá!!! Lo único malo es que el consumo total de circuito, es decir, el pic + el MAX232 + 2 MAX485 (ADM485AN) + las resistencias + condensadores + potenciometros me dan mucho consumo de corriente!! 26 mA :shock: Berro ya he hecho de todo para bajarle ese consumo... Tengo a los pobres integrados pariendo, alimentandolos con 3,7V... Al pobre MAX232 lo estoy alimentando con menos de 1mA...
Pero el que me está echano la partida para atrás es el max485 que va pegado al max2332, que me está consumiendo 22mA, mientras que el otro está consumiendo 0.6mA... :8} ...
Alguna idea de como bajar estos consumos de corriente?? :z)
Atte: Enigma... La llanerita de Guayana :-)