desktop

Curso de programación de PIC en PICBasic Pro

No, muy mal.
Necesitas poner mas atención sobre las configuraciones de los registros usados en el ejemplo que subí.
De esa forma no va a funcionar tu programa.

El bit 5 (RCIF = EUSART Receive Interrupt Flag bit) del registro PIR1 es el que necesitas comprobar para verificar si existió interrupción por recepción.

Ese bit se pondrá en 1 cuando contenga datos, tú no debes establecer esa condición.

Hay mas problemas en tu programa y te recomiendo que le des una buena leída a la hoja de datos.




muchas grasias dr por su correccion

tengo una duda es posible hacer inerrupciones usart con 2 o mas hserin o solo puedo usar un hserin

disable
If PIR1.5 = 1 Then ; ¿Ocurrió interrupción por recepción EUSART?
Flag_Rx = 1
hserin[dec1 a]
hserin[dec1 b]
hserin[dec1 c]
hserin[dec1 d]
hserin[dec1 e]
.
.
.
endif
resume
enable
end
 
No, porque de esa forma todas las variables contendrán lo que en el momento de la interrupción tenga el primer byte del buffer.
Lo correcto sería hacer uso de un único HSerIn, de ésta forma:
HSerIn ParityLabel, Timeout, Label, [a, b, c, d, e]
Así recibes de una sola vez cada byte del buffer en las variables.

ParityLabel, Timeout y Label, son parámetros opcionales.
La conversión con "Dec x" la puedes hacer posteriormente.
 
Hola muchachos,me preguntaba si hay una función similar en pic basic como la hay en arduino que es la funcion millis() ,en el que por comparación puedo realizar otras tareas como apagar y encender un led sin utilizar la función delay o pause.Ya que si uso la función delay detengo la ejecución del programa y no puedo realizar otras tareas segun el tiempo establecido a menos que use interrupciones.
Por ejemplo que un led parpadee y en simultaneo que pueda con un pulsador encender o apagar otro led.
Debido a mi escaso conocimiento sobre picbasic no lo se.
Muchas gracias por sus respuestas.
 
No, no la hay.,.. Como se hace es con un timer , interrupción de timer o un contador con un pauseus, y quizás con algún otro algoritmo similar.

 
Última edición:
Buenos días compañeros del grupo, estoy haciendo una comunicación usart entre un pic 16f887 y un modulo mp3 el DFPLAYER, la comunicación entre el modulo y el pic ya la tengo y viceversa, el problema esta que cuando quiero enviar una cadena con el Hserout [STR ArrayVar\n] no me envía el dato.
La verdad no entiendo muy bien la parte \n, quiero enviar un comando para especificar el volumen inicial ya que el por defecto lo carga en 30.

Código:
VOL VAR BYTE [7] ; cree la variable array
VOL[0] = $7E ; le cargo el comando a la array 
VOL[1] = $FF
VOL[2] = $06
VOL[3] = $06
VOL[4] = $00
VOL[5] = $00
VOL[6] = $A ;este bit el que le da el Volumen especifico al modulo.
VOL[7] = $EF 

;Cuando quiero enviar el comando lo hago así:
Hserout [STR VOL\8] ; Se supone que acá debería de enviarme los VOL[] cargados con los valores, eso creo ;y entido yo.

Espero me puedan colaborar.
Les agradezco de antemano.
 

Adjuntos

  • SistemadeLlamado.rar
    1.5 KB · Visitas: 34
Última edición:
HSerOut [Str ArrayVar\n] debe funcionar correctamente enviando los datos del arreglo.
\n es para especificar cuantos bytes deben ser enviados.
En tu caso, 8 bytes y como el byte cero también cuenta, la instrucción debe ser así.
HSerOut [Str VOL\7]
 
HSerOut [Str ArrayVar\n] debe funcionar correctamente enviando los datos del arreglo.
\n es para especificar cuantos bytes deben ser enviados.
En tu caso, 8 bytes y como el byte cero también cuenta, la instrucción debe ser así.
HSerOut [Str VOL\7]

Buenas tardes Dark te cuento que tampoco asi me funciono, me ha funcionado asi:

HSerOut [VOL[1], VOL[2], VOL[3], VOL[4], VOL[5], VOL[6], VOL[7], VOL[8]]

ó asi directamente

HSerOut [$7E, $FF, $06, $06, $00, $00, $0F, $EF]

pero de la otra forma no me envia los datos, de la otra forma se reduce codigo, pero bueno tocara dejarlo asi mientras veo donde esta la falla.

Cordial saludo y gracias por responder (y).
 
Pues si funciona como te mencioné, tendrías que entrar en modo de depuración para encontrar el problema.

También se puede usar un bucle for.
Por ahora estoy fuera y con el móvil, pero en cuanto llegue a casa, adjunto dentro de este mismo post, un ejemplo con Str

****Edit****

Adjunto el ejemplo.
Nota:
Si se desea usar la simulación, se debe establecer la vista del Virtual Terminal, en Hex Display Mode.
 

Adjuntos

  • 16F887 RS-232 Str ArrayVar.rar
    46.7 KB · Visitas: 67
Última edición:
Hola D@rk y compañeros

Te cuento que ya encontre el problema, era que estaba enviando mal el comando con la variable array, la estaba enviando desde [1] y no desde [0], y lo que hacia era que me envia un dato de más.
El ejemplo que montaste esta interesate y no sabia que asi tambien se podia cargar el dato, de pronto tienes ejemplos de HSEROUT, HSERIN y LCDOUT STR con sus modificadores la verdad en español es muy poca la info de estas instrucciones y las que estan en ingles no las entiendo bien y el traductor no ayuda :cry:.

Muchas gracias por la ayuda.

Cordial saludo(y)

En la instruccion LCDOUT STR no pude visualizar nada, me salian los caractres del lcd que son en japones creo.
 
Última edición:
Saludos.
Los ejemplos sobre HSerIn y HSerOut, los puedes ver por aquí:
Interfaz RS232 PIC PC (Proyecto Completo VB6)

Y para LCDOut Str, prueba con este programa:
PHP:
; Definición de pines para la pantalla.
Define LCD_DREG PORTD        ; Puerto de datos.
Define LCD_DBIT     4        ; Bit de inicio de datos.
Define LCD_RSREG PORTD        ; Puerto de RS (Register Select)
Define LCD_RSBIT    0        ; Pin para RS
Define LCD_EREG PORTD        ; Puerto de E (Enable)
Define LCD_EBIT     1        ; Pin para E

; Declaración de variables:
LCDChar Var Byte[10]        ; Arreglo para los caracteres a mostrar en la pantalla.

Inicio:
    ANSEL = 0               ; Puerto A como digital
    
    ; Cargar el arreglo con el mensaje.
    LCDChar[0] = "H"
    LCDChar[1] = "o"
    LCDChar[2] = "l"
    LCDChar[3] = "a"
    LCDChar[4] = " "
    LCDChar[5] = "M"
    LCDChar[6] = "u"
    LCDChar[7] = "n"
    LCDChar[8] = "d"
    LCDChar[9] = "o"
    LCDChar[10] = " "

    LCDOut $FE,1            ; Inicializa o borra la pantalla.
    LCDOut $FE,$80,"Ej: Str ArrayVar"
    LCDOut $FE,$C0,Str LCDChar\10

Programa:    
    While 1 = 1
       Toggle PORTA.0
       Pause 500
    Wend
    
    End
 
Y para LCDOut Str, prueba con este programa:
PHP:
    LCDOut $FE,1            ; Inicializa o borra la pantalla.
    LCDOut $FE,$80,"Ej: Str ArrayVar"
    LCDOut $FE,$C0,Str LCDChar\10

    
    End

Hola D@rk y compañeros, bueno lo que pretendia hacer con LCDOut $FE,$C0,Str LCDChar\10 era que si recibia un dato lo cargara en una variable array y visualizarlo con esa instruccion, pero me muestra caracteres del LCD, pero para mas facilidad cargue las arrays en la instruccion y funciona bn.

Tengo una duda con respecto a trabajar con las comunicaciones, cuando uso HSERIN y SERIN2 se me crea un conflicto y el puerto por el cual quiero recibir los datos de un modulo rf empieza a recibir datos sin estar enviando nada, fluctua, en este caso como debo manejar las instrucciones, en rutinas separadas o manejar el HSERIN por interrupciones, otra duda que tengo es cuando se trabaja por los modulos hardware del pic ellos trabajan en segundo plano mientras uno sigue con el codigo?.
El modulo DFPLAYER MP3 trabaja por HSERIN y el modulo RF por SERIN2.

Cordial saludo y un abrazo
 
Los módulos de R.F. tienen mucho ruido en su salida y por ese motivo se tiene que usar un protocolo de codificación y decodificación.

Mira este post, tal vez te pueda servir:
PIC12F675 y módulo de R.F, no recibe datos

Hola D@rk, se me olvidaba mencionar que el puerto oscilaba sin tener el modulo conectado al puerto, utilice varios puertos y siempre pasaba lo mismo, cuando colocaba el puente en el pin y lo tocaba en la otra punta empezaba a oscilar, ahi fuen donde descarte el modulo, yo trabaje los modulos antes y no me presentaron ningun problema, claro que los use con unos pic 16f628a y ahora lo iba a implementar en el 16f887.

Otra de las causas no se si de pronto sea la protoboard en las que monte el circuito son unas wish y no se que tal sean.

Cordial saludo
 
Coloca una resistencia pull-up de 10 kΩ en el pin Rx.
No es conveniente que el microcontrolador funcione con los periféricos desconectados.

Existen algunas Protoboards que son pésimas.
Hace poco tiré una a la basura porque medía bastante resistencia de lado a lado. (Hasta 150 Ω)
 
Última edición:
Hola gente del foro, tanto tiempo jeje... bueno en estos dias estoy programando el animatronic del tutorial, pero me he encontrado con una sorpresa jeje... la cosa es que no puedo hacer funcionar un servomotor si utilizo un cristal de 20MHZ. me gustaria saber si a alguno de ustedes le ha pasado y si han podido solucionarlo, me ayuden un poquito jeje... aqui dejo un pequeño ejemplito de control de un servomotor con un pic16f876A a 20MHZ que no funciona. sin embargo, si cambio el oscilador a 4MHZ, si funciona... pero necesito que funcione a 20MHZ... :cry: saludosss :D(y)

SERVO.jpg

Código:
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off

define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = 0         'se programa el puerto A como salida' 
trisb = 0         'se programa el puerto B como salida'
trisc = 0         'se programa el puerto C como salida'
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000

'*****************************************************************

'DECLARACION DE VARIABLES
SERVO1 VAR PORTB.0
X     VAR BYTE
'***************************************************************
'****************************************************************
ACCION:
FOR X = 100 TO 200 STEP 1
PULSOUT SERVO1,X
pause 20
NEXT
FOR X = 200 TO 100 STEP-1
PULSOUT SERVO1,X
pause 20
NEXT
GOTO ACCION
END
 
Última edición:
Hola gente del foro, tanto tiempo jeje... bueno en estos dias estoy programando el animatronic del tutorial, pero me he encontrado con una sorpresa jeje... la cosa es que no puedo hacer funcionar un servomotor si utilizo un cristal de 20MHZ. me gustaria saber si a alguno de ustedes le ha pasado y si han podido solucionarlo, me ayuden un poquito jeje... aqui dejo un pequeño ejemplito de control de un servomotor con un pic16f876A a 20MHZ que no funciona. sin embargo, si cambio el oscilador a 4MHZ, si funciona... pero necesito que funcione a 20MHZ... :cry: saludosss :D(y)

Ver el archivo adjunto 155487

Código:
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off

define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = 0         'se programa el puerto A como salida' 
trisb = 0         'se programa el puerto B como salida'
trisc = 0         'se programa el puerto C como salida'
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000

'*****************************************************************

'DECLARACION DE VARIABLES
SERVO1 VAR PORTB.0
X     VAR BYTE
'***************************************************************
'****************************************************************
ACCION:
FOR X = 100 TO 200 STEP 1
PULSOUT SERVO1,X
pause 20
NEXT
FOR X = 200 TO 100 STEP-1
PULSOUT SERVO1,X
pause 20
NEXT
GOTO ACCION
END

La resolución de pulsout es dependiente del valor del cristal, o mejor dicho, del valor que le decimos en la programación. Para 4Mhz, tenemos un tiempo de 10us, en 20Mhz, el tiempo es de 2us.
En tu ejemplo, supongamos que tengamos en un momento dado los siguientes valores

X=100
PULSOUT SERVO1,X

tenemos que 100x2 = 200, o sea, 200us... Hagámoslo al revés... supongamos que queremos calcular el valor para un ancho del pulso a mandar de 1,8ms... tenemos entonces que:
1,8ms = 1800us
1800/2=900

PULSOUT SERVO1,900
 
Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.

El archivo de simulacion esta en proteus 8.5 SP0.

Ya mi proximo reto es hacerlo para variar motores a 220V AC.

Cordial saludo.

Juan Camilo Cardona
 

Adjuntos

  • Variador.rar
    28.9 KB · Visitas: 62
Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.

El archivo de simulacion esta en proteus 8.5 SP0.

Ya mi proximo reto es hacerlo para variar motores a 220V AC.

Cordial saludo.

Juan Camilo Cardona

Hola Juan, en que version de proteus lo guardaste? no lo pude abrir por el formato que tiene... Te podria molestar y pedirte que subas los esquemas (circuitos) en formato de imagen? yo te doy una mano para modificarlo y llevar a motores de 220VAC
saludos
 
Hola Juan, en que version de proteus lo guardaste? no lo pude abrir por el formato que tiene... Te podria molestar y pedirte que subas los esquemas (circuitos) en formato de imagen? yo te doy una mano para modificarlo y llevar a motores de 220VAC
saludos

Hola torres, te cuento que el archivo esta guardado en proteus 8.5 SP0, te coloco el esquemático en PDF, los archivos que me da el proteus, y los archivos PBP3.

Y muchas gracias por tu colaboración :apreton:.
 

Adjuntos

  • Variador.rar
    101.4 KB · Visitas: 48
  • VARIADOR DE VELOCIDAD Final con LCD y RS232-PRO8V.1.jpg
    VARIADOR DE VELOCIDAD Final con LCD y RS232-PRO8V.1.jpg
    160.2 KB · Visitas: 64
Atrás
Arriba