Buenas tardes, he realizado una interface muy elemental en VB.Net para probar el funcionamiento del circuito (16F877A y en MikroC) lo que hace volcar el dato recibido en buffer del PIC al puerto D, lo he probado en la tierra prometida virtual(PROTEUS) y me funciona sin incovenientes pero al implementarlo en fisico funciona bien pero de manera aleatoria la interfaz me envía caracteres que no he programado, es decir si pulso un boton "GIRAR 0°" segun lo programado debe enviar por el puerto serial el caracter "1" contenida en la variable servo y luego el PIC lo recibe lo compara y ejecuta la acción programada para esto si son iguales , por el momento tengo conectado un LCD para poder visualizar lo que estoy recibiendo y fue ahi donde me di cuenta que la presionar varias veces el boton"GIRAR 0°" recibo en el PIC los valores ASCII 49 (lo que es correcto para el caracter 1 programado en la interfaz) pero tambien recibo 190, 250, 240 de forma aleatoria, lo curioso es que si envio los datos de control "GIRAR 0°" (1), GIRAR 90°(2), GIRAR 180°(3) desde el hyperterminal funciona sin errores de igual manera si lo ejecuto del monitor serial del mismo MikroC, si me pudieran orientar en la resolución de este problema. Adjunto el programa en VB.NET y la programacion en MikroC
PD: La idea es controlar unos 4 servomotores, lo estoy haciendo por partes y verificando el correcto funcionamiento de cada una de ellas y despues agregarle un control por RF.
Por que todo lo referente a VB siempre esta en VB.6 y en .NET
Programacion en VB.NET
Imports System.IO
Imports System.IO.Ports
Imports System.Threading
Public Class Form1
Dim a As Boolean
Dim servo As Byte
Dim manual As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "com14" ' Cambia el Puerto por que el este disponible según el COM libre
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default
End Sub
Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
a = False
SerialPort1.Open()
servo = 1
SerialPort1.Write(servo)
TextBox1.Text = (" GIRO A LA IZQUIERDA")
SerialPort1.Close()
manual = 7
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
a = False
SerialPort1.Open()
servo = 3
SerialPort1.Write(servo)
TextBox1.Text = " GIRO A LA DERECHA" '
SerialPort1.Close()
manual = 25
End Sub
Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If a = True Then
SerialPort1.Open()
SerialPort1.Write(manual)
SerialPort1.Close()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
a = False
SerialPort1.Open()
servo = 2
SerialPort1.Write(servo)
TextBox1.Text = " EJE EL CENTRO"
SerialPort1.Close()
manual = 16
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If manual > 7 Then
manual = manual - 1
TextBox1.Text = manual * 10
a = True
End If
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
If manual < 25 Then
manual = manual + 1
TextBox1.Text = manual * 10
a = True
End If
End Sub
End Class
programacion en mikroC
//declarar variables del funcionamiento de la LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
unsigned DATO_RECIBIDO; // dimension del variable donde se almacenara lo que lea del puerto serial
char txt1[] = "DATO RECIBIDO:";
char txt2[8];
void main() {
portd=0;
trisd= 0; //puerto D como salida
//delay_ms(500);
portd=0;
Lcd_Init(); // Inicializo la LCD
Lcd_Cmd(_LCD_CLEAR); // borro la LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // apago cursor
Lcd_Out(1,1, txt1); //escribo DATO RECIBIDO
//inicio de la comunicacion serial
UART1_Init(9600); // Inicializo la UART 9600 bps
Delay_ms(100); //tiempo de la estabilizacion
while (1) { // ciclo de lectura de datos
if (UART1_Data_Ready()) { // si hay datos en el buffer del pic
DATO_RECIBIDO = UART1_Read(); // los leeo y los guardo en la variable DATO_RECIBIDO
}
switch (DATO_RECIBIDO){
case 49: portd=60; break; //evaluo si el DATO_RECIBIDO es igual a 65 y si es true ejecuto portd=60
case 50: portd=125; break; //evaluo si el DATO_RECIBIDO es igual a 66 y si es true ejecuto portd=125
case 51: portd=255; break; //evaluo si el DATO_RECIBIDO es igual a 67 y si es true ejecuto portd=255
}
wordToStr(DATO_RECIBIDO, txt2); //convierto a string los datos recibidos para mostrarlo en la LCD
Lcd_Out(2,3,txt2);
}
}