Hola a todos, disculpen el titulo del mensaje, no supe como expresarlo, espero que puedan ayudarme en este problema, estoy tratando de comunicar un pic con la pc via serial.
1. En la pc hice un pequeño script en python para enviar datos por el puerto com, en el pic estoy usando CCS,
2. El objetivo es enviar un msj al pic y que pueda cambiar el estado del pin_c0 cada vez que reciba un mensaje (no debe cambiar de estado por dato, sino por msj) para esto se configura un timer de .01ms de modo que, tras cada dato recibido se activa el temporizador, si se desborda el temporizador se entiende que el msj a finalizado y se procede a cambiar el estado del pin_c0.
3. El programa funcion correctamente cuando el mensaje es menor de 5 bytes.
El problema viene cuando se envian al menos 5 bytes en un msj, cuando esto ocurre el pin_c0 cambia su estado 2 veces, apenas se percibe que ha cambiado el estado. Pareciera que al leer el 4byte se desborda el temporizador y se produce el cambio de estado en pin_c0, pero ¿Como puede ser posiblbe si se restablece el timer0 en #int_rda??
script en python para enviar msj al puerto com
codigo del pic
1. En la pc hice un pequeño script en python para enviar datos por el puerto com, en el pic estoy usando CCS,
2. El objetivo es enviar un msj al pic y que pueda cambiar el estado del pin_c0 cada vez que reciba un mensaje (no debe cambiar de estado por dato, sino por msj) para esto se configura un timer de .01ms de modo que, tras cada dato recibido se activa el temporizador, si se desborda el temporizador se entiende que el msj a finalizado y se procede a cambiar el estado del pin_c0.
3. El programa funcion correctamente cuando el mensaje es menor de 5 bytes.
El problema viene cuando se envian al menos 5 bytes en un msj, cuando esto ocurre el pin_c0 cambia su estado 2 veces, apenas se percibe que ha cambiado el estado. Pareciera que al leer el 4byte se desborda el temporizador y se produce el cambio de estado en pin_c0, pero ¿Como puede ser posiblbe si se restablece el timer0 en #int_rda??
script en python para enviar msj al puerto com
Python:
import serial
import time
ser = serial.Serial("COM3", 9600, timeout=1)
msj= bytes([0x01, 0x04, 0x00, 0x15, 0x00])
print(msj)
print("Esperando:")
while(1):
if (input("continuar: ")=='s'):
ser.write(msj)
else:
break
exit(1)
codigo del pic
C:
#include <18F458.h>
#device ADC=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES HS
#use delay(crystal=20MHz)
#use rs232(baud=MODBUS_BAUD, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N, ERRORS, ENABLE=PIN_C5, disable_ints, timeout=10)
#define TIME0 60
int8 buffer[64];
int8 index=0;//usado como indice para recorrer el buffer
#int_rda
void serial_isr() {
disable_interrupts(int_timer0);
buffer[index++] = getchar();
set_timer0(TIME0);
enable_interrupts(int_timer0);
}
#int_timer0
void timeout_isr(){
disable_interrupts(int_timer0);
output_toggle(pin_c0);
index=0;
}
void main()
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 | RTCC_8_BIT );
disable_interrupts(INT_TIMER0);
set_timer0(TIME0); // configurado a 0.01s
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true);
}