Autor Tema: HX711 pic16f877A PIC C CCS PROTEUS: ¿Como inicializar HX711?  (Leído 2044 veces)

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

Desconectado Autodidacta

  • PIC10
  • *
  • Mensajes: 2
HX711 pic16f877A PIC C CCS PROTEUS: ¿Como inicializar HX711?
« 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

Código: [Seleccionar]
#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;
         
}
   }
}


« Última modificación: 24 de Mayo de 2022, 14:17:52 por Autodidacta »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:HX711 pic16f877A PIC C CCS PROTEUS: ¿Como inicializar HX711?
« Respuesta #1 en: 24 de Mayo de 2022, 17:42:52 »
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

Código: [Seleccionar]
#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
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Autodidacta

  • PIC10
  • *
  • Mensajes: 2
Re:HX711 pic16f877A PIC C CCS PROTEUS: ¿Como inicializar HX711?
« Respuesta #2 en: 22 de Junio de 2022, 13:00:53 »
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

Código: [Seleccionar]
#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;

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:HX711 pic16f877A PIC C CCS PROTEUS: ¿Como inicializar HX711?
« Respuesta #3 en: 22 de Junio de 2022, 13:37:58 »
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

Código: [Seleccionar]
#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;
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything