cómo contar el número de interrupciones y enviarlo a través de UART en 8051

-1

Solo necesito contar las interrupciones que ocurren en el pin 3.2 y luego imprimir ese valor en UART. No sé por qué el siguiente programa no funciona como se esperaba. Cualquier ayuda será apreciada. Gracias de antemano.

#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>

/* function prototypes */
void delay(unsigned int ms);
void putc1( chr);
void initialize(void);
void record_wind(unsigned char c);
void puts1(char* p);



// global variables declared
unsigned char buf[8]={0},*ptr;
int c=0,i=0; 
sbit P3_2 = P3^2;



/* delay function to create a delay of 1 sec */
void delay(const unsigned int ms)
{
 unsigned int x;
 unsigned int y;
 for (x = 0; x < ms; x++)
 {
 for (y = 0; y <= 113; y++)
 ;
 }
}



void puts1(char* p)
{
 char *temp = p;          /*temp pointer so that the actual pointer is not displaced */
 while(*temp != 0x00)
 {
  putc1(*temp);  
  temp++;
 } 
}



/* function to detect the wind speed */
void windspeed_read( void ) interrupt 0
{
EA=0;
c = c+1;
sprintf(buf,"%d",c);
EA=1;
}



/*init the TIMER and etc*/
void initialize()
{
 SCON  = 0x50;   /*SCON: mode 1, 8-bit UART, enable receive      */ 
 TMOD |= 0x20;   /*TMOD: timer 1, mode 2, 8-bit                  */
 TH1   = 0xFD;   /*TH1:  for 9600 baud                           */
 TR1   = 1;      /*TR1:  timer 1 run                             */ 
}



/* to print the character in UART and serial window*/
void putc1(chr)
{
  SBUF = chr;
  while(TI==0);            /*Wait until the character is completely sent */
  TI=0;                   /*Reset the flag */
}



/* main function */
void main()
{
initialize();
IE = 0x81;
EX0 = 1;
EA = 1;
while(1)
{

    *ptr = buf;
    delay(10000);
    puts1(ptr);
}
}

El código anterior no cuenta las interrupciones e incrementa los valores HEX. Necesito incrementar en decimal (0,1,2,3, .. 100 o más) e imprimir en UART.

    
pregunta d-coder

1 respuesta

1

El problema puede ser causado por este código

  

* ptr = buf;

Mira tus definiciones para ellos

  

unsigned char buf [8] = {0}, * ptr;

"ptr" es un puntero a carácter, debe asignarle un puntero. Creo que pretendes hacer que apunte a "buf", entonces deberías usar "ptr = buf;", pero le das "buf" a "* ptr". Es decir, "ptr" no apunta a "buf", de hecho es "0" ahora, porque está definido en global.

Actualización:

En tu código, hay otros dos problemas:

  1. Puedes enviar el mismo contador muchas veces. Porque cuando has enviado todos los caracteres en el búfer, no tienes medios para indicar que se ha enviado el búfer, y siempre hay algunos caracteres en el búfer. Necesita un medio para asegurarse de que su envío comience solo cuando se actualice el búfer.
  2. Necesita acceder a "buf" tanto en su ISR como en "puts1" Función, que se llama en el bucle while. Entonces, cuando estás Al enviar el búfer al USART, su ISR puede intentar cambiar el Contenidos en "buf", por lo que es posible que necesite alguna sincronización.
respondido por el diverger

Lea otras preguntas en las etiquetas