comunicación UART entre dos micro AVR en mikrobasic

0

necesitamos leer los datos de un módulo serial MLX90615 (sensor de termómetro IR), para que funcione con el sistema usart, la hoja de datos del módulo se encuentra en este enlace:

hoja de datos del módulo

Como no hay una biblioteca mlx90615 en Proteus, simulamos el sensor con otro micro que envía el código similar al sensor en Proteus.

pero el problema es que no pudimos comunicarnos entre dos micro en el software mikrobasic y en Proteus.

el programa reciver está basado en la biblioteca arduino para este sensor, que es similar a esto:

 unsigned char Re_buf[11],counter=0;
 char sign=0;
float TO=0,TA=0;
void serialEvent();

void setup() {

   Serial.begin(115200);
  delay(1);
  Serial.write(0XA5);
  Serial.write(0X45);
  Serial.write(0XEA);
}

void loop() {

   char i=0,sum=0;
 serialEvent();
  if(sign)
  {
     sign=0;
     for(i=0;i<8;i++)
      sum+=Re_buf[i];
     if(sum==Re_buf[i] )
     {
           TO=(float)(Re_buf[4]<<8|Re_buf[5])/100;
           Serial.print("TO:");
           Serial.println(TO);
           TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
           Serial.print("TA:");
           Serial.println(TA);
   }
  }

}
void serialEvent(){ 
  while (Serial.available()) {
    Re_buf[counter]=(unsigned char)Serial.read();
    if(counter==0&&Re_buf[0]!=0x5A) return;
    counter++;
    if(counter==9)
    {
       counter=0;
       sign=1;
    }
  }
}

Por lo tanto, el microprograma de la base del receptor se basa en el programa de arduino anterior:

program mlx60914
symbol LCD_RS_my = PORTc7_bit
  symbol LCD_EN_my =PORTc6_bit
  symbol LCD_D4_my =PORTc2_bit
  symbol LCD_D5_my=PORTc3_bit
  symbol LCD_D6_my =PORTc4_bit
  symbol LCD_D7_my=PORTc5_bit

  symbol LCD_RS_Direction_my = DDc7_bit
  symbol LCD_EN_Direction_my =DDc6_bit
  symbol LCD_D4_Direction_my =DDc2_bit
  symbol LCD_D5_Direction_my=DDc3_bit
  symbol LCD_D6_Direction_my =DDc4_bit
  symbol LCD_D7_Direction_my=DDc5_bit
dim  celcius,fahrenheit as float
txt1 as string[6]

' Lcd module connections
dim LCD_RS as sbit at LCD_RS_my
dim LCD_EN as sbit at LCD_EN_my
dim LCD_D4 as sbit at LCD_D4_my
dim LCD_D5 as sbit at LCD_D5_my
dim LCD_D6 as sbit at LCD_D6_my
dim LCD_D7 as sbit at LCD_D7_my

dim LCD_RS_Direction as sbit at LCD_RS_Direction_my
dim LCD_EN_Direction as sbit at LCD_EN_Direction_my
dim LCD_D4_Direction as sbit at LCD_D4_Direction_my
dim LCD_D5_Direction as sbit at LCD_D5_Direction_my
dim LCD_D6_Direction as sbit at LCD_D6_Direction_my
dim LCD_D7_Direction as sbit at LCD_D7_Direction_my

dim uart_rd as byte
  counter ,sign  as  integer
  TO_,TA as float
volatile  Re_buf as  char[11]

 sub procedure serialEvent()
 dim uu as byte
 cc as integer
 uu=0   counter=0

' Re_buf[0]= 0x5A Re_buf[1]=0x5A  Re_buf[2]=0x45  Re_buf[3]=0x04 Re_buf[4]=0x0C  Re_buf[5]=0x78 Re_buf[6]=0x0D Re_buf[7]= 0x19 Re_buf[8]= 0xA7'0x5A, 0x5A, 0x45, 0x04, 0x0C, 0x78, 0x0D, 0x19, 0xA7
'  lcd_out(1,1,"Re_buf:")  Lcd_out(2,1,Re_buf) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)

     UART1_Write(13)   UART1_Write_text("Z") UART1_Write(0x5A)
     while (((UART1_Data_Ready() <> 0)) and (uu=0))  ''(UART1_Data_Ready() <> 0)
  Re_buf[counter]= char (UART1_Read())  delay_ms(100)
    if (((counter=0) AND (Re_buf[0]<>"Z")) or ((counter=1) AND (Re_buf[1]<>"Z"))) THEN '(Re_buf[0]<>"Z"))  then '(Re_buf[0]<>0x5A))  then
   lcd_out(1,1,"Re_buf_EXIT:")  Lcd_out(2,1,Re_buf) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
    uu=1
    else
    counter=1+counter
    if(counter=9)  then
         lcd_out(1,1,"Re_buf[x]:")  Lcd_Chr(2,1,Re_buf[counter])   delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
         lcd_out(1,1,"Re_buf:")  Lcd_out(2,1,Re_buf) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
       counter=0
       sign=1
       uu=1
    end if
    end if
  wend
  lcd_out(1,1,"Re_buf_end:")  Lcd_out(2,1,Re_buf) delay_ms(200) Lcd_Cmd(_LCD_CLEAR)
end sub

sub procedure loop_MLX90615_new()
  dim  i as byte
  sum as char
  i=0 sum=0
 serialEvent()
 if(sign=1)  then
    sign=0
           TO_=float ((Re_buf[4]<<8 or Re_buf[5])/100   )
           lcd_out(1,1,"TO:")  FloatToStr(TO_,txt1) lcd_out(2,1,txt1)  delay_ms(500)

           TO_=float ((Re_buf[6]<<8 or Re_buf[7])/100   )
           lcd_out(1,1,"TO2:")  FloatToStr(TO_,txt1) lcd_out(2,1,txt1)  delay_ms(500)

           TO_=float ((Re_buf[7]<<8 or Re_buf[8])/100   )
           lcd_out(1,1,"TO3:")  FloatToStr(TO_,txt1) lcd_out(2,1,txt1)  delay_ms(500)

  end if
 end sub



main:
dim cont2 as byte
 Lcd_Init()
 Lcd_Cmd(_LCD_CLEAR)               ' Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF)          ' Cursor off
 celcius=0
 counter=0 sign=0  TO_=0 TA=0
 UART1_Init(9600)                        ' Initialize UART module at 9600 bps
 Delay_ms( 1)                            ' Wait for UART module to stabilize
'  UART1_Write(0XA5)             ' and send data via UART
'  UART1_Write(0xAF)             ' and send data via UART
'  UART1_Write(0x54)             ' and send data via UART

  UART1_Write(0XA5)             ' and send data via UART
  UART1_Write(0X45)             ' and send data via UART
  UART1_Write(0XEA)             ' and send data via UART


  while 1
' Re_buf[0]= 0x5A Re_buf[1]=0x5A  Re_buf[2]=0x45  Re_buf[3]=0x04 Re_buf[4]=0x0C  Re_buf[5]=0x78 Re_buf[6]=0x0D Re_buf[7]= 0x19 Re_buf[8]= 0xA7'0x5A, 0x5A, 0x45, 0x04, 0x0C, 0x78, 0x0D, 0x19, 0xA7
  loop_MLX90615_new()
 wend
end.

el microprograma del transmisor es de esta manera:

program mlx60914

dim  celcius,fahrenheit as float
txt1 as string[6]

dim uart_rd as byte
  counter ,sign  as  integer
  TO_,TA as float
volatile  Re_buf as  char[11]


main:
dim cont2 as byte
 ch as char

 celcius=0
 counter=0 sign=0  TO_=0 TA=0
 UART1_Init(9600)                        ' Initialize UART module at 9600 bps
 Delay_ms( 1)                            ' Wait for UART module to stabilize
   Re_buf[0]= 0x5A Re_buf[1]=0x5A  Re_buf[2]=0x45  Re_buf[3]=0x04 Re_buf[4]=0x0C  Re_buf[5]=0x78 Re_buf[6]=0x0D Re_buf[7]= 0x19 Re_buf[8]= 0xA7'0x5A, 0x5A, 0x45, 0x04, 0x0C, 0x78, 0x0D, 0x19, 0xA7

     UART1_Write_Text("Start")
  while 1

for cont2=0 to 8
        if( UART1_Tx_Idle()=1 ) then
      '     UART1_Write_Text("Start")
          UART1_Write( Re_buf[cont2] ) delay_ms(100)
         end if
         next cont2  delay_ms(10)

  wend
end.

la simulación en los archivos del programa Proteus está aquí:

simulación en Proteus

así que la imagen de esta simulación está aquí:

Al eliminar (UART1_Data_Ready () <> 0) , el programa muestra los números como entradas de la línea RX , lo que indica que los datos enviados al programa no se conocen como datos Uart, pero hasta cierto punto se llaman , por ejemplo Aquí, los primeros remitentes, 0x5A , solo se envían y se muestran como Z en la pantalla LCD.

Esto indica que hay un problema con la comunicación UART que indica que los datos no se transmiten correctamente. Por supuesto, hay un retraso de 100 ms entre las publicaciones para superar el problema que se muestra en el terminal UART del entorno Proteus, que se envía en la parte anterior de la cola Z en la secuencia de envío de los caracteres del código.

En otras palabras, parece que el problema con el envío de un carácter Z es una explosión, en lugar de enviar dicho carácter tanto en modo de retardo como en modo de latencia (en modo retrasado en el terminal UART, los caracteres se muestran correctamente). solo se muestra en la pantalla LCD que se encuentra el micro-carácter Z y que el resto de los caracteres no se envían.)

    
pregunta 1st

0 respuestas

Lea otras preguntas en las etiquetas