Envío de números enteros a través de USART de PIC

Necesito enviar números enteros desde mi placa de microcontrolador ( PIC16F877) a la PC. Estoy usando MAX232para esto. Necesito usar un código similar a este (codificado usando mikroc 8.2) .

Tenga en cuenta que esto no es correcto (en realidad, la línea Usart_Write(count);no funcionará según lo previsto ). Pero mostrará lo que estoy tratando de hacer.

#define BAUD_RATE 57600
#define DELAY 500
int count;

void interrupt(){
     if(INTCON.INTF == 1 ){
          count++;
          INTCON.INTF = 0;
     }
}

void setup(){
     INTCON = 0x90;
     TRISB = 0x01;
     Usart_Init(BAUD_RATE);
     count = 0;
}

void main() {
     setup();
     while(1){
        Usart_Write('>');
        Usart_Write(count);
        Usart_Write('<');
        count = 0;
        delay_ms(DELAY);
     }
}

La aplicación es sencilla. La variable counterse incrementa con PORTB0la interrupción y counterse necesita enviar el valor a PC.

¿Puede alguien mostrarme una forma correcta (y simple) de hacer esto?

¿Qué no funciona específicamente en el código anterior? (¿Con qué bit tiene problemas?) Además de establecer el conteo en 0 en el ciclo principal (que no debe hacer si desea que aumente), no se ve tan mal.
¿No debería estar esto en stackoverflow? Y, creo que debería hacer un esfuerzo para intentarlo primero, luego publicar el problema en stackexchange
@OliGlaser esto es para calcular la velocidad de una rueda giratoria usando un contador digital. La interrupción se incrementará countcada vez que reciba una señal. Pero leo el countvalor a intervalos fijos y envío los valores a la PC. Entonces, por supuesto, debo reiniciar el contador. Puede haber una mejor manera de lograr esto, pero este método no está mal. El problema es que no sé cómo enviar el valor entero a través de USART...
Si quiere decir cómo representarlo como valores ASCII para que sea "legible por humanos" en la PC, entonces la respuesta de Toby es el camino a seguir. Hay bastantes funciones útiles en la biblioteca estándar que ayudan con cosas como esta: lea la documentación de su biblioteca para ver qué funciones de impresión están disponibles.

Respuestas (3)

Según tengo entendido, su problema es cómo imprimir una secuencia de caracteres ASCII que representan un número entero.

Ya tiene una función que puede imprimir un carácter, por lo que desea algo como lo siguiente:

char buf[16];
char *p;

sprintf(buf, "%d", count);
p = buf;
while(*p)
    Usart_Write(*p++);

Si no tiene sprintf()en su biblioteca C, intente itoa().

(Nota para los pedantes, snprintf()es más seguro, pero no universalmente compatible)

Siempre que necesite verificar si algo funciona o no, intente concentrarse en sus partes específicas. Al igual que en este código, no perderá un mayor valor de conteo: -

void main() {
     setup();
     while(1){
        if(count)
        {
            Usart_Write('>');
            Usart_Write(count); //Your syntax is correct
            Usart_Write('<');
            count = 0;
        }
        delay_ms(DELAY);
     }
}
De acuerdo.. (pero no una respuesta, ¿eh?)

¿Por qué no envías bytes de enteros?

char *p =(char*)&count;

send(*p);p++;
send(*p);p++;
send(*p);p++;
send(*p);

y, por otro lado, puede recopilar bytes y formar un número entero, esto probablemente sea más rápido que convertirlo en una matriz de caracteres.

Saludos, Luka

Tenga en cuenta que no todos los sistemas tienen un int de 32 bits, no todos los sistemas permiten convertir (int *) a (char *) debido a la alineación y el micro puede tener un endian diferente al de la PC.
Sí, eso es lo que debe tener en cuenta, pero siempre puede saber qué tan grande es el INT en el dispositivo integrado o puede escribir macros para diferentes INT. Acerca de endians en PC y PIC, siempre puede cambiarlos más rápido que convertirlos en una matriz de caracteres.