Cambiar los valores de puerto dentro del bucle (8051)

0

Estoy usando el módulo RX / TX y ht12d / e para mi proyecto. Lo haré breve, en mi programa estoy haciendo un paquete de datos y lo envío, y el receptor lo está recibiendo de manera sincrónica. El receptor está configurado de manera que espera el valor 0x0a del transmisor, cuando se recibe, luego espera 0x05 cuando se recibe, luego espera otro 0x05 y entre 0x05 hay datos de 2 bits contenidos en el nibble. después de que se recibe 0x05, espera otro 0x05 y entre 0x05 obtiene la información. hay 16 informacion en un paquete El problema comienza aquí, cuando envío el paquete de manera controlada al presionar un botón, se envía un 0x05 y se saca el botón. Se envía el botón 0x00, de esta manera se recibe todo el paquete correctamente, pero cuando transmito el paquete con una función , no pasa nada, no hay indicación de que el paquete haya recibido o recibido.  Nota: el valor en el PORT 1 se transmite, el microcontrolador 8051 se usa en el lenguaje c. La transmisión es de solo 4 bits paralelos.

while(1){
        if(highh==0 )
        {P1=0x0a;while(highh==0);}
        if(loww==0 )
        {P1=0x05;while(loww==0);} 
        P1=00;
    }

el código anterior funciona, en el que highh y loww representan 3.7 y 3.6 pines de 8051. Los presiono para enviar paquetes.

void transmit()
{   
    for(i=0;i<i2;i++)P1 = 0x0a;  
    for(i=0;i<i2;i++)P1 = 0;   
    for(i=0;i<i2;i++)P1 = 0x05;     
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05;  
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0;  
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05;
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    ///////
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0;  
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    P1=00;
}

Lo anterior es la función que estoy usando, que no funciona. He usado P1 = 0 como información. El receptor está esperando dieciocho valores 0x05 y un 0x0a al inicio. i2 es variable para la duración del retardo. He comprobado diferentes retrasos de duración. ¿Cómo puedo hacer que la función funcione? ¿Es este el motivo por el que los valores de puerto deben cambiarse una vez en el ciclo principal del programa? Lo que realmente estoy haciendo es; 1; Recopilar datos de diferentes sensores. 2; Dividir cada byte de datos en 2 bits. 3; transmite 0x0a 4; transmite 0x05 5; transmita información (que contiene esos 2 bits que se reciben de los sensores pero en realidad son 4 bits). 6; transmite 0x05 de nuevo, 7; ir de manera similar Hasta que se envíen un total de 16 nibbles de información.

y el receptor recibe información después de que 0x05 haya terminado de recibir.

    
pregunta Sulaiman Ayub

1 respuesta

1

Es posible que no esté esperando el tiempo suficiente entre 'presionar un botón'. El HT12E siempre repite cada paquete de palabra (bits de dirección + bits de datos) al menos 4 veces, incluso si la transmisión solo se habilita momentáneamente. Si intenta enviar demasiado rápido, se perderán algunos de los 'botones pulsados'.

A su frecuencia de oscilador de 3KHz recomendada, el HT12E tarda unos 70 ms en enviar las 4 palabras, por lo que debe demorar más que eso (por ejemplo, 100 ms) entre transmisiones.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas