Autor Tema: Comunicación pic simulador entre pics  (Leído 3056 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Comunicación pic simulador entre pics
« en: 15 de Septiembre de 2011, 15:51:29 »
Llevo algún tiempo intentando conseguir comunicar dos pics entre sí.Los siguientes programas funcionan con la simulación, pero cuando los llevo al pic no obtengo nada.La electrónica he comprobado que está bien.Para comprobar que el lcd funciona visualizo el mensaje "hola mundo", pero cuando transmito no consigo visualizar nada en el lcd.Estos programas forman parte de otros más largos.

emisor:
Código: [Seleccionar]
Define CONF_WORD = 0x3184

'Trabajando con servos, PIC12F629
Define CLOCK_FREQUENCY = 4
Define SEROUT_DELAYUS = 1000
AllDigital
'Define SIMULATION_WAITMS_VALUE = 1
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol verde = GPIO.4
Symbol rele = GPIO.0
Symbol servo = GPIO.5
TRISIO = %001100
'#########################################################################
'define variables
Dim velocidad As Byte
Dim codigo As Byte
Dim posicion As Byte  '1 centro 2-dch 3-izq posicion servo
Dim pulso_dch As Byte  'angulo dch servo
Dim pulso_izq As Byte  'angulo izq servo
Dim i As Byte
codigo = 0
'##########################################################################
Gosub leer
rojo = 0
verde = 0
servo = 0
rele = 0
velocidad = 12

'Enable
'######################################################
'inicio programa
main:
Gosub leer

OPTION.INTEDG = 1
INTCON.INTE = 1
INTCON.GIE = 1
Enable

'Serin GPIO.3, 300, total
Goto main

End                                               

'###################################################


On Interrupt
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad

For i = 1 To 12
Serout GPIO.1, 300, "V", CrLf
Next i
WaitMs 5000
For i = 1 To 12
Serout GPIO.1, 300, velocidad, CrLf
Next i

'Serout GPIO.1, 300, #velocidad, CrLf





INTCON.INTF = 0
Resume                                           


leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad
Return                                           


receptor
Código: [Seleccionar]

Define CONF_WORD = 0x3d31
'pic16f876
Define CLOCK_FREQUENCY = 4
AllDigital
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = porta  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = porta  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 4  'se usara el Ra4 como RS
Define LCD_EREG = portb  'el bit de control E sera del puerto B
Define LCD_EBIT = 3  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'------------------------------------------------------------------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo
Define SEROUT_DELAYUS = 1000


trisa = 0
trisb = %00001111

trisc = %00001111  'puerto C teclado 4bits bajos salidas 4 altos entradas
Symbol fila1 = portc.3
Symbol fila2 = portc.2
Symbol fila3 = portc.1
Symbol fila4 = portc.0
Symbol col1 = portc.4
Symbol col2 = portc.5
Symbol col3 = portc.6
Symbol col4 = portc.7


'#########################################################################
'define variables
Dim numero As Byte
Dim codigo As Byte
Dim v As Byte
Dim a As Byte
Dim b As Byte
Dim i As Byte
'Dim velocidad As Word
'Dim valor As Word
Lcdinit
WaitMs 1000

'#########################################################################

main:  'comienza el programa principal
a = 0
b = 0
v = 0
numero = 0
Lcdcmdout LcdClear
WaitUs 1000
Lcdout "hola mundo"
'WaitUs 3000
'codigo = "V"
Lcdcmdout LcdClear
WaitUs 3000
Serin portb.0, 300, codigo
'Lcdcmdout LcdClear
'WaitUs 1000
For i = 1 To 12
Lcdout codigo
WaitUs 1000
Lcdcmdout LcdClear
Next i
Goto main
End                                     

No encuentro en donde puede estar el fallo y ya no sé que más puedo hacer.
Muchas gracias

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Comunicación pic simulador entre pics
« Respuesta #1 en: 18 de Septiembre de 2011, 09:24:34 »
Pues por más pruebas que hago no soy capaz a comunicar los dos pic.Lo último que he probado es los siguiente:

Emisor
Código: [Seleccionar]
Define CONF_WORD = 0x3184

'Trabajando con servos, PIC12F629
Define CLOCK_FREQUENCY = 4
Define SEROUT_DELAYUS = 5000
AllDigital
'Define SIMULATION_WAITMS_VALUE = 1
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol verde = GPIO.4
Symbol rele = GPIO.0
Symbol servo = GPIO.5
TRISIO = %001100
'#########################################################################
'define variables
Dim velocidad As Byte
Dim codigo As Byte
Dim i As Byte
codigo = 0
'##########################################################################
rojo = 0
verde = 0
servo = 0
rele = 0
velocidad = 12

'######################################################
'inicio programa
main:
WaitMs 500
verde = 0


If boton = 0 Then
verde = 1

For i = 1 To 4
Serout GPIO.1, 9600, "V", CrLf
Next i
WaitMs 500

WaitMs 2000
For i = 1 To 4
Serout GPIO.1, 9600, "b", CrLf
Next i
WaitMs 500
Endif

Goto main
End                                               


receptor
Código: [Seleccionar]
Define CONF_WORD = 0x3d31
'pic16f876
Define CLOCK_FREQUENCY = 4
'Define SIMULATION_WAITMS_VALUE = 1
AllDigital
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTA  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 4  'se usara el Ra4 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 3  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 5000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'------------------------------------------------------------------------------------------------------'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo
Define SEROUT_DELAYUS = 5000


TRISA = 0
TRISB = %010001111

TRISC = %00001111  'puerto C teclado 4bits bajos salidas 4 altos entradas


'#########################################################################
'define variables
Dim numero As Byte
Dim codigo As Byte
Dim v As Byte
Dim a As Byte
Dim b As Byte
Dim m As Byte
Lcdinit
WaitMs 1000
m = 0
'#########################################################################

main:  'comienza el programa principal
a = 0
b = 0
v = 0
codigo = 0
numero = 0
WaitUs 1000
Lcdcmdout LcdLine1Home
Lcdout "hola mundo"
WaitUs 3000
Serin PORTB.7, 9600, codigo
Lcdcmdout LcdLine2Home
Lcdout codigo

WaitUs 500

Goto main
End                                               

El caso es que parece que transmite y recibe ,ya que en la pantalla de lcd aparecen unos símbolos raros, además del hola mundo.
En el pic simulator funciona. He probado a transmitir números y tampoco va.
Si alguien quiere poner algo que funcione en la realidad le quedaría muy agradecido, de lo contrario, creo que no voy a perder más tiempo, ya que no consigo encontrar el fallo.Además he estropeado una de las patitas del 16f con las pruebas.
Un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Comunicación pic simulador entre pics
« Respuesta #2 en: 19 de Septiembre de 2011, 08:29:06 »
Actualmente estoy fuera y no puedo comprobar codigo, prueba eliminando los waitms ya que Serin hace la pausa.
De todas formas nunca he utilizado Serin por sotfware. Si envias el dato antes de que Serin se esté ejecutando se pierde el byte.
Para que esto no ocurra se emplea usart por hardware, en realidad es más facil implementar esto por hardware que por sotfware.

Código: [Seleccionar]
main:  'comienza el programa principal
   a = 0
   b = 0
   v = 0
   codigo = 0
   numero = 0
   'WaitUs 1000
   Lcdcmdout LcdLine1Home
   Lcdout "hola mundo"
   'WaitUs 3000
   Serin PORTB.7, 9600, codigo
   Lcdcmdout LcdLine2Home
   Lcdout codigo

'WaitUs 500

Goto main
End
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Comunicación pic simulador entre pics
« Respuesta #3 en: 19 de Septiembre de 2011, 10:13:08 »
También se tiene que tener en cuenta la representación grafica, el PIC trabaja internamente en binario y no necesita asociar al numero una imagen, como nos sucede a nosotros, cuando se envían datos a un dispositivo de salida visual, hay que indicar que los datos tienen que ser transformados a su equivalente grafica, esto es códigos ASCII, y esto se realiza precediendo el dato con el símbolo #.
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Comunicación pic simulador entre pics
« Respuesta #4 en: 20 de Septiembre de 2011, 15:58:20 »
Muchas gracias por tu ayuda. La verdad es que ya no sé que hacer.
Lo he dejado así


Código: [Seleccionar]
Define CONF_WORD = 0x3d31
'pic16f876
Define CLOCK_FREQUENCY = 4
'Define SIMULATION_WAITMS_VALUE = 1
AllDigital
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTA  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 4  'se usara el Ra4 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 3  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 5000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'------------------------------------------------------------------------------------------------------'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo
Define SEROUT_DELAYUS = 500


TRISA = 0
TRISB = %010001111

TRISC = %00001111  'puerto C teclado 4bits bajos salidas 4 altos entradas


'#########################################################################
'define variables
Dim numero As Byte
Dim codigo As Byte
Dim v As Byte
Dim a As Byte
Dim b As Byte
Dim m As Byte
Lcdinit
WaitMs 1000
m = 0
'#########################################################################

main:  'comienza el programa principal
a = 0
b = 0
v = 0
codigo = 0
numero = 0
'WaitUs 1000
Lcdcmdout LcdLine1Home
Lcdout "hola mundo"
'WaitUs 3000
Serin PORTB.7, 9600, codigo
Lcdcmdout LcdLine2Home
Lcdout #codigo

'WaitUs 500

Goto main
End                                               



El emisor


Código: [Seleccionar]

Define CONF_WORD = 0x3184

'Trabajando con servos, PIC12F629
Define CLOCK_FREQUENCY = 4
Define SEROUT_DELAYUS = 5000
AllDigital
'Define SIMULATION_WAITMS_VALUE = 1
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol verde = GPIO.4
Symbol rele = GPIO.0
Symbol servo = GPIO.5
TRISIO = %001100
'#########################################################################
'define variables
Dim velocidad As Byte
Dim codigo As Byte
Dim i As Byte
codigo = 0
'##########################################################################
rojo = 0
verde = 0
servo = 0
rele = 0
velocidad = 12

'######################################################
'inicio programa
main:
WaitMs 500
verde = 0


If boton = 0 Then
verde = 1

For i = 1 To 24
Serout GPIO.1, 9600, "V", CrLf  'ascii 86
WaitMs 500
Next i


WaitMs 2000
For i = 1 To 24
Serout GPIO.1, 9600, "b", CrLf  'ascii 98
WaitMs 500
Next i

Endif

Goto main
End                                               




En el lcd aparece 150 214 varias veces y después 162 226
En todos los ejemplos que he visto en pbp en libros y manuales envían cualquier dato y no tienen problema.¿en el pic simulator serin y serout funcionan de otra manera?
Si pongo lcdout codigo aparecen símbolos raros.
a la variable código ¿que le llega?, formato ascii,binario.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Comunicación pic simulador entre pics
« Respuesta #5 en: 22 de Septiembre de 2011, 13:36:31 »
He podido verificar mejor los dos códigos y la transmisión la haces correcta una vez eliminados los wait del receptor, envías el código ASCII, por lo que en la recepción no necesitas usar el operador #. La siguiente pregunta, ¿estás utilizando el oscilador interno del Pic12F629?. Si es correcto el problema lo tienes en el %  de error del oscilador interno que es muy grande. Aquí tienes info donde te explica que es y como ajustarlo. Te recomiendo que al principio trabajes a una velocidad baja 1200baudios, ya que es más fácil de ajustar mediante el registro osccal.

http://www.pickey.es/articulos_pic12f675.html
http://www.pickey.es/uso_practico_del_pic12f675_iii.html
http://www.pickey.es/uso_practico_del_pic12f675_vi.html
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Comunicación pic simulador entre pics
« Respuesta #6 en: 23 de Septiembre de 2011, 17:03:13 »
He bajado la velocidad a 1200 y tampoco va. De momento lo de ajustar el oscilador interno no sé como es.Lo que hago cuando grabo el pic es poner el valor que viene de fábrica ,que leo previamente. Igual me da por utilizar un oscilador externo para ver si el problema está ahí. Lo tengo que comprar.
Lo que estoy intentando es hacer una red rs485. Desde un panel de control con unos pulsadores, dar orden de movimiento a  servos que están repartidos por una habitación y a una distancia no superior a 4m ,desde el panel de control.
Para el control de cada servo pondría un 12f ,que por nº de e/s me daría de sobra. Una para el servo,otra para un relé y otras dos para rs.En el panel de control utilizacía varios 16f876.
Visto los problemas que estoy teniendo con el 12f,creo que voy a intentar comunicar dos 16f entre sí. A ver si tengo suerte y funciona. Para el control de los servos utilizaría también un 16f que se ocuparía de cinco.Lo que necesito es poder mover los servos al mismo tiempo y de manera independiente.El movimiento de cada servo suele durar de 4 a 5 segundos, por lo que necesitaría mover otros antes de que terminaran los anteriores.Algo he visto en C.Creo que voy a intentar pasarlo a basic.
Bueno, de momento voy con lo del oscilador.
Muchas gracias por tu ayuda, seguiré dando vueltas.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Comunicación pic simulador entre pics
« Respuesta #7 en: 23 de Septiembre de 2011, 19:56:02 »
Si sabes el valor de osccal es fácil implementarlo, para el ejemplo del enlace solo tienes que colocar la línea "Osccal=0x44" antes del main.
Tiene que estar seguro que no perdiste el valor de osccal y estas empleando uno erróneo.

http://www.pickey.es/articulos_pic12f675.html

De todas maneras, siempre que tengas un frecuencímetro, puedes crearte un programita con un bucle infinito que cambie un pin a una frecuencia conocida e ir cambiando el valor de osccal hasta hacerlo coincidir con la lectura del frecuencímetro. Pero trabajar con cristal externo es la mejor solución.
Saludos desde Granada, España.


 

anything