TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: gesteva en 22 de Noviembre de 2004, 16:50:00
-
Gracias por entrar a leer acerca de esta duda. Como puedo resolver esto?
Necesito comunicar dos PIC16F877A por RC6 y RC7 de ambos micros. Esto es lo que he intentado hacer:
En el micro numero 1 he puesto este código:
TRISA = %00011111
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %01000000
BO VAR WORD
ADCON1 = %00000110
inicio:
if porta.0 = 1 then inicio
SEROUT PORTC.6,2400,["HELLO"]
GOTO inicio
End
Y en el micro Numero 2 éste es el código que me da error al compilar justo en la linea donde esta la instrucción Serin:
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1
DEFINE LCD_LINES 2
TRISA = %00011111
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %01000000
DATO VAR BYTE
B0 VAR BYTE
ADCON1 = %00000110
serial:
SERIN PORTC7.0,2400,B0
LCDOut $fe, 1 " Limpia la LCD
LCDOut $fe, 2 " Posiciona el cursos en el inicio
LCDOut "Recibiendo Datos"
LCDOut $fe,$C0, "Dato = ",#B0
Pause 100
GOTO serial
End
Bien, no se si esto es una rebusnada de codigo... quisiera que me ofrecieran algunas ideas de porqué no funciona y en qué estoy mal...???
O también si existe otra forma de comunicar estos dos Micros, pero por el puerto serial de cada uno de ellos...
Gracias de nuevo! 
-
gesteva,
si es c6, y c7 debe ser conUSART entonces, si es asi,aqui un ejemplo funcional:
-------------------------------------------------------------------------------------------------------
DEVICE 16F877
XTAL = 4
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DIM VAR1[11] AS BYTE
DIM VAR2[13] AS BYTE "<--ARRAY
STR VAR1="RESIVIENDO "
STR VAR2="TRANSMITIENDO" "<--STR
HSERIAL_BAUD = 9600
HSERIAL_RCSTA = %10010000
HSERIAL_TXSTA = %00100100
HSERIAL_CLEAR = ON
CLS
PRINT STR VAR2
HRSOUT STR VAR114 "<---STR NO NECESARIA SI QUIERES LEER TODA LA STR
END
---------------------------------------------------------------------------------------------------------
DEVICE 16F877
XTAL = 4
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DIM VAR1[11] AS BYTE
HSERIAL_BAUD = 9600
HSERIAL_RCSTA = %10010000 " 10010000
HSERIAL_TXSTA = %00100100 " 00100100
HSERIAL_CLEAR = ON
HRSIN STR VAR1
CLS
PRINT STR VAR1
DELAYMS 2000
END
--------------------------------------------------------------------------------------------------------
serout y serin son asincronos pero sinUSART del Micro, aqui un ejemplo con SERIN
--------------------------------------------------------------------------------------------------------
DEVICE 16F877
XTAL = 4
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DIM ARRAY[11] AS BYTE
loop:
SERIN PORTc.6 , 16780 , P_ERROR , 10000 , T_ERROR , [str Array]
PRINT CLS ,str Array
GOTO loop
T_ERROR:
PRINT CLS , "Fuera de Tiempo"
GOTO loop
P_ERROR:
PRINT CLS , "Error Paridad"
GOTO loop
-------------------------------------------------------------------------------------------------------
DEVICE 16F877
XTAL = 4
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
loop:SEROUT PORTC.7 , 16780 , [ "!!TODOPIC!!" , 13 ]
delayms 2000
goto loop
---------------------------------------------------------------------------------------------------------
Espero y te sea de ayuda pana.
Salu2
-
Gracias Lager... te comento que he tratado de compilar el cogigo que me has pasado, pero creo que no estamos hablando del mismo compilador pues me da errores, pero me has dado algunas ideas que me han funcionado muy bien. Hice algunas pruebas y este fue el resultado, envío caracteres cargados en distintas variables (B1, B2, B3 y B4) y las recibo del otro lado visualizandolas en la pantalla LCD. Esto es lo que hice...
En el PIC maestro puse esto (éste recibe los datos y los muestra en la LCD):
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1
DEFINE LCD_LINES 2
TRISA = %00011111
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %01000000
B0 VAR BYTE
ADCON1 = %00000110
serial:
SERIN PORTC.7 , 9600, B0
ESPERA1:
LCDOut $fe, 1 " Limpia la LCD
LCDOut $fe, 2 " Posiciona el cursor en el inicio
LCDOut "Recibiendo Datos" " escrebe
LCDOut $fe,$C0, "Data: ", B0
Pause 200 " Pausa de 200 milisegundos
GOTO serial
End
En el PIC esclavo puse esto (Este envía los datos):
TRISA = %00011111
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %01000000
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE
B4 VAR BYTE
B1 = "H"
B2 = "o"
B3 = "l"
B4 = "a"
ADCON1 = %00000110
inicio:
if porta.0 = 1 then inicio
SEROUT PORTC.6 , 9600 , [B1, 0]
pause 205
SEROUT PORTC.6 , 9600 , [B2, 0]
PAUSE 205
SEROUT PORTC.6 , 9600 , [B3, 0]
pause 205
SEROUT PORTC.6 , 9600 , [B4, 0]
PAUSE 205
GOTO inicio
End
Gracias por el impulso... Saludos! 
-
Gesteva,
Una disculpa pana, efectivamente es para otro compilador,pero me da gusto que hayas sacado SOLO tu problema 
, eso es lo importante
Acuerdate que si no quieres escribir letra por letra puedes usar Arrays 
Salu2 pana
-
Arrays??? puedes darme mas detalles al respecto? es decir, si puedo enviar una palabra completa, como puedo hacerlo?
Desde ya Gracias...
-
Para eso estamos pana, para tratar de ayudarte.
Los arrays te permiten maneja cadenas de informacion(texto) , aunque la forma en que lo haces le da un efecto visual(palabra por palabra) si solo quieres imprimir un texto completo , los arrays trabajan igual pero todo quedaria en una linea de envio,
definiendo el array:
array as byte [3]
array="Hola"
SEROUT2 PORTC.6 , 84, [str array3]
En la pagina de : www.melabs.com encontraras estos y mas ejemplos, en especifico para serin2 y serout2 esta este:
http://www.melabs.com/resources/samples/pbp/ser2mod.bas
Salu2 pana