Curso de programación de PIC en PICBasic Pro

Al probar puenteando el Rx con Tx para que me regrese la dada que envío por la PC a 9600, me regresan datos incompletos.
Para 9600 Bps @ 20 MHz, el valor de SPBRGX debe ser 130 y para 5787 Bps, de 215
Quisiera que fuera tan preciso como la USART de una PC.
La precisión que alcance el PIC será suficiente para que el programa de PC enganche.
Algún alcance o alguna otra forma de poder cambiar a 5787 baudios en la PC, sería interesante.
Necesitas un terminal que permita establecer ese baud rate.
 
Para 9600 Bps @ 20 MHz, el valor de SPBRGX debe ser 130 y para 5787 Bps, de 215

La precisión que alcance el PIC será suficiente para que el programa de PC enganche.

Necesitas un terminal que permita establecer ese baud rate.
si, la configuracion es correcta tal como usted dice ,pero de alguna manera al enviar datos esta pierde algunos ,quisas sea el programa,no se lo que sera alguna idea .el terminal que me permite establecer los baudios a 5787 desde la pc directamente ,existe o tengo que implementarlo.si existe como lo puedo conseguirlo y si tengo implementarlo como lo implemento,que copilador ,algunas pautas para hacerlo ,muchas gracias por su ayuda
 
Corrijo lo anterior. Para 9600 Bps @ 20 MHz. El valor de SPBRGX debe ser 129
Creo que me quedé pensando con el valor que pusiste en el programa que subiste.

Calculado con una aplicación mía:
SPBRG_Calc.jpg

Comprobado con otra aplicación similar:
SPBRG_Calc Mr EE-Z.jpg
¿El terminal que me permite establecer los baudios a 5787 desde la pc directamente, existe o tengo que implementarlo?
Si existe, ¿Cómo puedo conseguirlo y si tengo implementarlo, cómo lo implemento?
¿Qué copilador? ¿Algunas pautas para hacerlo?
No sé si exista, yo diseñé mi propia interfaz RS-232 que sí lo permite.
Parámetros COM de SPCTRL.jpg
El compilador usado fue Visual Studio 6 en Basic

Aquí está el enlace del proyecto:
Interfaz RS-232 PIC PC (Proyecto Completo VB6)

En esa entrega no se tiene esa opción, pero si sabes programar en Visual Basic, fácilmente podrás modificar el proyecto y añadir las funciones o características que requieras.
Y si no tienes conocimientos de ese tipo de programación, aquí adjunto la versión más actual. (Incluyo el calculador de SPBRG)
 

Adjuntos

Corrijo lo anterior. Para 9600 Bps @ 20 MHz. El valor de SPBRGX debe ser 129
Creo que me quedé pensando con el valor que pusiste en el programa que subiste.

Calculado con una aplicación mía:
Ver el archivo adjunto 165765

Comprobado con otra aplicación similar:
Ver el archivo adjunto 165766

No sé si exista, yo diseñé mi propia interfaz RS-232 que sí lo permite.
Ver el archivo adjunto 165767
El compilador usado fue Visual Studio 6 en Basic

Aquí está el enlace del proyecto:
Interfaz RS-232 PIC PC (Proyecto Completo VB6)

En esa entrega no se tiene esa opción, pero si sabes programar en Visual Basic, fácilmente podrás modificar el proyecto y añadir las funciones o características que requieras.
Y si no tienes conocimientos de ese tipo de programación, aquí adjunto la versión más actual. (Incluyo el calculador de SPBRG)
lo que necesito es codigo fuente de la version mas actual para poder registrar otros baudios y de alguna forma guiarme ,gracias
 
En la versión que subí se puede establecer cualquier baud rate entre 110 y 256000 Bps.
En "Baud rate" debes seleccionar "Otro" para que puedas ingresarlo en donde dice "Otro Baud rate".
Otro Baud rate.jpg
 
En la versión que subí se puede establecer cualquier baud rate entre 110 y 256000 Bps.
En "Baud rate" debes seleccionar "Otro" para que puedas ingresarlo en donde dice "Otro Baud rate".
Ver el archivo adjunto 165783
si eso si, solo que queria la fuente de esta version actualizada o alguna rutina referente para poder implementarlo e incluirlo en mi sofware que estoy trabando para controlar desde mi pc a 5787 o cualquier otro baudaje.
 
Desde la primer versión está la rutina en donde se agregan los Bps.

Código:
With cmbBauds ' Agregar los BPS al ComboBox cmbBauds
    .AddItem "110"
    .AddItem "300"
    .AddItem "600"
    .AddItem "1200"
    .AddItem "2400"
    .AddItem "4800"
    .AddItem "9600"
    .AddItem "14400"
    .AddItem "19200"
    .AddItem "28800"
    .AddItem "38400"
    .AddItem "56000"
    .AddItem "128000"
    .AddItem "256000"
    .ListIndex = 6 ' Por default en 9600 Baudios
End With
En la última versión nada más se agregó algo muy sencillo.

Código:
Private Sub cmbBauds_Click()
    If cmbBauds.Text = "Otro" Then
        txtBaudRate.Enabled = True
        OtherBaudrate = 1
    Else
        txtBaudRate.Enabled = False
        OtherBaudrate = 0
    End If
End Sub
En la rutina Click de cmdOK:

Código:
Private Sub cmdOK_Click()
    ' Seleccionar el modo de conexión serial.
    If cmbBauds.Text = "Otro" Then
        OtherBaudrate = 1
        Bauds = Val(txtBaudRate.Text)
       
        If Bauds = 0 Then
            MsgBox "Debe proporcionar un valor para el Baudrate.", vbInformation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        ElseIf Bauds < 110 Then
            MsgBox "El Baudrate no puede ser inferior a 110 Baudios.", vbExclamation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        ElseIf Bauds > 256000 Then
            MsgBox "El Baudrate no puede ser superior a 256000 Baudios.", vbExclamation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        End If
    Else
        Bauds = Trim(cmbBauds.Text)
        OtherBaudrate = 0
    End If
En la rutina ReadConfig:

Código:
    OtherBaudrate = CByte(GetSetting(App.CompanyName, App.Title, "USER_BAUDRATE", 1))
    txtBaudRate.Text = GetSetting(App.CompanyName, App.Title, "USER_BAUDS", "5000")
En la rutina WriteConfig:

Código:
    If OtherBaudrate = 1 Then
        SaveSetting App.CompanyName, App.Title, "USER_BAUDS", txtBaudRate.Text
    Else
        SaveSetting App.CompanyName, App.Title, "BAUDS", cmbBauds.Text
    End If
Y la variable OtherBaudrate es del tipo Byte, pero también puede ser Boolean.
 
Desde la primer versión está la rutina en donde se agregan los Bps.

Código:
With cmbBauds ' Agregar los BPS al ComboBox cmbBauds
    .AddItem "110"
    .AddItem "300"
    .AddItem "600"
    .AddItem "1200"
    .AddItem "2400"
    .AddItem "4800"
    .AddItem "9600"
    .AddItem "14400"
    .AddItem "19200"
    .AddItem "28800"
    .AddItem "38400"
    .AddItem "56000"
    .AddItem "128000"
    .AddItem "256000"
    .ListIndex = 6 ' Por default en 9600 Baudios
End With
En la última versión nada más se agregó algo muy sencillo.

Código:
Private Sub cmbBauds_Click()
    If cmbBauds.Text = "Otro" Then
        txtBaudRate.Enabled = True
        OtherBaudrate = 1
    Else
        txtBaudRate.Enabled = False
        OtherBaudrate = 0
    End If
End Sub
En la rutina Click de cmdOK:

Código:
Private Sub cmdOK_Click()
    ' Seleccionar el modo de conexión serial.
    If cmbBauds.Text = "Otro" Then
        OtherBaudrate = 1
        Bauds = Val(txtBaudRate.Text)
      
        If Bauds = 0 Then
            MsgBox "Debe proporcionar un valor para el Baudrate.", vbInformation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        ElseIf Bauds < 110 Then
            MsgBox "El Baudrate no puede ser inferior a 110 Baudios.", vbExclamation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        ElseIf Bauds > 256000 Then
            MsgBox "El Baudrate no puede ser superior a 256000 Baudios.", vbExclamation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        End If
    Else
        Bauds = Trim(cmbBauds.Text)
        OtherBaudrate = 0
    End If
En la rutina ReadConfig:

Código:
    OtherBaudrate = CByte(GetSetting(App.CompanyName, App.Title, "USER_BAUDRATE", 1))
    txtBaudRate.Text = GetSetting(App.CompanyName, App.Title, "USER_BAUDS", "5000")
En la rutina WriteConfig:

Código:
    If OtherBaudrate = 1 Then
        SaveSetting App.CompanyName, App.Title, "USER_BAUDS", txtBaudRate.Text
    Else
        SaveSetting App.CompanyName, App.Title, "BAUDS", cmbBauds.Text
    End If
Y la variable OtherBaudrate es del tipo Byte, pero también puede ser Boolean.
EXELENTE,tengo una duda estoy probando comunicacion desde mi pc al equipo que quiero gobernar un equipo que tiene el siguiente formato de trabajo
Sin título.png

es posible establecer comunicacion desde mi pc con tu terminal al equipo, ps estoy enviando comandos ascci pero en realidad no obtengo respuesta,tu terminal permite enviar estos comandos sin modificarlos o como haria para establecer comunicacion alguna idea .
 
Sí, es el protocolo o norma estándar RS-232.
Lo que debes tener en cuenta es lo que se menciona: 8 data bits (least significant bit transmitted first)
O sea que el bit menos significativo debe ser enviado primero.
 
Hola Todo el mundo,
Intenté escribió en español, sólo descargar estudio de compilador pic microcódigo básico como una versión de prueba de 15 días, quiero trató de compilar el código cuando llegué de este foro, el PIC16F628A IC así como el código, cuando compilé que tengo un error , el error, así como mi attched foto en mi primer post.
Could ayudarme por favor, qué ajustes a solucionado ese problema.
Esta es mi primera vez use un microcódigo estudio Picbasic (compilador), realmente estoy utilizar compilador MikroC, que quiero aprender a en compilador de PIC Basic.
2018-04-21 at 10-47-35.png


Gracias.

Saludos,

Kapoh
 
Es necesario ver el código completo, sobre todo, cómo fue escrita la palabra de configuración.
HS_OSC = Oscilador de alta frecuencia. (Cristal superior a 4 MHz)
También es necesario saber qué versión de prueba estás usando y qué compilador estás usando.
El entorno puede usar MPASM o sus nativos PBP Compilers.

Por favor, adjunta el código completo dentro de un archivo comprimido, o usa la opción del editor para insertar código.
 
Hola buenas tardes saludos al todo el foro!!!
Después de un rato que no había entrado al foro, aquí regreso!!
aquí les comparto un código de comunicación de los Módulos TLP434(A) y RLP434(A) de Radio Frecuencia.

Radio.JPG

yo lo eh probado físicamente y no eh tenido problemas de interferencia.

Trasmisor:

Código:
''******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                         'COMPARADORES APAGADOS
TRISA = %00000000                 'SALIDA Y ENTRADAS DEL PUERTO A      
TRISB = %00000001                 'SALIDA Y ENTRADAS DEL PUERTO B
PORTA = 0                         'LIMPIAMOS EL PUERTO A
PORTB = 0                         'LIMPIAMOS EL PUERTO B
TT VAR BYTE                       'VARIABLE DONDE RECIBE EL DATO
TT = 84                           'VALOR QUE SE LE ASIGNO A LA VARIABLE
'*******************************************************************************
Include "modedefs.bas"            'INCLUYE LA LIBRERIA SERIAL

serout PORTB.1,N2400,[$FF,$FF,$10]
INICIO:
IF PORTB.0 THEN
pause 500
SEROUT  PORTB.1,N2400,[$FF,$FF,"OK","A",Tt]
ENDIF
gOTO INICIO
Receptor:


Código:
''******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                         'COMPARADORES APAGADOS
TRISA = %00000000                 'SALIDA Y ENTRADAS DEL PUERTO A        
TRISB = %00000010                 'SALIDA Y ENTRADAS DEL PUERTO B
PORTA = 0                         'LIMPIAMOS EL PUERTO A
PORTB = 0                         'LIMPIAMOS EL PUERTO B
B0 var byte                       'VARIABLE DONDE RECIBE EL DATO
'*******************************************************************************
Include "modedefs.bas"            'INCLUYE LA LIBRERIA SERIAL

INICIO:
SERin PORTB.1,N2400,[$FF,$FF,"OK","A"],B0
if b0="T" then high PortB.0:pause 1000:low PortB.0
gOTO INICIO
Les comparto los códigos y la simulación
Saludos y seguimos en contacto.
 

Adjuntos

Hola a todos, estoy retomando un tema de vieja data programando un pic que me dejo con muchas dudas y nunca pude hacer que el circuito anduviera como quería.

Hace unos años compre un equipo que venía con una botonera con dos botones. El primer botón me habilita un circuito por 6 minutos y el segundo botón habilita el mismo circuito por 12 minutos. Esta botonera la reemplace por un circuito que arme donde en vez de botones puse un fichero igual al de los arcades y la idea original mia era que al introducir una ficha me habilite el circuito por los 6 minutos, luego si introduzco una segunda ficha en un periodo x, pongamos unos 4 segundos, me tiene que habilitar el timer de 12 minutos y pasado ese tiempo, si no introduzco nada debe quedar habilitado el timer de los 6 minutos.

Soy nuevo en la programación de pic, todo lo que pude lograr fue que me vaya alternando, es decir que introuzco la primer ficha y me da los 6 minutos, luego una segunda para los 12, vuelve nuevamente a los 6 y asi.

Estoy pensando en escribir nuevamente el código y había pensado en algo asi (la sintaxis no es la adecuada ya que lo escribo a medida que lo recuerdo ya que no lo tengo conmigo):

puerto1= es el puerto donde esta conectado el pulsador
T6= es el puerto donde esta la salida al rele del timer de 6 minutos
T12= es el puerto donde esta la salida al rele del timer de 12 minutos

***CODIGO***

# aca viene la preparacion de puertos y definicion de variables

inicio:
h=0
z=0

if puerto1=0 then h=h+1 ' cuando se mete la primer ficha
while z<1000
if puerto1=low then h=h+1 ' cuando se mete la segunda ficha
z=z+1
wend

if h=1 then
high_T6 ' si h=1, me habilita el timer de 6 minutos
pause 200
low_T6
end if
if h=2 then
high_T12 ' si h=2 me habilita el timer de 12 minutos
pause 200
low_T12
end if

if (T6=low) and (T12=low) then goto inicio

end

Este seria el esqueleto del nuevo código que estoy armando, necesitaría de su opinión para saber si va a funcionar. es correcto usar el while? necesito que espere al menos 4 segundos, le puse un valor de 1000 por poner ya que no se como determinar el tiempo exacto. El circuito tiene un PICF16F84.

Estoy usando picbasic

Espero sus comentarios.

Saludos y gracias
 
que tal buenas tardes vengo a pedir su ayuda
es un proyecto estas son las caracteristicas
teclado matricial 4x4 por aplicacion android que se hizo con app inventor
receptor bluetooth

lo que estoy tratando de hacer esque con la aplicacion del teclado matricial encienda y apague un led ejemplo el numero 1 enciende y con el mismo apaga el led

Código:
INICIO:
portb=0
SERIAL=0
SERIN PORTC.7,T9600,100,SIGUE,SERIAL

SIGUE
 
IF SERIAL==1 THEN
   high portb.4
   endif
goto inicio
pero no logro hacerlo funcionar tengo que encender todos los leds que estan conectados al puerto portb.0,1,2,3,4,5,6,7 con un respectivo numero del teclado matricial

saludos
 
¿Y cómo lo cambiaste?
¿Qué microcontrolador estás usando?
¿Con qué y de qué forma estás enviando el número 1?
Ten en cuenta que si envías el 1 como texto, el microcontrolador recibirá su valor ASCII (49)
 
que tal este es el microcontrolador
es el 16f876a
desde la aplicacion de un bit (1)

Código:
define LOADER_USED 1
INCLUDE "MODEDEFS.BAS"

TRISA=0
TRISB=0
TRISC=0

ADCON1=7

SERIAL VAR BYTE

PORTA=0
PORTB=0
PORTC=0

SERIAL=0


TECLADO:
SERIAL=0
SERIN PORTC.7,T9600,100,SIGUE,SERIAL
SIGUE:
PORTB=0
IF PORTB.4==0 OR SERIAL==1 THEN
    high portb.0
    endif
    goto esperar
    
    
esperar

IF PORTB.4==0 OR SERIAL==1 THEN
    low portb.0
    endif
    goto teclado
 
Ese código sigue mal. Cuando no existen datos se brinca a la etiqueta SIGUE y pone el puerto B en 0.
O sea que cuando se reciba un 1, apenas tendrá un instante activado el pin RB0.
La etiqueta esperar está de sobra porque se ejecuta a continuación.
En Basic la comparación no se hace con == como con el C, solo se usa =

Desde la aplicación de un bit (1)
¿Cuál aplicación? Y no se envía un bit, se debe enviar 1 byte.

Ese código no tiene palabra de configuración y es importante saber con qué fuses se está grabando el PIC.
Otra cosa. El PIC16F876A tiene módulo USART y deberías aprovecharlo en lugar de usar RS-232 por software.
Así que puedes usar HSERIN y también la interrupción por recepción.
 

Arriba