TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Autodidacta en 24 de Mayo de 2022, 14:15:07
-
Saludos a todos
Tengo un problema al realizar la rutina de inicialización del modulo hx711.
En el código, la condición DOUT == 1 del segundo ciclo while no se cumple en ningún momento y para obtener datos tengo que forzarlo colocando la condición en uno para probar si funciona el codigo y solo así si obtengo datos, pero no se en que estoy errando para que la condición no se cumpla sin forzarlo, cabe mencionar que soy principiante.
De antemano Gracias por sus respuestas
#include <16f877A.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
//#define use_portb_lcd TRUE
#Include <lcd.c>
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
#BIT DOUT = 0x07.4
#BIT PD_SCK = 0x07.3
void main() {
bit_set(TRISC,4);
bit_clear(TRISC,3);
lcd_init();
while(1){
int i;
unsigned int32 datosdeentrada=0;
PD_SCK=0;
while(DOUT ==1){
printf(lcd_putc,"\f%Ld", datosdeentrada);
for(i=0; i<24; i++){
PD_SCK=1;
datosdeentrada=datosdeentrada<<1;
delay_us(1);//T3 mostrado en el esquema y tabla del datasheet del hx711
PD_SCK=0;
delay_us(1);
if(DOUT==1)
{
datosdeentrada++;
}
}
PD_SCK=1;
datosdeentrada ^ 0x800000;
delay_us(1);
PD_SCK=0;
}
}
}
-
Saludos a todos
Tengo un problema al realizar la rutina de inicialización del modulo hx711.
En el código, la condición DOUT == 1 del segundo ciclo while no se cumple en ningún momento y para obtener datos tengo que forzarlo colocando la condición en uno para probar si funciona el codigo y solo así si obtengo datos, pero no se en que estoy errando para que la condición no se cumpla sin forzarlo, cabe mencionar que soy principiante.
De antemano Gracias por sus respuestas
#include <16f877A.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
//#define use_portb_lcd TRUE
#Include <lcd.c>
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
#BIT DOUT = 0x07.4
#BIT PD_SCK = 0x07.3
void main() {
bit_set(TRISC,4);
bit_clear(TRISC,3);
lcd_init();
while(1){
int i;
unsigned int32 datosdeentrada=0;
PD_SCK=0;
while(DOUT ==1){
printf(lcd_putc,"\f%Ld", datosdeentrada);
for(i=0; i<24; i++){
PD_SCK=1;
datosdeentrada=datosdeentrada<<1;
delay_us(1);//T3 mostrado en el esquema y tabla del datasheet del hx711
PD_SCK=0;
delay_us(1);
if(DOUT==1)
{
datosdeentrada++;
}
}
PD_SCK=1;
datosdeentrada ^ 0x800000;
delay_us(1);
PD_SCK=0;
}
}
}
Parece que ese código que compartes lo has tomado del código ejemplo en C de las hojas de datos del HX711.
No se si es funcionalmente similar aquella referencia, pero me parece que la línea printf(lcd_putc,"\f%Ld", datosdeentrada); podría introducir una latencia que podría producir una pérdida de datos o pulsos de datos mientras el MCU está escribiendo en la pantalla LCD la variable datosdeentrada.
Yo te sugeriría que utilices o el osciloscopio o el analizador lógico para que veas si las formas de onda son como se indican en la Figura 2 de las hojas de datos
Fig.2 Data output, input and gain selection timing and control
-
Saludos a todos
Tengo un problema al realizar la rutina de inicialización del modulo hx711.
En el código, la condición DOUT == 1 del segundo ciclo while no se cumple en ningún momento y para obtener datos tengo que forzarlo colocando la condición en uno para probar si funciona el codigo y solo así si obtengo datos, pero no se en que estoy errando para que la condición no se cumpla sin forzarlo, cabe mencionar que soy principiante.
De antemano Gracias por sus respuestas
#include <16f877A.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
//#define use_portb_lcd TRUE
#Include <lcd.c>
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
#BIT DOUT = 0x07.4
#BIT PD_SCK = 0x07.3
void main() {
bit_set(TRISC,4);
bit_clear(TRISC,3);
lcd_init();
while(1){
int i;
unsigned int32 datosdeentrada=0;
PD_SCK=0;
while(DOUT ==1){
printf(lcd_putc,"\f%Ld", datosdeentrada);
for(i=0; i<24; i++){
PD_SCK=1;
datosdeentrada=datosdeentrada<<1;
delay_us(1);//T3 mostrado en el esquema y tabla del datasheet del hx711
PD_SCK=0;
delay_us(1);
if(DOUT==1)
{
datosdeentrada++;
}
}
PD_SCK=1;
datosdeentrada ^ 0x800000;
delay_us(1);
PD_SCK=0;
}
}
}
Parece que ese código que compartes lo has tomado del código ejemplo en C de las hojas de datos del HX711.
No se si es funcionalmente similar aquella referencia, pero me parece que la línea printf(lcd_putc,"\f%Ld", datosdeentrada); podría introducir una latencia que podría producir una pérdida de datos o pulsos de datos mientras el MCU está escribiendo en la pantalla LCD la variable datosdeentrada.
Yo te sugeriría que utilices o el osciloscopio o el analizador lógico para que veas si las formas de onda son como se indican en la Figura 2 de las hojas de datos
Fig.2 Data output, input and gain selection timing and control
Gracias DominusDRR por tu respuesta.
Como lo había mencionado, estoy aprendiendo a usar el compilador en horas que tengo libre, al analizar el código y probarlo encontré que en el segundo while no debe de llevar llaves {} sino que la linea debe terminar con ; y quedaría así, while(DOUT ==1); no entiendo por que ya que en el lenguaje C un ciclo While debería llevar {}. El segundo error que encontré es que en la linea datosdeentrada ^ 0x800000; esta mal y quedaría así, datosdeentrada=datosdeentrada ^ 0x800000; Y por ultimo y lo que bien comentabas es que la linea
printf(lcd_putc,"\f%Ld", datosdeentrada); debería ir al terminar de obtener todos los datos y así imprimir el dato final es decir después de la linea PD_SCK=0;
-
Saludos a todos
Tengo un problema al realizar la rutina de inicialización del modulo hx711.
En el código, la condición DOUT == 1 del segundo ciclo while no se cumple en ningún momento y para obtener datos tengo que forzarlo colocando la condición en uno para probar si funciona el codigo y solo así si obtengo datos, pero no se en que estoy errando para que la condición no se cumpla sin forzarlo, cabe mencionar que soy principiante.
De antemano Gracias por sus respuestas
#include <16f877A.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
//#define use_portb_lcd TRUE
#Include <lcd.c>
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
#BIT DOUT = 0x07.4
#BIT PD_SCK = 0x07.3
void main() {
bit_set(TRISC,4);
bit_clear(TRISC,3);
lcd_init();
while(1){
int i;
unsigned int32 datosdeentrada=0;
PD_SCK=0;
while(DOUT ==1){
printf(lcd_putc,"\f%Ld", datosdeentrada);
for(i=0; i<24; i++){
PD_SCK=1;
datosdeentrada=datosdeentrada<<1;
delay_us(1);//T3 mostrado en el esquema y tabla del datasheet del hx711
PD_SCK=0;
delay_us(1);
if(DOUT==1)
{
datosdeentrada++;
}
}
PD_SCK=1;
datosdeentrada ^ 0x800000;
delay_us(1);
PD_SCK=0;
}
}
}
Parece que ese código que compartes lo has tomado del código ejemplo en C de las hojas de datos del HX711.
No se si es funcionalmente similar aquella referencia, pero me parece que la línea printf(lcd_putc,"\f%Ld", datosdeentrada); podría introducir una latencia que podría producir una pérdida de datos o pulsos de datos mientras el MCU está escribiendo en la pantalla LCD la variable datosdeentrada.
Yo te sugeriría que utilices o el osciloscopio o el analizador lógico para que veas si las formas de onda son como se indican en la Figura 2 de las hojas de datos
Fig.2 Data output, input and gain selection timing and control
Gracias DominusDRR por tu respuesta.
Como lo había mencionado, estoy aprendiendo a usar el compilador en horas que tengo libre, al analizar el código y probarlo encontré que en el segundo while no debe de llevar llaves {} sino que la linea debe terminar con ; y quedaría así, while(DOUT ==1); no entiendo por que ya que en el lenguaje C un ciclo While debería llevar {}. El segundo error que encontré es que en la linea datosdeentrada ^ 0x800000; esta mal y quedaría así, datosdeentrada=datosdeentrada ^ 0x800000; Y por ultimo y lo que bien comentabas es que la linea
printf(lcd_putc,"\f%Ld", datosdeentrada); debería ir al terminar de obtener todos los datos y así imprimir el dato final es decir después de la linea PD_SCK=0;
Un while le pones llaves si va hacer algo dentro de dicho bucle,
En este caso, si escribes while(DOUT ==1); esta encerrado sin hacer nada, esperando que DOUT cambie a 0 para salir. Es decir tu programa se queda "colgado" en esa línea hasta que DOUT cambie a cero.
Esto: datosdeentrada=datosdeentrada ^ 0x800000; Puedes escribirlo de esta manera, si lo deseas así.
datosdeentrada ^= 0x800000;