Autor Tema: Inicio en comunicaciones  (Leído 2549 veces)

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

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Inicio en comunicaciones
« en: 01 de Septiembre de 2011, 18:34:50 »
Hola amigos:

Como dice el titulo quiero empezar un proyecto un poco mas laborioso que no sea el leer y/o escribir en un puerto, algun adc y algun LCD.

De momento quiero empezar con las comunicaciones serie, UART implementada en los pics. Empezaré con 16F887 pero no tengo ni idea de como va este tema y aunque me leeido muchos mensajes de este foro no saco nada en claro. Para empezar pretendo leer un puerto, guardar su estado en una variable y mandar esa variable por el UART imlementda en el PIC, pin RC6 en este caso. Para saber si funciona reflejo el puerto leido en el puerto D
He realizado un pequeño programa y lo simulo en PSI y no veo que transmita nada y seguro que estoy realizando algo muy mal. Adjunto el codigo por si me echan una manita.
A parte de eso si alguien me explica un poquito (explicacion para torpes) como funciona esto, les quedaré agradecido.
F.
Código: [Seleccionar]
Define CONF_WORD = 0x23c1  '/*power-up timer = On, brown-out reset = On
Define CONF_WORD_2 = 0x33ff  '*/ watchdog=off
Define CLOCK_FREQUENCY = 4  'Frecuencia del reloj en Mhz

Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms. Solo habilitado para simulador

Dim indig As Byte  'Variable donde se guardará el valor de las entradas digitales.

AllDigital
TRISA = %00011111  'Configuración del puerto A. RA0->RA3=Entradas análogicas; R4=InFrecuencia
TRISB = %11111111  'Configuración del puerto B. Entradas digitales.
TRISC = %10111111  'Configuración del puerto C. Entrada digitales y comunicaciones RX y TX
TRISD = %00000000  'Configuración del puerto D. Todo salidas digitales
TRISE = %11111111  'Configuración del puerto E. Todo entradas digitales

Hseropen 9600

main:

WaitUs 10  'espera para estabilizar señales
'Hseropen 9600
indig = PORTB
'indig = PORTB
PORTD = indig
Hserout #indig
WaitUs 5

Goto main

End  'Fin del programa                           

« Última modificación: 01 de Septiembre de 2011, 18:46:36 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Inicio en comunicaciones
« Respuesta #1 en: 02 de Septiembre de 2011, 08:04:35 »
Creo que si estudias este código y un pequeño vistazo al pequeño manual del PSI, no necesitaras ningún tipo de tutorial.

Código: [Seleccionar]
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'*************** PIC Entrenadora BASIC ********************
'NOMBRE: 16F88_Pic_EBasic_RS232_ECO_10
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 8/11 by COS
'VERSION 1.0.
'Practicas con puerto serie "Para principiantes"
'Funciones basicas para el correcto manejo del puerto RS232
'Programa responde ECO por el Hyperterminal
'*******************************************************
'Puerto LCD----------------------------------------------------------------
Define LCD_BITS = 4  'Bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus datos seran 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'Se usara el RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'Se usara el RB6 como E
Define LCD_COMMANDUS = 500  'Espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Espera despues inicializar LCD, solo se ejecuta una vez (mSeg).
'Configuración de los módulos-------------------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'Luz lcd a On (RB3)
PORTA.7 = 1  'Led amarillo a Off
PORTB.0 = 1  'Led verde a Off
'******************************************************
Lcdinit  'Inicializa el LCD sin cursor
'Reasignacion de nombres----------------------------------------------
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
'******************************************************
Call clearbufer()  'Inicializa Uart
'******************************************************
main:
If overbufer = True Then Call clearbufer()  'Inicializa Uart
If bufer = True Then Call rd_byte()  'Lee un byte del puerto RS232
Goto main
End                                               
'******************************************************
'Funciones lectura puerto serie RS232***********************
Symbol overbufer = RCSTA.OERR  'Bit error Uart
Symbol bufer = PIR1.RCIF  'Bit hay datos Uart
'Mantiene el modulo Usart operativo
'No datos de entrada, no datos de salida
'Call clearbufer()
'If overbufer = True Then Call clearbufer()
Proc clearbufer()
Dim papelera As Byte
Hseropen 9600  'Velocidad del puerto serie, configura Usart
RCSTA.CREN = 0  'Disable
Hserget papelera  'Limpia bufer Uart
Hserget papelera
Hserget papelera
RCSTA.CREN = 1  'Enable, Continuous Receive Enable bit*/
End Proc                                         
'Lee bufer Uart, eco serie RS232
'Retorna el dato en la variable rd_byte
'No datos de entrada, si dato de salida en rd_byte
'Call rd_byte()
'If bufer = True Then Call rd_byte()
Function rd_byte() As Byte
Hserget rd_byte  'Carga el dato en el bufer
Hserout rd_byte  'Envia dato puerto serie RS232
End Function                                     
'*************************************************
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Inicio en comunicaciones
« Respuesta #2 en: 02 de Septiembre de 2011, 10:53:45 »
Muchas gracias Carlos, asi lo haré

F.
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Inicio en comunicaciones
« Respuesta #3 en: 02 de Septiembre de 2011, 18:02:29 »
He utilizado el ejemplo que viene en el manual de PSI y al ejecutarlo paraece que esta mandando los numeros.
He utilizado el modulo de:  Software UART simulation interface que trae el programa y he colocado como transmision el pin 6 del puerto C y como recepcion el pin 7 del mismo puerto.
Pero al ejecutar no veo que haga nada, seguro que estoy haciendo algo mal. Adjunto el programa y una imagen de la captuar del run del programa.

Código: [Seleccionar]
Define CONF_WORD = 0x23c1  '/*power-up timer = On, brown-out reset = On
Define CONF_WORD_2 = 0x33ff  '*/ watchdog=off
Define CLOCK_FREQUENCY = 4  'Frecuencia del reloj en Mhz

'* MICRO:  16F887                                                  FECHA:  01.09.2011       *
'***************************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms. Solo habilitado para simulador
'***************************************************************************************************
AllDigital
'TRISA = %00011111  'Configuración del puerto A. RA0->RA3=Entradas análogicas; R4=InFrecuencia
'TRISB = %11111111  'Configuración del puerto B. Entradas digitales.
TRISC = %10111111  'Configuración del puerto C. Entrada digitales y comunicaciones RX y TX
'TRISD = %00000000  'Configuración del puerto D. Todo salidas digitales
'TRISE = %11111111  'Configuración del puerto E. Todo entradas digitales

main:
Dim i As Byte
Hseropen 9600
WaitMs 1000
For i = 20 To 0 Step -1
Hserout #i
WaitMs 500
Next i
'*programa que se está escribiendo.

End  'Fin del programa                            

« Última modificación: 02 de Septiembre de 2011, 18:04:36 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Inicio en comunicaciones
« Respuesta #4 en: 02 de Septiembre de 2011, 21:07:02 »
Al utilizar el modulo uart tienes que usar la herramienta Hardware UART Simulation Interface. No hay que configurar nada ya que el pic solo tienen un modulo Uart, por lo que el PSI se configura de forma automática.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Inicio en comunicaciones
« Respuesta #5 en: 03 de Septiembre de 2011, 18:32:20 »
Al utilizar el modulo uart tienes que usar la herramienta Hardware UART Simulation Interface. No hay que configurar nada ya que el pic solo tienen un modulo Uart, por lo que el PSI se configura de forma automática.

Pues eso es lo que he realizado, pero no se si tengo mal definido algo en el programa que asi lo requiera. El caso es que en la ventana del: UART Simulation Interface no aparece nada. :(


Me respondo a mi mismo:
Estaba utilizando el modulo de Software UART Simulation Interface en vez del Hardware UART Simulation Interface :oops: :oops: :oops: :oops:


F.
« Última modificación: 03 de Septiembre de 2011, 18:37:06 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Inicio en comunicaciones
« Respuesta #6 en: 03 de Septiembre de 2011, 20:14:51 »


Bueno una vez probada la transmision de un byte y siendo correcta, quiero avanzar el proyecto enviando 4 bytes mas.
Estos ultimos se correspondran con 4 lecturas analogicas.
Amplio el programa y lo pruebo. Realizando primero la lectura de los puertos correspondientes uno despues de otro y transmitiendolos a continuacion.
Esto me funciona pero hay un cosa curiosa que me choca un poco, no por que no pueda ser buena sino por que en todos los post que he leido para una frecuencia de 8Mhz encunetro que:
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC

Bueno pues si coloco la linea con ese valor al compilar me sale el error: "Invalid value for parameter"
Ahora bien cambio valores y solo compila para valores del ADC_Clock igual o menor de 3.
¿Este valor depende del tipo de micro utilizado?
El valor de 5 lo veo siempre para micros 16F88 y el que estoy utilizando es el 16F887

F.
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Inicio en comunicaciones
« Respuesta #7 en: 04 de Septiembre de 2011, 07:57:22 »
Los Tad son la cantidad de pulsos de reloj que necesita el modulo ADC antes de poder mostrar la lectura. Cuando se habla de Tad de forma genérica se hace referencia  a un acho de pulso indefinido (tiempo), para saber el tiempo a que se refiere en concreto hay que revisar el datasheets del micro en particular, esto quiere decir que puede ser diferente según el tipo de ADC que contenga el microcontrolador. Los módulos ADC de los pic tienen un divisor de frecuencias programable que le permite acoplar el reloj principal de micro a las necesidades del ADC propio, este divisor puede cambiar para otro micro, por lo que su programación o resolución puede ser distinta.

PD. El número de Tad también puede ser distinto para casa micro.

http://www.pickey.es/uso_practico_del_pic12f675_viii.html
« Última modificación: 04 de Septiembre de 2011, 08:03:46 por dogflu66 »
Saludos desde Granada, España.


 

anything