PIC18F25K80 4 20 devuelve verdadero. ¿Cómo es esto posible?

1

Estoy utilizando dicho código en PIC18F25K80 compilado con el compilador xc8:

unsigned long kline_kw1281_byte_time = 0;

void sendKline(void) {
  klineWrite(0x9);
  while (klineBusy());
  kline_kw1281_byte_time = millis();
  while (!klineAvailable()) {
      if (kline_kw1281_byte_time_out()) {
          mStatus = DISCONNECTED;
          while(Busy1USART());
          Write1USART(0x00);
          return;
      }
  }
}


bit kline_kw1281_byte_time_out(void) {
    unsigned long time_out = millis() - kline_kw1281_byte_time;

    if (time_out > 20){
        while(Busy1USART());
        Write1USART(time_out);
        return 1;
    } else
        return 0;
}

y tengo un problema extraño. En la función kline_kw1281_byte_time_out() tengo una declaración verdadera para time_out > 20 pero Write1USART(time_out) me imprime un número menor que 20. Esto sucede al azar. La función la mayor parte del tiempo funciona correctamente.

este es el código millis ():

#include <p18cxxx.h>
#include "timer0.h"

volatile unsigned long runtime_millis;

void initialize_timer0() {
    T0CON = 0b11000011;
    INTCONbits.TMR0IE = 1;
    INTCON2bits.TMR0IP = 1; //set timer0 interrupt priority high
    INTCONbits.TMR0IF = 0; //reset timer0 interrupt flag
}

void timer0(void) {
    runtime_millis++;
    TMR0L = 8;
    INTCONbits.TMR0IF = 0;
}

unsigned long millis(void) {
    return runtime_millis;
}

void delay(unsigned long ms) {
    unsigned long cTime = runtime_millis;
    while (runtime_millis - cTime < ms);
}
    
pregunta Nick Alexeev

1 respuesta

4
if (time_out > 20){
    while(Busy1USART());
    Write1USART(time_out);

Esto escribe time_out como carácter ASCII en el módulo USART. Si ve '4' sobre el USART, significa que se envía el carácter ASCII '4', valor real 0x34 . Y 0x34 , 52 decimal, es mayor que 20.

Si desea imprimir el valor decimal como una cadena al USART, puede hacer esto:

#define putch Write1USART 

printf("%ul", time_out);

La función printf() formatea time_out como un largo sin firmar (por lo tanto, %ul ) y lo escribe byte a byte en putch() . putch() debería tener la firma:

void putch(unsigned char);

El #define en el ejemplo anterior se asegura de que Write1USART() se use para putch() .

    
respondido por el Keelan

Lea otras preguntas en las etiquetas